php-fpm是如何处理动态请求的

-FPM是大多数 项目中都会用到的也鈳能会有一些监控的操作需要获取FPM的进程相关信息

而 -FPM 的进程,基本上可以分为动态模式及静态模式而大多数公司或者个人都使用的是动態模式

直接开启指定数量的 -FPM 进程,不再增加或者减少;启动固定数量的进程占用内存高

但在用户请求波动大的时候,对 Linux 操作系统进程的處理上耗费的系统资源低

开始的时候开启一定数量的 -FPM 进程当请求量变大的时候,动态的增加 -FPM 进程数到上限当空闲的时候自动释放空闲嘚进程数到一个下限

动态模式,会根据max、min、idle children配置动态的调整进程数量

在用户请求较为波动,或者瞬间请求增高的时候进行大量进程的創建、销毁等操作,而造成 Linux 负载波动升高

简单来说请求量少,-FPM 进程数少请求量大,进程数多

优势就是当请求量小的时候,进程数少内存占用也小

这种模式下,-FPM 的master不会fork任何的子进程纯粹就是按需启动子进程

因为这种模式,基本上是无法适应有一定量级的线上业务的

沈唁志一个er的成长之路!
任何个人或团体,未经允许禁止转载本文:谢谢合作!

如果给您解决燃眉之急或带来些许明朗,您可以打赏┅杯咖啡或一杯香茗

}

-c 统计每一系统调用的所执行的时間,次数和出错的次数等.

-d 输出strace关于标准错误的调试信息.

-f 跟踪由fork调用所产生的子进程.

-h 输出简要的帮助信息.

-i 输出系统调用的入口指针.

-q 禁止输出关於脱离的消息.

-r 打印出相对时间关于,,每一个系统调用.

-t 在输出中的每一行前加上时间信息.

-tt 在输出中的每一行前加上时间信息,微秒级.

-ttt 微秒级输出,鉯秒了表示时间.

-T 显示每一调用所耗的时间.

-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.

-x 以十六進制形式输出非标准字符串

-xx 所有字符串以十六进制形式输出.

设置返回值的输出位置.默认为40.

2)也可以用利用-c参数让strace帮助汇总非常方便非常強大!

ps:可以使用strace学习解释器的解释执行过程

如果自己的程序的确没有问题,只是执行了太多操作没法再做优化了。则考虑使用APC或xcache等加速器来减少CPU解释文件的耗时

这些加速器在文件第一次解释时会生成中间代码opcode,所以之后的执行会快很多并且减少了一些CPU的运算。下面鉯xcache为例

安装xcache命令如下,./configure的参数好多不知道是做什么用的官网上也没说明,所以只开启--enable-xcache了:

.ini中配置如下最重要的是标红的两个参数,┅般推荐xcache.size根据文件多少来定xcache.count与CPU核心数相同:

常见问题是启动-fpm时会报错:

这是因为/tmp/xcache是一个文件,而不能创建成目录

使用上面的配置在使CPU使用率的峰值时间变短了,但峰值时还是所有核心都会达到90%以上不知道是不是哪里没有配置对。

4.程序性能监控

常用的方法就是开启xdebug的性能监控功能将xdebug输出结果通过WinCacheGrind软件分析。

.ini中配置的这几项是输出性能信息的:

这样XDebug会输出所有执行函数的性能数据但产生的文件也会比較大。可以关闭一些选项如collect_params、collect_return

来减少输出的数据量。或者关闭自动输出通过在想要监控的函数首尾调用xdebug函数来监控指定的函数。

WinCacheGrind使用方法网上有很多介绍这里就不详细说明了。

以上都是近期做程序优化工作总结出的一些优化方法还请经验丰富的大牛们提出更好的建議,共同交流、进步~

}

早期的webserver只处理html等静态文件但是隨着技术的发展,出现了像等动态语言webserver处理不了了,怎么办呢那就交给解释器来处理吧!交给解释器处理很好,但是解释器如何与webserver進行通信呢?

为了解决不同的语言解释器(如、python解释器)与webserver的通信于是出现了cgi协议。只要你按照cgi协议去编写程序就能实现语言解释器与webwerver的通信。如-cgi程序cgi:

有了cgi协议,解决了解释器与webserver通信的问题webserver终于可以处理动态语言了。但是webserver每收到一个请求,都会去fork一个cgi进程请求结束洅kill掉这个进程。这样有10000个请求就需要fork、kill -cgi进程10000次

有没有发现很浪费资源

于是,出现了cgi的改良版本fast-cgi。fast-cgi每次处理完请求后不会kill掉这个進程,而是保留这个进程使这个进程可以一次处理多个请求。这样每次就不用重新fork一个进程了大大提高了效率。

进程则一般有多个(具體数量根据实际需要配置)每个进程内部都嵌入了一个 解释器,是 代码真正执行的地方

Manager的缩写,那么fpm就是FastCGI进程管理器的简称。-fpm就是中嘚FastCGI进程管理器对于5.3之前的版本来说,-fpm是一个第三方的补丁包旨在将FastCGI进程管理整合进包中。在5.3之后的版本中-fpm不再是第三方的包,它已經被集成到的源码中了-fpm提供了更好的进程管理方式,可以有效控制内存和进程、可以平滑重载配置比spawn-fcgi具有更多优点,所以-fpm被官方收购叻

我们知道Nginx不只有处理http请求的功能还能做反向代理。故Nginx通过反向代理功能将动态请求转向后端-fpm

当请求模块下的某个文件的时候,会通過反向代理到达-fpm

下面是-fpm的服务进程

Manager即-FPM会通过用户配置来管理一批FastCGI进程,例如在-FPM管理下的某个FastCGI进程挂了-FPM会根据用户配置来看是否要重启補全,-FPM更像是管理器而真正衔接Nginx与的则是FastCGI进程。图中FastCGI的下游CGI-APP就是程序。而FastCGI的上游是Nginx他们之间有一个通信载体,即图中的socket在我们上攵图的配置文件中,fastcgi_pass所配置的内容便是告诉Nginx你接收到用户请求以后,你该往哪里转发在我们图中是转发到本机的一个socket文件,这里fastcgi_pass也常配置为一个http接口地址(这个可以在-fpm.conf中配置)而上图中的Pre-fork,则对应着我们-FPM的启动也就是在我们启动-FPM时便会根据用户配置启动诸多FastCGI触发器(FastCGI

一句话总结:nginx接到请求,根据监听端口找到要访问的文件并通过socket与其中一个常驻内存fast-cgi程序建立连接,并将接收到的数据传给fast-cgi-fpm管理fast-cgi进程,挂了后就再启动起来fast-cgi执行程序,完成数据的获取后再通过该连接返回给nginx,返回到用户client

}

我要回帖

更多关于 fpmphp 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信