超出 ulimit 限制

超出 ulimit 限制

我执行以下命令:

ulimit -a

它给出的输出为:

core file size          (blocks, -c) 0 
data seg size           (kbytes, -d) unlimited 
scheduling priority             (-e) 0 
file size               (blocks, -f) unlimited 
pending signals              (-i) 14881 
max locked memory       (kbytes, -l) 64 
max memory size     (kbytes, -m) unlimited 
open files                      (-n) 1024 
pipe size            (512 bytes, -p) 8 
POSIX message queues     (bytes, -q) 819200 
real-time priority              (-r) 0 
stack size              (kbytes, -s) 8192 
cpu time               (seconds, -t) unlimited 
max user processes              (-u) 14881 
virtual memory          (kbytes, -v) unlimited 
file locks                      (-x) unlimited

问题是:一旦达到这个限制会发生什么?我如何知道已达到限制并且现在我需要执行一些步骤?

例如,如果 max-user-processes 达到 819200,那么是否意味着新进程将不会启动?或者系统会优雅地关闭大多数空闲进程以释放一些空间?或者可能是别的什么?

提到的数字/限制是否会增加系统性能的开销?

答案1

如果代表应用程序分配资源超出了该应用程序的资源限制,则资源分配将失败。如果“最大用户进程”值为 N,并且有 N 个进程为给定用户运行,则对fork()(或相关)系统调用的调用将失败。如果“打开文件”值为 M,并且有 M 个打开文件,则对open()(或相关)系统调用的调用将失败。

这些值不会增加系统性能的任何开销,因为系统始终监视这些值。

答案2

您包含的输出数据并不是真正的资源限制,因为您的 shell 会作弊并向此列表添加许多不相关的其他内容。

如果您想了解真正的资源限制,请使用不作弊的 shell,或检查文件

/usr/include/sys/resource.h

并查找RLIMIT_*该文件中的条目。

现在,如果达到软限制会发生什么:

  • 向进程发送一个可忽略的信号。信号是:

    SIGXCPU SIGXFSZ

如果达到硬限制,则进程将被终止。

请注意,这并不适用于所有限制。查看http://schillix.sourceforge.net/man/man2/getrlimit.2.html了解每个特定限制上发生的情况的描述。

相关内容