服务器上有多个用户运行多个程序,其中一些程序似乎运行不正常并且会耗尽 RAM,就像没有明天一样,例如:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30091 xxxx 20 0 2194m 1.4g 1.4g S 21 9.0 0:56.03 aaaaa
30212 xxxx 20 0 1460m 1.1g 1.1g D 5 6.9 0:44.12 aaaaa
我们设置了文件系统配额,除此之外我什么都不知道。我希望能够限制 VIRT RES SHR(也许只限制 1 个就会限制其他 2 个?)。这可能吗?
我也想在命令终止之前限制 CPU 时间(实际上该命令是由另一个脚本调用的,我假设父脚本不会被终止?)。
我看过 limits.conf 和 PAM 的东西,但不确定最好的方法是什么,以及如何测试。
答案1
你想要setrlimit(RLIMIT_AS, ...)
。从手册页(setrlimit
(2)):
RLIMIT_AS
进程虚拟内存(地址空间)的最大大小(以字节为单位)。此限制会影响对 brk(2)、mmap(2) 和 mremap(2) 的调用,如果超出此限制,这些调用将失败并出现错误 ENOMEM。此外,自动堆栈扩展也将失败(并且如果未通过 sigaltstack(2) 提供备用堆栈,则生成 SIGSEGV 来终止进程)。由于该值是 long,因此在具有 32 位 long 的机器上,此限制最多为 2 GiB,或者此资源是无限的。