php-pm进程管理的优化

最近几天社区的服务器有点不稳定,于是就对服务器进行了优化,了解了一些php的优化知识。 以前是对Java环境优化有一点了解,对php的优化了解甚少,都是边学边做,现在总结一下,其它的优化就不总结了。 php-fpm是一个PHP FastCGI管理器,其实属于php的一个补丁,不用php-fpm的后果就是你的php请求会非常的慢,慢到无法忍受。 在php-fpm的配置文件中,有一组参数对进程管理起着很关键的作用,那就是pm(process manager)相关。 pm参数指定了进程管理方式,有两种可供选择:static或dynamic,从字面意思不难理解,为静态或动态方式。如果是静态方式,那么在php-fpm启动的时候就创建了指定数目的进程,在运行过程中不会再有变化(并不是真的就永远不变,下文有解释);而动态的则在运行过程中动态调整,当然并不是无限制的创建新进程,有一些参数配置决定了创建规则。 这几个参数分别是:

pm.max_children:static模式下创建的子进程数或dynamic模式下同一时刻允许最大的php-fpm子进程数量。
pm.max_requests:php-fpm子进程能处理的最大请求数。
pm.start_servers:动态方式下的起始php-fpm进程数量。
pm.min_spare_servers:动态方式下服务器空闲时最小php-fpm进程数量。
pm.max_spare_servers:动态方式下服务器空闲时最大php-fpm进程数量。

  从配置文件中对几个参数的说明中可以看出,后面三个参数只对动态方式的pm起作用。一般认为static方式服务器的性能会好一点,不然频繁创建回收进程对服务器资源也是一种消耗。 那么对于一般的服务器,怎么设置这些值呢,也是有值可参考的。 一般一个php-cgi进程占用2030m左右的内存,php-fpm稍多一点,就按30m算吧。你的物理mem大小/30m差不多就是可以设置的php-fpm进程数了,当然实际肯定要比这个少点。比如我8G的内存,大概设置100200之间,也就是pm.max_children=100 是一个比较合适的值。 这里面还有一个问题,php-fpm因为一些第三方库可能会引起内存泄漏,时间长了,占用的内存会比较多,像我们的服务器现在就是50m左右,还好,有pm.max_requests这个参数,这个参数指定了一个php-fpm子进程执行多少次之后重启该进程。这个可能就要根据你的实际情况调整了,我的pm.max_requests=500.