PHP的pm、pm.max_requests、memory_limit参数优化说明

2017-04-02 00:42:51

1、php-fpm.conf中的pm

pm是来控制php-fpm的工作进程数到底是一次性产生固定不变(static)还是在运行过程中随着需要动态变化(dynamic)。众所周知,工作进程数与服务器性能息息相关,太少则不能及时处理请求,太多则会占用内存过大而拖慢系统。因为php-fpm处理请求时会随着处理的请求数的增加而占用越来越多的内存,所以static模式下往往不好判断启动的能使内存利用最大化的固定进程数,所以想到了dynamic模式。可是为什么我们不用dynamic模式呢,试想某个时刻请求数比较低,20个进程足够应付,突然压力增大了,出现了40个并发PHP请求,按照最小5个空闲进程的设置就需要45个进程,也就是说需要在短时间内创建出25个进程,我们知道创建进程的操作是比较消耗系统资源的,再加上40个并发PHP请求肯定也会给MySQL带来一定的压力,此时再创建25个进程无疑是雪上加霜,所以我在这里还是选择了static模式。
 

2、php-fpm.conf中的pm.max_requests

根据说明我们知道这个参数的含义是php-fpm工作进程处理完多少请求后自动重启,主要目的就是为了控制请求处理过程中的内存溢出,使得内存占用在一个可接受的范围内。从这里我们感觉这个数字似乎设置的小一点更加有利于性能提升,但是当这个数字非常小的时候会发生一种情况,由于PHP请求是平均地分配给各个工作进程的,如果这个值太小就会导致所有的工作进程几乎同时达到这个值并且进入需要重启的状态,当所有的工作进程都在同一时刻重启就会发生在数秒内甚至更长的时间PHP将停止响应直到所有的进程均重启完为止。这是不能接受的,所以我一般会把这个值设置为PHP启动后第一批工作进程达到此值需要重启时,第一个进程重启与最后一个进程重启之间的时间相差1分钟以上,一般在压力比较大的晚上这个差值将会扩大到5分钟左右,此时对进程重启对服务器的负面影响就可以忽略了。
 

3、php.ini中的memory_limit

顾名思义,这个值是用来限制PHP所占用的内存的,具体一点说就是一个PHP工作进程即php-fpm所能够使用的最大内存,默认是128MB,一开始在虚拟机中我设置为PHP 5.1.6的默认值16MB,发现大于16MB的附件将无法下载,也就是说PHP 5.3中附件是从硬盘完整读取到PHP内存中再传给nginx的,这跟PHP 5.1.6+Apache 2.2.3不同,后者读取附件是PHP并不加载这个附件而是直接交给Apache来加载,这就使得php-fpm占用内存大了不少。当php-fpm占用内存达到了memory_limit所限制的值时,当前进程会被fpm主进程使用TERM信号终止掉,此时被处理的PHP请求将返回客户端502错误,nginx的error log中将记录出错原因是“Connection reset by peer”。可是更加令人难以理解的事情发生了,在使用了eAccelerator的PHP 5.3上,居然发生了当php-fpm内存达到memory_limit所限制的值时,所有进程都开始疯狂重启而不再接受任何请求,此时除非使用kill命令杀死主进程,否则php-fpm永远都不会恢复响应,可想而知nginx必然出现无止境的502错误了。。。


  • 2019-03-13 09:38:11

    写入MySQL报错超出 max_allowed_packet 的问题

    MySQL会根据配置文件会限制server接受的数据包的大小。如果写入大数据时,因为默认的配置太小,插入和更新操作会因为 max_allowed_packet 参数限制,而导致失败。

  • 2019-03-15 15:28:33

    10分钟教你搭建自己的ngrok服务器

    内网穿透想必开发过微信的同志都很了解,大部分人选择网上寻找各种现成的,比如ngrok官网、ittun-ngrok、sunny-ngrok或者花生壳之类的。但是世界上没有免费的午餐,要不就是收费,要不就是免费但是偶尔会出现连接失败的问题(当然大多数时间是没有问题的)。

  • 2019-03-15 15:29:53

    丢弃花生壳,搭建自己的ngrok作为内网穿透服务器

    公司没有公网,公司在二级路由下面(就是服务商没有给独立IP,也无法动态获取公网IP),然而公司在开发程序的时候,如对接微信等需要返回数据,或者需要别人能访问我们网址,一般我们就只能购买花生壳内网穿透,但是在使用中发现速度慢,经常掉。所以搭建自己的ngrok服务器来保证内网穿透。

  • 2019-03-15 15:31:21

    内网穿透 ngrok 服务器和客户端配置

    ngrok 简介及作用 ngrok 是一款用 go 语言开发的开源软件,它是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。下图简述了 ngrok 的原理。

  • 2019-03-15 15:32:09

    内网打洞以及代码实现

    假设内网的多个ip或者同一ip的不同port,都要访问同一个(外网ip:port)。对NAT来说,从外网接收的包它的(srcIp:srcPort)==(serverIp,serverPort),它的dstIp==natIp,所以NAT只能用dstPort来决定把这个包转发给哪一个(内网Ip:port)

  • 2019-03-15 15:33:08

    Xshell不能按退格、删除键的解决方案

    在使用xshell时,由于每个服务器不同,一些无法使用Backspace键向后删除字符。针对这个问题,本文为大家解答下退格键无法识别如何设置?

  • 2019-03-15 15:49:28

    win10远程桌面连接不上解决方法

    有朋友就感叹电脑的世界真的是很神奇,可以将整个世界连接在一起。如果别人想要摆弄你的电脑,即使不在一个地方也可以利用远程桌面来控制。而这就是所谓的远程控制操作了,大部分人都知道它的作用,不过这也不排除会遇到一些突发情况的时候,例如win10远程桌面连接不上,这该怎么去解决呢?为此,小编给大家带来了解决的图文操作。