chpst 是否遵守 ulimit 设置?

chpst 是否遵守 ulimit 设置?

我们目前在 Linux 平台上基于 JBoss 的服务器遇到了问题 - 实际上,我们在该进程中用完了可用的文件句柄,并且服务器崩溃了。

我们已经将 ulimit 设置为允许打开 10000 个文件句柄,但当打开的文件句柄数量远远少于这个数字时,服务器就会持续崩溃。

我注意到的一件事是我们的启动脚本使用 chpst,我注意到 chpst 允许您将文件/进程/内存限制设置为参数。是否有人知道如果没有设置明确的命令,chpst 是否会遵守现有的系统 ulimit,还是会使用其自己的内部默认值?如果是,我在哪里可以找到这些?

谢谢

答案1

chpst 甚至不接受你传递的参数。源代码确实很难阅读,但 strace 确认了这一点:

execve("/usr/sbin/chpst", ["chpst", "-o", "10000", "/bin/sh", "-c", "sleep 5"], [/* 26 vars */]) = 0
...
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=4*1024}) = 0
setrlimit(RLIMIT_NOFILE, {rlim_cur=4*1024, rlim_max=4*1024}) = 0
execve("/bin/sh", ["/bin/sh", "-c", "sleep 5"], [/* 26 vars */]) = 0
...

我会避免。

答案2

无法对 Olivier Tharan 添加评论,即使这是一个老问题,我认为纠正错误的断言并不坏(特别是如果断言相对较新)。

在他的 strace 中,getrlimit 说最大硬限制是 4096,他要求 chpst 将软限制设置为 10000。chpst 照做了,但正如limits.conf 的管理,软限制不能超过硬限制,硬限制由内核和 root 用户强制执行。对此,唯一可以说的是,也许 chpst 应该打印一个警告,仅此而已。当然不是“我会避免”。

请注意,这意味着原始问题可能与 chpst 无关,而与系统配置有关。chpst 只是一个为单个进程设置任意限制的工具,它不是一个配置内核的工具。

相关内容