php-fpm cpu 高排查思路
CPU占用高:使用top命令观察到CPU用户态占用特别高,长时间70%以上。
php-fpm进程多:使用top命令观察到php-fpm进程特别多。使用wc统计到有160+个进程。
等待线程多:使用top命令观察到等待进程高达8+。
降低php-fpm进程数:通过调整php-fpm.conf配置文件中pm.max_children字段,重启php-fpm并未见明显降低CPU占用率,使用pstack跟踪进程栈
解决思路
php-fpm.conf开启慢日志,通过日志分析
error_log = /var/log/php/error.log
access.log = /var/log/php/access.$pool.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %{system}C%%"
slowlog = /var/log/php/slow.$pool.log
request_slowlog_timeout = 3s
解决思路
修改pm.max_children的数量,根据内存来进行分配,系统开一个进程20-30M。比如系统内存1G,那就将差不多能开30个进程,所以可以设置pm.max_children 为30,以此类推,然后需要重启下php-fpm服务。
设置控制php-fpm进程池进程数量。
pm.max_children:静态方式下开启的php-fpm进程数量。
pm.start_servers:动态方式下的起始php-fpm进程数量。
pm.min_spare_servers:动态方式下的最小php-fpm进程数量。
pm.max_spare_servers:动态方式下的最大php-fpm进程数量。
开启慢日志
编辑php-fpm.conf文件找到request_slowlog_timeout = 0这一行,默认值为0,表示不开启slowlog,将其值改为3s,表示跟踪执行时间达到或超过3s的脚本。找到slowlog,它的值表示慢执行日志的路径。
编辑php-fpm.conf配置文件
php_admin_value[memory_limit] = 128M(我服务器上的配置文件在/etc/php5/fpm/pool.d/www.conf 这个文件是被包含在php-fpm.conf里的) 后边的数字可以随便更改:32M,64M,128M,256M,512M,这个设置可根据你的服务器内存大小和你的需求来写,修改后要加载一下php-fpm服务。
网友评论