我有一个运行 Redhat 的 Docker 容器:
Red Hat Enterprise Linux Server release 6.2 (Santiago)
主机操作系统是 Linux Mint:
Linux Mint 19 Tara
当我在其中运行某些命令并且 Chrome 在主机上运行时,我得到:
bash-4.1# su www
su: /bin/bash: Resource temporarily unavailable
当我关闭主机上的 Chrome 时,命令按预期工作。
我的想法是,我遇到了某种资源问题,但我不确定要查找哪里——哪种资源以及问题是出在 Docker 容器上的操作系统还是主机操作系统中?
我认为它可能是打开的文件:
$ lsof | wc -l <-- With Chrome
311424
$ lsof | wc -l <-- Without Chrome
181608
但是主机上的最大文件数远高于 Chrome 运行时的打开文件数:
$ cat /proc/sys/fs/file-max
3264936
内存似乎也不是问题:
$ free -g <-- With Chrome
total used free shared buff/cache available
Mem: 31 8 5 2 17 19
Swap: 1 0 1
$ free -g <-- Without Chrome
total used free shared buff/cache available
Mem: 31 11 2 2 17 16
Swap: 1 0 1
我还应该去哪里寻找?
更新
baelx 有正确的答案,但还有一些额外的资源可能会在将来帮助其他人。
本文提供了一些有关查找每个用户正在运行的进程数量的有用信息。
$ ps h -Led -o user | sort | uniq -c | sort -n
还需要注意的是,nproc 命令与 nproc.conf 文件无关。
本文介绍了主机用户 ID 如何映射到容器用户 ID。就我而言,主机上的用户的用户 ID 为 1000。主机上的 www 用户的用户 ID 也是 1000。由于 Chrome 在用户 ID 为 1000(jbodnar)的主机上打开了 1600 多个进程,因此容器无法为用户 ID 1000(www)打开另一个进程。
答案1
您可能已经达到了系统的最大 PID 或 ulimit。您可以使用以下命令查看总共运行了多少个进程:
ps -eLf | wc -l
如果上述结果是 32,000,则将 kernel.pid_max 增加到 65,534。请注意,只有 64 位系统才支持此增加。您可以使用以下命令sysctl
实现此目的:
sysctl -w kernel.pid_max=65534
此时尝试su
再次运行该命令。如果不起作用,请查看 Chrome 的运行进程数:
ps -eLf | grep chrome | wc -l
然后,您可以尝试修改 Chrome 的 nproc 号码- 尽管这可能需要通过RHEL 6 来/etc/security/limits.conf
完成。/etc/security/limits.d/90-nproc.conf
每个文件都应使用相同的语法来描述打开的进程数量。您可以尝试将 Chrome 的值从 1024 更改为 2048(如果问题需要,可能更大)。您还可以尝试为所有用户调整此值(用星号表示):
<user> - nproc 2048 <<<----[ Only for "<user>" user ]
* - nproc 2048 <<<----[ For all user's ]
来源
(如果您在那里没有账户,我建议您去那里,因为那里有很多很好的教育和支持材料。)