php-fpm中max_children的配置


Posted in PHP onMarch 15, 2019

现在nginx + fpm 基本成为主流的配置,其中我们比较关注的是pm.max_chindren的配置

首先,我们关注一个设置: pm = static/dynamic

这个选项是标识fpm子进程的产生模式:

static :表示在fpm运行时直接fork出pm.max_chindren个worker进程

dynamic:表示,运行时fork出start_servers个进程,随着负载的情况,动态的调整,最多不超过max_children个进程。

一般推荐用static,优点是不用动态的判断负载情况,提升性能,缺点是多占用些系统内存资源。

上面的告诉我们max_chindren代表的worker的进程数。普遍认为,这个配置越多能同时处理的并发也就越多,这是一个比较大的误区:

  • 1) 其实进程多了,增加进程切换的开销,更核心的是,能并发执行的fpm进程不会超过cpu个数。通过多开worker的个数来提升qps, 是错误的理解,不会说你多开了几个进程,就多出几个cpu来处理。
  • 2) worker进程开少了,如果server比较繁忙的话,会导到nginx把数据打到fpm的时候,发现所有的woker都在工作中,没有空闲的worker来接受请求,从而导致502。
  • 3) 在实际业务中,由于我们有很多的i/o操作,比如读取数据库,或者内部rpc调用这类在等待i/o的过程中,进程会被系统sleep, 而不占用cpu,如果配置worker少了,也会导致cpu利用不上

那worker数到底该怎么配置呢?

理论上woker进程数=cpu的个数是最合理的,但由于第2点,可能每个worker都没处理完请求,这样,就会频现502了。但多开进程,只是说避免502,暂时把请求hang住,但这只是缓解之道,实际上这不但不会增加系统的并发,而且会加重系统的负荷,所以,基于2,3 ,设置一个合理的worker数就比较重要了。

天下武功,唯快不破,只有尽可能的提升程序的效率,把单个请求的时间压缩到最低,这样,单个worker的处理时间变短了,那在单位时间里能处理的请求自然就多了。

那么可以通过每个worker在单位时间内处理的请求数来预估max_children的个数。假如最大的一个请求的处理时间(xhprof里看cpu时间)是100ms内,而在100ms之内同时有100个请求过来,那了理论上就需要配置100个worker进程,先把请求给hang住。

但最大的请求耗时可能会受很多外在的情况影响,不太好预估,尤其是网络i/o也算在里面,我们可以借用第三方的profile工具,比如xhprof, 这类工具可以统计cpu的耗时,通过这个时间来计算真正的worker数量,比总时间来计算要合理很多,其实这里有一个捷径,来配置你的max_children数, 就是你前期先把max_childnren设置成一个比较大的值,稳定运行一段时间后,观察fpm的status里的 max active processes 是多少,然后把max_children配置比他大一些就ok了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
php基础知识:类与对象(5) static
Dec 13 PHP
phpMyAdmin下载、安装和使用入门教程
May 31 PHP
破解图片防盗链的代码(asp/php)测试通过
Jul 02 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
Jul 01 PHP
PHP CURL CURLOPT参数说明(curl_setopt)
Sep 30 PHP
非常实用的php弹出错误警告函数扩展性强
Jan 17 PHP
php使用MySQL保存session会话的方法
Jun 18 PHP
PHP魔术方法的使用示例
Jun 23 PHP
PHP 获取ip地址代码汇总
Jul 05 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
Sep 25 PHP
PHP防止刷新重复提交页面的示例代码
Nov 11 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
Jul 27 PHP
使用Zookeeper分布式部署PHP应用程序
Mar 15 #PHP
php根据命令行参数生成配置文件详解
Mar 15 #PHP
详解PHP的抽象类和抽象方法以及接口总结
Mar 15 #PHP
PHP基于面向对象封装的分页类示例
Mar 15 #PHP
浅谈PHP无限极分类原理
Mar 14 #PHP
详解PHP队列的实现
Mar 14 #PHP
PHP精确到毫秒秒杀倒计时实例详解
Mar 14 #PHP
You might like
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
javascript CSS画图之基础篇
2009/07/29 Javascript
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
jQuery拖拽 & 弹出层 介绍与示例
2013/12/27 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
2016/05/05 Javascript
vue2.0开发实践总结之疑难篇
2016/12/07 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
详解angular中的作用域及继承
2017/05/31 Javascript
JS 仿支付宝input文本输入框放大组件的实例
2017/11/14 Javascript
解决Vue打包之后文件路径出错的问题
2018/03/06 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
基于JavaScript实现表格隔行换色
2020/05/08 Javascript
ES6 Generator基本使用方法示例
2020/06/06 Javascript
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
python使用Image处理图片常用技巧分析
2015/06/01 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
Python变量类型知识点总结
2019/02/18 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
django数据模型on_delete, db_constraint的使用详解
2019/12/24 Python
keras 权重保存和权重载入方式
2020/05/21 Python
Python偏函数实现原理及应用
2020/11/20 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
C语言笔试题回忆
2015/04/02 面试题
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
2016七一建党节慰问信
2015/11/30 职场文书