环境:
我使用 CentOS-7 作为管理程序在libvirt
. 每个容器都运行 CentOS-7 的最小安装,并减少了 FreePBX(Asterisk、Apache、MySQL + 位)。
症状:
有 16 个容器运行没有任何问题。当我再启动一个时它确实启动了,但在第 17 个容器启动后我无法systemctl start/restart/stop <anything>
在任何容器中执行:
[root@test-lxc ~]# systemctl restart dnsmasq
Error: Too many open files
诊断:
systemctl restart blabla
当第 17 个 LXC 正在运行并且出现故障时,将完成以下诊断和计数:
我可以通过 ssh 进入任何 LXC 并运行最基本的命令,例如 ls 等。我怀疑这个限制在某种程度上只影响了systemd
.
我试图了解我在哪里/为什么达到极限。
[root@lxc-hypervisor]# sysctl fs.file-nr
fs.file-nr = 29616 0 12988463
那没有被调整,这正是默认安装发生的事情。与上述最大(最后)值相同 = 12988463 由管理程序报告,也在每个 LXC 内部报告。每个 LXC 中也报告了非常相似的第一个值,略低于 30000。
当我尝试计算每个 LXC 内所有进程的文件描述符时,我在每个 LXC 中得到的顺序为 400 ~ 500。
for pid in $( ls /proc/ | grep -E -e "^[0-9][0-9]*\$" ); do
ls -l /proc/${pid}/fd/ 2> /dev/null | wc -l
done
如果没有管理程序本身,总和约为 9000 (9k)。当我在管理程序上运行它时,我通常会得到可疑的接近值,刚好超过 10000,例如 10005。
问题:
Q1。限制设置或继承自哪里?
Q2。为什么这个限制会影响systemctl start/stop/restart blah
命令,但我仍然可以通过 ssh 进入 LXC,运行命令,例如带有循环的 bash 脚本,尽管是 root 用户。
Q3. 如何调整限制以允许运行更多 LXC。据我所知,RAM 和其他资源不是限制。
我确实阅读了很多关于文件描述符限制主题的文章和答案,但我没有看到我的系统在哪里达到了限制。
也欢迎任何其他相关信息。
我相信您没有达到全局限制,而是inotify限制。这会在运行systemd 的容器上看到,因为systemd使用inotify工具进行簿记,但主机也会受到影响。不使用systemd(或inotify)的容器可能不受影响。
如果仅使用非无根(即:容器中的根是真正的根)容器,则根用户将成为瓶颈。让多个容器使用相同的无根用户映射也会为此容器的根用户造成这种瓶颈(但不会影响主机)。默认值为 128,对于容器使用来说太少了。
CentOS7(或 Rocky9)不包括 LXC 的任何默认设置。基于 Debian 的发行版在主机上包含此文件:
/etc/sysctl.d/30-lxc-inotify.conf
:所以你应该通过在主机上创建这个文件来做同样的事情。立即生效(在主机上):