了解 ulimit -u

了解 ulimit -u

我想了解这里发生了什么。

linvx$ ( ulimit -u 123; /bin/echo nst )
nst

linvx$ ( ulimit -u 122; /bin/echo nst )
-bash: fork: Resource temporarily unavailable
Terminated

linvx$ ( ulimit -u 123; /bin/echo one; /bin/echo two; /bin/echo three )
one
two
three

linvx$ ( ulimit -u 123; /bin/echo one & /bin/echo two & /bin/echo three )
-bash: fork: Resource temporarily unavailable
Terminated
one

我推测前 122 个进程由 Bash 本身使用,其余进程ulimit决定允许我拥有的并发进程数。文档对此不太清楚。我遗漏了什么吗?

更重要的是,对于实际部署,我如何知道哪种部署ulimit是现实的?这是一个长期运行的守护进程,它会根据需要生成工作线程,并在负载减少时收获它们。我已经让它让服务器死机几次了。最重要的限制可能是内存,我现在已将每个进程的内存限制为 200M,但我想弄清楚如何强制限制子进程的数量(该程序确实允许我配置最大值,但我怎么知道代码的这一部分没有错误?)


附录:在较新的系统上,我得到了更高的数字和略有不同的行为。

xubuntu12.04$ ( ulimit -u 206; /bin/echo nst )
nst

xubuntu12.04$ ( ulimit -u 205; /bin/echo nst )
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: Resource temporarily unavailable
Terminated

xubuntu12.04$ bash --version
GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

我相信旧系统有 Bash v3。

在 中dash,我得到了不同的行为,尽管仍然不是我期望的行为(并且调用了选项-p而不是-u):

xubuntu12.04$ dash

$ ( ulimit -p 1; /bin/echo nst )
nst

$ ( ulimit -p 2; /bin/echo nst & /bin/echo too & )
dash: 0: Cannot fork

$ ( ulimit -p 208; /bin/echo nst & /bin/echo too & )
dash: 0: Cannot fork
nst

$ ( ulimit -p 209; /bin/echo nst & /bin/echo too & )
nst
too

答案1

不仅子 shell 中的子进程会计入限制,而且系统上您的 uid 下的所有内容也会计入限制。

因此,如果您在系统上的任何地方以您自己的身份运行了 200 个进程,那么进程ulimit -u 205将只能分叉,直到总数达到 205 — — 也就是五次(如果没有任何进程存在)。

答案2

这是 ulimit 的工作方式。

如果你想允许一个用户运行 4 个进程,

您将有 1+4 (一个用于用户当前正在使用的 bash 进程)

根据我的测试,

创建用户测试,

ran ulimit -u 1

无法运行任何命令,因为 bash 已经是一个正在运行的进程,

ran ulimit -u 2

只能运行一个进程,例如,

ps aux -> returned value but ps aux | grep test -> did not return as it's using 2 processes

最后,不建议在您的 root 帐户上使用 ulimit,ulimit 主要用于大型多用户环境。

我希望这有帮助!

干杯,

===============

 -a     All current limits are reported
 -b     The maximum socket buffer size
 -c     The maximum size of core files created
 -d     The maximum size of a process’s data segment
 -e     The maximum scheduling priority ("nice")
 -f     The maximum size of files written by the shell and its children
 -i     The maximum number of pending signals
 -l     The maximum size that may be locked into memory
 -m     The maximum resident set size (many systems do not honor this limit)
 -n     The maximum number of open file descriptors (most systems do not allow  this
                     value to be set)
 -p     The pipe size in 512-byte blocks (this may not be set)
 -q     The maximum number of bytes in POSIX message queues
 -r     The maximum real-time scheduling priority
 -s     The maximum stack size
 -t     The maximum amount of cpu time in seconds
 -u     The maximum number of processes available to a single user
 -v     The maximum amount of virtual memory available to the shell
 -x     The maximum number of file locks
 -T     The maximum number of threads

相关内容