系统上线半年多,最近频繁出现 504 Gateway Time-out,重启php-fpm问题暂时解决。所以写此文章记录调优过程。
Tip
根据情况可以分析,问题主要出在php-fpm上,各种谷歌后,找到部分推荐配置,解决php-fpm卡顿或崩溃的方法。
第一步,查看服务器硬件配置,对症下药。
1.查看cpu信息
cat /proc/cpuinfo
2.查看内存(主要)
cat /proc/meminfo
或
free
total:总内存3.7G
used:已用内存360M
free:系统预留
available:可用内存 3.2G(得到这个值,就知道后面的maxchild如何设置了)
知道这几个就可以了。
第二步:开始修改环境配置
- max_children
;摘自,php-fpm.conf 。默认值
pm = dynamic
; The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
; This value sets the limit on the number of simultaneous requests that will be
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
; CGI. The below defaults are based on a server without much resources. Don't
; forget to tweak pm.* to fit your needs.
; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
; Note: This value is mandatory.
pm.max_children = 5
默认最大cgi 数量为5,为了节约资源
dynamic 和 static 该如何选择?
- static(静态) :表示在fpm运行时直接fork出pm.max_chindren个worker进程
- dynamic(动态):表示运行时fork出start_servers个进程,随着负载的情况,动态的调整,最多不超过max_children个进程
由于我们公司服务器只跑php,所以不用考虑内存占用影响其他业务效率额问题,所以选择static,静态分配,提升效率。
tip:一般推荐用static,优点是不用动态的判断负载情况,提升性能,缺点是多占用些系统内存资源
- max_children这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。
设置”max_children”也需要根据服务器的性能进行设定,这是为什么要查看系统空闲内存。
- 一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右假设“max_children”设置成100个,20M*100=2000M也就是说在峰值的时候所有PHP-CGI所耗内存在2000M以内。
假设“max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。
最终设置
pm = static
max_children = 150
;150*20M=3G 内存左右,空闲3.2。