nginx之php-fpm优化

先来看一段日志(此日志来自于 var/log/php-fpm.log ):

[13-Aug-2017 03:30:03] NOTICE: fpm is running, pid 28263
[13-Aug-2017 03:30:03] NOTICE: ready to handle connections
[13-Aug-2017 10:11:04] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 7 total children
[13-Aug-2017 10:11:05] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 0 idle, and 8 total children
[13-Aug-2017 10:11:06] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 9 total children
[13-Aug-2017 10:11:07] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 10 total children
[13-Aug-2017 10:11:08] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 11 total children
[13-Aug-2017 10:11:09] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 12 total children
[13-Aug-2017 10:11:10] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 13 total children
[13-Aug-2017 10:11:11] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 14 total children

一、首先分析验证问题:

1.报警级别“WARNING”,也就是说业务受到的影响比较小,实际验证也是这样;

2.php-fpm的进程数比较少,建议增加 pm.start_servers, or pm.min/max_spare_servers

3.增加到多少呢?spawning 8,也就是说至少得8个进程。

1.2 查询一个php占用的内存方法:

pmap $(pgrep php-fpm | head -1)

二、php-fpm的配置公式:

pm.start_servers = min_spare_servers + (max_spare_servers - min_spare_servers) / 2

三、php-fpm优化方法:

php-fpm存在两种方式,一种是直接开启指定数量的php-fpm进程,不再增加或者减少—静态; 另一种则是开始时开启一定数量的php-fpm进程,当请求量变大时,动态的增加php-fpm进程数到上限,当空闲时自动释放空闲的进程数到一个下限—动态。 这两种不同的执行方式,可以根据服务器的实际需求来进行调整。

要用到的一些参数,分别是pm、pm.max_children、pm.start_servers、pm.min_spare_servers和pm.max_spare_servers。

pm表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。

3.1 下面4个参数的意思分别为:

pm.max_children:静态方式下开启的php-fpm进程数量;在动态方式下他限定php-fpm的最大进程数(这里要注意pm.max_spare_servers的值只能小于等于pm.max_children) pm.start_servers:动态方式下的起始php-fpm进程数量。 pm.min_spare_servers:动态方式空闲状态下的最小php-fpm进程数量。 pm.max_spare_servers:动态方式空闲状态下的最大php-fpm进程数量。

如果dm设置为static,那么其实只有pm.max_children这个参数生效。系统会开启设置的数量个php-fpm进程,始终保持一个固定数量的子进程,这个数由pm.max_children定义,这种方式很不灵活,也通常不是默认的。

如果dm设置为dynamic,4个参数都生效。系统会在php-fpm运行开始时启动pm.start_servers个php-fpm进程,他是这样的,启动时,会产生固定数量的子进程(由pm.start_servers控制)可以理解成最小子进程数,而最大子进程数则由pm.max_children去控制,OK,这样的话,子进程数会在最大和最小数范围中变化,还没有完,闲置的子进程数还可以由另2个配置控制,分别是pm.min_spare_serverspm.max_spare_servers,也就是闲置的子进程也可以有最小和最大的数目,而如果闲置的子进程超出了pm.max_spare_servers,则会被杀掉。

可以看到,pm = dynamic模式非常灵活,也通常是默认的选项。但是,dynamic模式为了最大化地优化服务器响应,会造成更多内存使用,因为这种模式只会杀掉超出最大闲置进程数(pm.max_spare_servers)的闲置进程,比如最大闲置进程数是30,最大进程数是50,然后网站经历了一次访问高峰,此时50个进程全部忙碌,0个闲置进程数,接着过了高峰期,可能没有一个请求,于是会有50个闲置进程,但是此时php-fpm只会杀掉20个子进程,始终剩下30个进程继续作为闲置进程来等待请求,这可能就是为什么过了高峰期后即便请求数大量减少服务器内存使用却也没有大量减少,也可能是为什么有些时候重启下服务器情况就会好很多,因为重启后,php-fpm的子进程数会变成最小闲置进程数,而不是之前的最大闲置进程数。

