我有一个长时间运行的进程达到了资源限制,例如打开文件的最大数量。
我不想杀了它。
通常,你会这样做:
(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
注意-n
在echo -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