我有一个长时间运行的进程达到了资源限制,例如打开文件的最大数量。
我不想杀了它。
通常,你会这样做:
(stop service)
ulimit -n <new limit>
(start service)
Run Code Online (Sandbox Code Playgroud)
有没有办法避免停止和启动服务并增加限制?
我已经弄清楚了。
在某些内核(例如 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
Run Code Online (Sandbox Code Playgroud)
要将最大打开文件数更改为软限制 4096、硬限制 8192:
echo -n "Max open files=4096:8192" > /proc/23052/limits
Run Code Online (Sandbox Code Playgroud)
这给出:
$ grep "open files" /proc/23052/limits
Limit Soft Limit Hard Limit Units
Max open files 4096 8192 files
Run Code Online (Sandbox Code Playgroud)
请注意-nin 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
Run Code Online (Sandbox Code Playgroud)
设置限制:
$ prlimit --nofile=4096:8192 --pid 23052
Run Code Online (Sandbox Code Playgroud)
确认:
$ prlimit --nofile --output RESOURCE,SOFT,HARD --pid 23052RESOURCE SOFT HARD
NOFILE 4096 8192
Run Code Online (Sandbox Code Playgroud)
$ grep "open files" /proc/23052/limits
Limit Soft Limit Hard Limit Units
Max open files 4096 8192 files
Run Code Online (Sandbox Code Playgroud)