第三种就是pm = ondemand模式,这种模式和pm = dynamic相反,把内存放在第一位,他的工作模式很简单,每个闲置进程,在持续闲置了pm.process_idle_timeout秒后就会被杀掉,有了这个模式,到了服务器低峰期内存自然会降下来,如果服务器长时间没有请求,就只会有一个php-fpm主进程,当然弊端是,遇到高峰期或者如果pm.process_idle_timeout的值太短的话,无法避免服务器频繁创建进程的问题,因此pm = dynamicpm = ondemand谁更适合视实际情况而定。

那么,对于服务器,选择哪种执行方式比较好呢?事实上,跟Apache一样,运行的PHP程序在执行完成后,或多或少会有内存泄露的问题。这也是为什么开始时一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到25-40M的原因了。

所以,动态方式因为会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或者VPS上使用。具体最大数量根据 内存/25 得到。 比如说512M的VPS,建议pm.max_spare_servers设置为20(512*0.8/20)。至于pm.min_spare_servers,则建议根据服务器的负载情况来设置,比较合适的值在5~10之间。

然后对于比较大内存的服务器来说,设置为静态的话会提高效率。 因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。数量也可以根据 内存/30M 得到。 比如说2GB内存的服务器,可以设置为50;4GB内存可以设置为100等。

比如,我的1024M的腾讯云,设置的参数如下:

pm = dynamic
pm.max_children = 35
pm.start_servers = 8
pm.min_spare_servers = 8
pm.max_spare_servers = 35

可以最大的节省内存并提高执行效率。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张戈的专栏

WordPress评论ajax动态加载,解决静态缓存下评论不更新问题

这是一个历史遗留问题,自从博客部署了 PHP 纯静态缓存之后,所有页面都是 html 静态内容了,而且在七牛 CDN 静态分离之后,速度更是达到极致! ? 不过...

3996
来自专栏云飞学编程

python爬虫零基础入门——反爬的简单说明

之前在《如何开始写你的第一个python脚本——简单爬虫入门!》中给大家分享了一下写一个爬虫脚本的基本步骤,今天继续分享给大家在初期遇到的一个很烦人的问题——反...

993
来自专栏Android开发实战

HTTP1.0、HTTP1.1和HTTP2.0的区别

早在HTTP建立之初,主要就是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。也是说对于前端来说,我们所写的HTML页面将要放在我们的w...

2153
来自专栏性能与架构

Redis 4.0 新特性

简介 Redis 4.0 即将发布,这是个很重要的版本,变动比较大,下面看几个重要的新特性。 推出模块系统 通过模块系统,我们可以对Redis进行自定义扩展,实...

4258
来自专栏信安之路

绕过内容安全策略总结

今年的 0CTF 预选赛 6 道 web 题,其中三道都涉及 CSP 的知识点,简直可怕。。。这次趁着空闲时间就稍稍总结一下 CSP 绕过方面的知识,无论是对以...

2390
来自专栏喵了个咪的博客空间

[PhalApi实战篇(1)]Redis队列处理异步任务

[PhalApi实战篇(1)]Redis队列处理异步任务 ? 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. ...

4024
来自专栏desperate633

深入理解--异步和非阻塞同步和阻塞异步和非阻塞

异步和非阻塞的概念实际上已经出现了很长一段时间。但是异步真正开始流行起来,是因为AJAX技术逐渐成为主流的web开发技术。非阻塞的概念真正流行起来,是当java...

944
来自专栏机器学习算法与Python学习

Python:爬虫系列笔记(2) -- 基本了解及urllib的使用

1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓...

3616
来自专栏SDNLAB

OpenStack Neutron之持续测试

一.OpenStack持续测试概述 众所周知,OpenStack作为一个特大型软件开发项目,有着数千人的开发人员,每天要处理千计提交的代码,几千条Gerrit评...

47911
来自专栏JAVA高级架构

阿里面试题(一)

1302

扫码关注云+社区

领取腾讯云代金券