最近页面出现“500 Internal Server Error”错误,在 PHP-FPM 错误日志中看到一条记录:
server reached max_children setting (10), consider raising it
研究了一下,解决的办法很简单,需要提高 pm.max_children
的值,我使用的是 Plesk,可以在 PHP 设置里直接修改,那这个值要修改成多少才合适呢?
一般确定 max_children 的值要根据内存大小和每个 PHP-FPM 进程占用的内存来确定,如果你有 4G 内存,留一半给数据库和其他应用的开销,我们给 PHP-FPM 分配 2G 内存。下面语句可以获取每个 PHP-FPM 进程平均占用内存大小:
ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'
假如评价每个 PHP-FPM 占用 50M,那就可以把 pm.max_children
的值设置为 40。
如果想更详细了解每个 PHP-FPM 进程占用内存的大小,可以使用以下命令查看:
ps -ylC php-fpm --sort:rss
RSS 列显示的就是每个 PHP-FPM 进程占用内存的大小,单位是 KB。
如果你的 Plesk 托管了多个网站,可能不止一个网站出现这个问题,可以用以下命令查看有多少个域名出现错误日志:
grep -r "服务器已达到 max_children 设置" /var/log/*php*-fpm/error.log | cut -d' ' -f5 | tr -d ']' | sort | uniq -c | sort -nr
扩展阅读
Plesk 论坛:AH01071: Got error ‘Unable to open primary script: ( Too many open files )