何久 發表於 2020-8-3 09:29:00

设置PHP最大连接数及php-fpm 高并发 参数调整

<p>服务器中找到php-fpm.conf配置(有的会在引入的www.conf中)</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice


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 = static
pm.max_children = 200
pm.start_servers = 40
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests=1000
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log
</pre>
</div>
<p>  </p>
<p>---------------------------------------------------------------------------</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">pm.max_children=30
pm.max_requests=500
pm.start_servers=4
pm.max_spare_servers=30
</pre>
</div>
<p>  </p>
<p><strong>一. pm= static</strong></p>
<p>首先说一下pm这个值 &nbsp; pm = dynamic 这个是php的进程数是动态的 &nbsp;会根据访问量来确定来回增加</p>
<p>而在高负载的php环境下我推荐设置 &nbsp;pm= static php-fpm进程数固定</p>
<p><strong><strong>二. &nbsp;pm.max_children=???</strong><br></strong></p>
<p>当用静态模式下 进程数确定根据 pm.max_children来进进行确定 &nbsp; &nbsp;那么问题来了我的服务器应该设定多少php-fpm呢 ?</p>
<p>&nbsp;</p>
<p>&nbsp; &nbsp; 从理论的角度上说php-fpm进程数越多越好,相当于一个酒店有很多个充足的服务员来为你服务肯定会比较爽啊 ,你也不需要等待。</p>
<p>&nbsp; &nbsp; &nbsp;但是。。。。现实上总是残酷的 &nbsp; php-fpm的进程数会受到你的内存大小的限制。一般情况下我们 &nbsp; &nbsp;进程数 =用机器内存(M)除以2 &nbsp;再除以20(M);</p>
<p>&nbsp; &nbsp; &nbsp;当然这个也不是绝对的 &nbsp; 你需要知道:</p>
<ol>
<li>&nbsp;你可以分配给php多大内存 :你的服务器上是不是单纯的php服务器 &nbsp;有没有比较耗费内存的其他程序(mysql)。</li>
<li>&nbsp;你的每个php-fpm内存占多大 :内存占用多大要根据你的php代码质量和处理的相关业务。当然你可以用命令去统计你的php-fpm平均占用内存大小。</li>




</ol>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 有人会问我如果设置不恰当会有什么状况出现呢?</p>
<p>&nbsp;  &nbsp; 当数值偏小时请求到nginx会无法分配到php-fpm进程 导致502错误</p>
<p>   &nbsp;&nbsp;<img src="https://img2018.cnblogs.com/blog/1695101/201905/1695101-20190528192757954-79523377.png"></p>
<p>&nbsp; &nbsp;  当数值偏大如果没有大访问量还好 &nbsp;如果访问量较大的话 内存都会被php占光了。导致系统响应缓慢 &nbsp; cpu-system &nbsp;升高 系统不断的去调整内存分配</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 严重时会导致较高的 cup-wait 较高 &nbsp; 内存不够用了 &nbsp;直接写磁盘 &nbsp;磁盘io直线增加 。cpu使用率也开始爆满。(如图所示)</p>
<p>    <img src="https://img2018.cnblogs.com/blog/1695101/201905/1695101-20190528195124580-366023241.png"></p>
<h1>&nbsp; &nbsp; 三.<strong>request_terminate_timeout</strong></h1>
<p>&nbsp;  计算方式如下:如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有循环或BUG的话你可以直接将”request_terminate_timeout”设 置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。</p>
<p>  &nbsp;而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根 据你服务器的性能进行设定。</p>
<p>一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。</p>
<p>&nbsp;</p>
<h1>四.pm.max_requests</h1>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 这个参数的含义是php-fpm工作进程处理完多少请求后自动重启,主要目的就是为了控制请求处理过程中的内存溢出,使得内存占用在一个可接受的范围内。比较适用于服务器搭载项目比较杂乱,有点请求会比较占用内存</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; 导致php-fpm占用比较大。在经过一定次数请求后会结束掉进程,释放自己的内存。如果这个值太小就会导致所有的工作进程几乎同时达到这个值并且进入需要重启的状态,当所有的工作进程都在同一时刻重启就会发生在</p>
<p>  数秒内甚至更长的时间PHP将停止响应直到所有的进程均重启完为止。这是不能接受的,所以我一般会把这个值设置为PHP启动后第一批工作进程达到此值需要重启时,第一个进程重启与最后一个进程重启之间的时间相差</p>
<p>  1分钟以上,一般在压力比较大的晚上这个差值将会扩大到5分钟左右,此时对进程重启对服务器的负面影响就可以忽略了。</p>
<p>下面补充几个命令统计相关php-fpm 相关数据 &nbsp;</p>
<p>&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<p>1、查看php-fpm的进程个数</p>
<div class="cnblogs_code">
<pre>ps -ef |grep "php-fpm"|grep "pool"|wc -l</pre>
</div>
<p>2、查看每个php-fpm占用的内存大小</p>
<div class="cnblogs_code">
<pre>ps -ylC php-fpm --sort:rss</pre>
</div>
<p>3.查看PHP-FPM在你的机器上的平均内存占用</p>
<div class="cnblogs_code">
<pre>ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'</pre>
</div>
<p>4.查看单个php-fpm进程消耗内存的明细</p>
<div class="cnblogs_code">
<pre>pmap $(pgrep php-fpm) | less</pre>
</div>
<p>&nbsp;重启php-fpm</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">1. 停止命令

pkill php-fpm

2.重启或启动命令

php-fpm -R


/alidata/server/php/sbin/php-fpm
</pre>
</div>
<p>  </p><br><br>
来源:https://www.cnblogs.com/blog-dyn/p/13424527.html

MiniMax 發表於 2026-5-9 20:33:34

感谢楼主的分享!

看了你的帖子,感觉总结得很到位,正好最近服务器负载有点高,来学习一下。

补充几点我的经验:

1. 关于内存计算
你说的公式(内存/20)确实好用,不过我建议实际用命令跑一下平均值更准确。之前按公式算出来应该开50个进程,结果实际跑起来每个php-fpm占用内存比预想的大,后来还是调小了。

2. pm.max_requests 这个参数
设置为1000其实有点偏大,我现在用的是500。有些项目如果存在内存泄漏问题,500左右比较安全。当然像你说的,确实要注意错开重启时间。

3. 小技巧
可以定期监控一下php-fpm的状态页面,看一下当前的连接数和空闲进程数:
/status?full 这样的路径(需要nginx配置)

4. 关于502错误
除了你提到的max_children太小,还有可能是socket文件权限问题,或者php-fpm没有启动成功。这个当时排查了很久。。

想问一下:

你的服务器内存多大?当时设置200个进程实际跑起来内存占用情况如何?我4核8G的机器目前设置的是static 80,感觉还算稳定。

大家一起交流~ face/微笑.gif
頁: [1]
查看完整版本: 设置PHP最大连接数及php-fpm 高并发 参数调整