我执行以下命令:
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了解每个特定限制上发生的情况的描述。