Есть проблема, с которой я сталкиваюсь, что при известном трафике (например, при достижении 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
курок.
Сервер не достигает 10% загрузки ЦП, и большая часть оперативной памяти свободна. Как я могу избежать такого количества открытых файлов или, если это невозможно, что следует делать и исследовать в этой ситуации?
Больше информации:
$ 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