以下为32G内存服务器php-fpm配置:
[global] pid = /usr/local/php/var/run/php-fpm.pid error_log = /home/www/wwwlogs/php-fpm.log log_level = notice [www] listen = /tmp/php-cgi.sock listen.backlog = -1 listen.allowed_clients = 127.0.0.1 listen.owner = www listen.group = www listen.mode = 0666 user = www group = www pm = dynamic pm.max_children = 80 #最大子进程数 pm.start_servers = 40 #dynamic启动时的进程数量 pm.min_spare_servers = 40 #保证空闲进程的最小数,低于此数值会创建 pm.max_spare_servers = 80 #保证空闲进程的最大数,高于此数值会杀死 pm.max_requests = 1024 pm.process_idle_timeout = 10s #空闲进程超时时间 request_terminate_timeout = 100 request_slowlog_timeout = 0 #当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 '0' 表示 'Off'
slowlog= var/log/slow.log #php-fpm慢日志位置
参数解释:
pm = xxx,
指定进程管理方式,有3种可供选择:static、dynamic和ondemand。
三种参数的区别:
pm = static,始终保持一个固定数量的子进程,这个数由pm.max_children定义,这种方式很不灵活,也通常不是默认的。
pm = dynamic,启动时会产生固定数量的子进程(由pm.start_servers控制)可以理解成最小子进程数,而最大子进程数则由pm.max_children去控制,子进程数会在最大和最小数范围中变化。闲置的子进程数还可以由另2个配置控制,分别是pm.min_spare_servers和pm.max_spare_servers。如果闲置的子进程超出了pm.max_spare_servers,则会被杀掉。小于pm.min_spare_servers则会启动进程(注意,pm.max_spare_servers应小于pm.max_children)。
pm = ondemand,这种模式和pm = dynamic相反,把内存放在第一位,每个闲置进程在持续闲置了pm.process_idle_timeout秒后就会被杀掉,如果服务器长时间没有请求,就只会有一个php-fpm主进程。弊端是遇到高峰期或者如果pm.process_idle_timeout的值太短的话,容易出现504 Gateway Time-out错误,因此pm = dynamic和pm = ondemand谁更适合视实际情况而定。
pm.max_requests = 1024,设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为0,则一直接受请求,最终导致内存不足,网站不能访问,如下图所示:prequest_terminate_timeout = 100,设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的'max_execution_time'因为某些特殊原因没有中止运行的脚本有用。设置为 '0' 表示 'Off'.当经常出现502错误时可以尝试更改此选项。
常用命令:
查看每个PHP-FPM进程的内存占用:ps -ylC php-fpm --sort:rss 查看消耗内存最多的前 40 个进程:ps auxw|head -1;ps auxw|sort -rn -k4|head -40 查看PHP-FPM的平均内存占用:ps –no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s ", sum/NR/1024,"M") }'