我正在处理一个问题,在已知流量(例如达到 300 个并发用户)下,服务器由于 而无法处理更多传入请求open files
。这是当前的限制:
$ cat /etc/security/limits.conf
* - nofile 1000000
php-fpm
error.log 文件中出现了错误:
[16-Aug-2019 02:14:12] WARNING: [pool ****] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 99 idle, and 506 total children
[16-Aug-2019 02:14:12] ERROR: failed to prepare the stderr pipe: Too many open files (24)
此时nginx
以499
状态代码进行响应。
我可以看到,当没有发出任何请求时,mysqld
打开的文件数为以下数量(默认数量?):
$ lsof | grep '^mysqld' | wc -l
104104
当负载达到一定程度时,它会上升到一个数字603035
,然后触发那些错误php-fpm
。
服务器的 CPU 负载未达到 10%,并且大多数 RAM 都是空闲的。我该如何避免打开这么多文件,或者如果不可能,在这种情况下应该做什么和调查什么?
更多信息:
$ 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) 385941
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1000000
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) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited