当前位置:首页 > Web开发 > 正文

除了用探针之外

2024-03-31 Web开发

标签:

Web 中间件 php-fpm 配置调优

一、php-fpm.conf 主要配置参数

pm = dynamic; 暗示使用哪种进程数量打点方法

dynamic 暗示 php-fpm 进程数是动态的,最开始是 pm.start_servers 指定的数量,如果请求较多,则会自动增加,保证空闲的进程数不小于pm.min_spare_servers,如 果进程数较多,也会进行相应清理,保证多余的进程数不久不多于 pm.max_spare_servers; static 暗示 php-fpm 进程数是静态的,进程数自始至终都是 pm.max_children 指定的数量,不再增加或减少。

pm.max_children = 300; 静态方法下开启的php-fpm进程数量

pm.start_servers = 20; 动态方法下的起始php-fpm进程数量

pm.min_spare_servers = 5; 动态方法下的最小php-fpm进程数量

pm.max_spare_servers = 35; 动态方法下的最大php-fpm进程数量

注意:数值设置,参考本身的实际硬件配置,可以参考 总内存/30M 来计算。

如果 pm 设置为 static,那么其实只有 pm.max_children 这个参数生效。系统会开启设置数量的 php-fpm 进程。

如果 pm设置为 dynamic,那么 pm.max_children 参数掉效,后面3个参数生效。系统会在 php-fpm 运行开始的时候启动 pm.start_servers 个 php-fpm 进程,然后按照系统的需求动态在 pm.min_spare_servers 和 pm.max_spare_servers 之间调解 php-fpm 进程数。

1、pm 方法选择

事实上,跟 Apache 一样,运行的 PHP 措施在执行完成后,或多或少会有内存泄露的问题。这也是为什么开始的时候一个 php-fpm 进程只占用 3M 摆布内存,运行一段时间后就会上升到 20-30M 的原因了。

对付内存大的处事器(好比8G以上)来说,用静态的 max_children 实际上更为安妥,因为这样不需要进行特别的进程数目控制,会提高效率。因为频繁开关 php-fpm 进程也会有时滞,所以内存够大的情况下开静态效果会更好。数量也可以按照 总内存/30M 得到,好比 8GB 内存可以设置为100,那么 php-fpm 耗费的内存就能控制在 2G-3G 的样子。

如果内存稍微小点,好比 1~2G,那么指定动态的进程数量越发有利于处事器的不变。这样可以保证 php-fpm 只获取够用的内存,将不久不多的内存分配给其他应用去使用,会使系统的运行越发畅通流畅。

对付小内存的处事器来说,好比 256M 内存的 VPS,即使凭据一个 20M 的内存量来算,10个 php-cgi 进程就将耗失200M内存,那系统的瓦解就应该很正常了。

因此应该尽量地控制 php-fpm 进程的数量,梗概明确其他应用占用的内存后,给它指定一个静态的小数量,会让系统越发平稳一些。

或者使用动态方法,因为动态方法会结束失多余的进程,可以回收释放一些内存,所以保举在内存较少的处事器或VPS上使用,具体最大数量按照 总内存/20M 得到。

好比说 512M 的 VPS,建议 pm.max_spare_servers 设置为 20。至于 pm.min_spare_servers,则建议按照处事器的负载情况来设置,对照合适的值在 5~10 之间。

总结:内存小的建议用动态(pm = dynamic),内存大的建议用静态(pm = static)。

2、pm.max_children 设置多大

这个值原则上是越大越好,php-cgi的进程多了就会措置惩罚惩罚的很快,排队的请求就会很少。

设置”max_children” 也需要按照处事器的性能进行设定。

计算方法如下:

一般来说一台处事器正常情况下每一个php-cgi所耗费的内存在20M~30M摆布,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存2Gb。

而如果我 的”max_children”设置的较小,好比5-10个,那么php-cgi就会“很累“,措置惩罚惩罚速度也很慢,期待的时间也较长,占用的CPU也很高。

如果永劫间没有得处措置惩罚惩罚的请求就会呈现 504 Gateway Time-out 这个错误,而正在措置惩罚惩罚的很累的那几个php-cgi如果遇到了问题就会呈现 502 Bad gateway 这个错误。

max_children较好的设置方法按照req/s(吞吐率,单位时间里处事器措置惩罚惩罚的最大请求数,单位req/s)来设置,若措施是 100 req/s 的措置惩罚惩罚能力,那么就设置 100对照好,这是动态来调解的。

3、request_terminate_timeout 设置多大

计算方法如下:

如果你的处事器性能足够好,且宽带资源足够充沛,PHP脚本没有循环或BUG的话你可以直接将”request_terminate_timeout”设 置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。

而如果你做不到这一点,也就是说你的PHP-CGI可能呈现某个BUG,或者你的宽带不够充沛或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根 据你处事器的性能进行设定。

一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的处事器PHP脚本需要永劫间运行,有的可能会赶过10分钟因此我设置了900秒,这样不会导致PHP-CGI死失而呈现502 Bad gateway这个错误。

二、配置 php 慢日志,用于监控

1、开启slow log要领

如果你使用php-fpm来打点php的话,你可以通过如下要领开启:

首先打开 php-fpm.conf 配置文件。

vim /usr/local/php/etc/php-fpm.conf

PHP 5.3.3 之前设置如下:

<value>5s</value> < value>logs/php-fpm-slowlog.log</value>

PHP 5.3.3 之后设置以下如下:

request_slowlog_timeout = 5s slowlog = /usr/local/php/var/log/php-fpm-slowlog.log request_terminate_timeout = 10s

说明:

request_slowlog_timeout 是脚本赶过多永劫间,就可以记录到日志文件;

slowlog 是日志文件的存储路径;

request_terminate_timeout 将执行时间太长的进程直接终止;

2、slow log使用

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/29942.html