更改正在运行的进程的资源限制(ulimit / rlimit)

更改正在运行的进程的资源限制(ulimit / rlimit)

我有一个长时间运行的进程达到了资源限制,例如打开文件的最大数量。

我不想杀了它。

通常,你会这样做:

(stop service)
ulimit -n <new limit>
(start service)

有没有办法避免停止和启动服务并增加限制?

答案1

我已经弄清楚了。

在某些内核(例如 2.6.32+)上,至少在 CentOS/RHEL 上,您可以使用更改正在运行的进程的资源限制/proc/<pid>/limits,例如:

$ grep "open files" /proc/23052/limits
Limit                     Soft Limit           Hard Limit           Units     
Max open files            1024                 4096                 files     

要将最大打开文件数更改为软限制 4096、硬限制 8192:

echo -n "Max open files=4096:8192" > /proc/23052/limits

这给出:

$ grep "open files" /proc/23052/limits
Limit                     Soft Limit           Hard Limit           Units     
Max open files            4096                 8192                 files

注意-necho -n- 没有这个,你会得到一个“ invalid argument”错误。

上面的方法并不总是有效,所以

另一种选择是prlimit引入的命令util-linux 2.21允许您读取和更改正在运行的进程的限制。

这是 writable 的后续版本/proc/<pid>/limits,它没有集成到主线内核中。这个解决方案应该有效。

$ prlimit  --nofile --output RESOURCE,SOFT,HARD --pid 23052
RESOURCE SOFT HARD
NOFILE   1024 4096

设置限制:

$ prlimit --nofile=4096:8192 --pid 23052

确认:

$ prlimit  --nofile --output RESOURCE,SOFT,HARD --pid 23052RESOURCE SOFT HARD
NOFILE   4096 8192
$ grep "open files" /proc/23052/limits
Limit                     Soft Limit           Hard Limit           Units     
Max open files            4096                 8192                 files     

相关内容