环境:
我使用 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 和其他资源不是限制。
我确实阅读了很多关于文件描述符限制主题的文章和答案,但我没有看到我的系统在哪里达到了限制。
也欢迎任何其他相关信息。