![为什么 ulimit -u 远远大于我正在运行的进程数会导致问题?](https://linux22.com/image/93763/%E4%B8%BA%E4%BB%80%E4%B9%88%20ulimit%20-u%20%E8%BF%9C%E8%BF%9C%E5%A4%A7%E4%BA%8E%E6%88%91%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84%E8%BF%9B%E7%A8%8B%E6%95%B0%E4%BC%9A%E5%AF%BC%E8%87%B4%E9%97%AE%E9%A2%98%EF%BC%9F.png)
我正在运行 200 个进程,但ulimit -u
400 个进程似乎会导致一些问题:
$ ps -A | wc -l
199
$ ulimit -u 400
zsh: fork failed: resource temporarily unavailable
我很困惑。为什么会达到极限?
编辑: 最初ulimit -u
给出
$ ulimit -u
47334
答案1
在 Linux 上线程计入计数ulimit -u
,但它们通常不会显示为ps -A
。您需要添加L
标志。
例如在我的机器上:
% ps -A | wc -l
124
% ps -AL | wc -l
155
我们可以看到还有 31 个进程正在运行;这些是线程,通常隐藏在视图之外。
使用 java 和其他高度线程的应用程序,可以轻松运行比您想象的更多的线程/进程。你的ulimit -u
价值需要考虑到这一点。
这可能会意外地影响到在 RedHat 系统上运行大量 Java 应用程序的人,默认情况下,它带有以下ulimit
设置:
% cat /etc/security/limits.d/20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 4096
root soft nproc unlimited