我们有一个 ruby 应用程序开始抛出很多“无法创建新套接字:打开文件太多”错误,最近我更新了“etc/security/limits.conf”,如下所示
root soft nofile 6553600
root hard nofile 6553600
nobody soft nofile 655360
nobody soft nofile 655360
mysql hard nofile 655360
mysql hard nofile 655360
* soft nofile 81920
* hard nofile 65000
* - nofile 102400
fs.file-max = 90000
也在/etc/sysctl.conf 中更新
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) 62459
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 10240
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) 62459
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
ulimit-n
10240
但 ruby 进程的打开文件限制仍然是 1024
cat /proc/13765/limits (pid of ruby app)
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 62459 62459 processes
Max open files 1024 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 62459 62459 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
ruby 进程正在使用超过 1024 个文件
lsof -p 13765 | wc -l
1070
如何增加此 ruby 进程/应用程序的“最大打开文件”值?
答案1
我已更新
/etc/security/limits.conf
如下
这是由pam_limits.so,因此它仅对通过 PAM 的任何内容生效,例如用户登录。
更新
/etc/sysctl.conf
这可能会被某些启动脚本读取,因此更改仅在重新启动后生效...(我的 Debian 上有systemd-sysctl.service
一个旧式脚本。)/etc/init.d/procps
关键是,这些文件都不会立即读取,并且 ulimit 的更改永远不会应用于正在运行的进程。
如何增加此 ruby 进程/应用程序的“最大打开文件”值?
找出启动它的内容,更改那里的 ulimit,然后重新启动该进程。如果您从命令行启动它,更改 shell 上的限制并重新启动它应该可以,如果您从 init/systemd/whatever 运行它,那么您可能需要找到正确的配置。