php-fpm 高并发 参数调整

         工做中常常会遇到会给客户配置服务器,其中有的客户还会有并发量要求,其中也会必需要用负载均衡承载压力的。增长服务器数量确定能有效的提高服务器承载能力,但只有根据目前已有配置设置好单台服务器才能更好的发挥出服务器的性能。调整好一台服务器后剩下的就更简单了  拿着快照复制n多台。php

        今天就说一下php服务器的配置,以前说过opcache 今天说一下lnmp下基本配置(我的经验总结,若有不妥之处望大神提示一下)。mysql

       服务器中找到php-fpm.conf配置(有的会在引入的www.conf中)nginx

      

[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice

[www]
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

一. pm= staticsql

首先说一下pm这个值   pm = dynamic 这个是php的进程数是动态的  会根据访问量来肯定来回增长服务器

而在高负载的php环境下我推荐设置  pm= static php-fpm进程数固定并发

二.  pm.max_children=???
负载均衡

当用静态模式下 进程数肯定根据 pm.max_children来进进行肯定    那么问题来了个人服务器应该设定多少php-fpm呢 ?less

 

    从理论的角度上说php-fpm进程数越多越好,至关于一个酒店有不少个充足的服务员来为你服务确定会比较爽啊 ,你也不须要等待。php-fpm

     可是。。。。现实上老是残酷的   php-fpm的进程数会受到你的内存大小的限制。通常状况下咱们    进程数 =用机器内存(M)除以2  再除以20(M);性能

     固然这个也不是绝对的   你须要知道:

  1.  你能够分配给php多大内存 :你的服务器上是否是单纯的php服务器  有没有比较耗费内存的其余程序(mysql)。
  2.  你的每一个php-fpm内存占多大 :内存占用多大要根据你的php代码质量和处理的相关业务。固然你能够用命令去统计你的php-fpm平均占用内存大小。

        有人会问我若是设置不恰当会有什么情况出现呢?

     当数值偏小时请求到nginx会没法分配到php-fpm进程 致使502错误

     

     当数值偏大若是没有大访问量还好  若是访问量较大的话 内存都会被php占光了。致使系统响应缓慢   cpu-system  升高 系统不断的去调整内存分配

          严重时会致使较高的 cup-wait 较高   内存不够用了  直接写磁盘  磁盘io直线增长 。cpu使用率也开始爆满。(如图所示)

    

    三.request_terminate_timeout

   计算方式以下:若是你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有循环或BUG的话你能够直接将”request_terminate_timeout”设 置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。

   而若是你作不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其余的缘由致使你的PHP-CGI可以假死那么就建议你给”request_terminate_timeout”赋一个值,这个值能够根 据你服务器的性能进行设定。

通常来讲性能越好你能够设置越高,20分钟-30分钟均可以。因为个人服务器PHP脚本须要长时间运行,有的可能会超过10分钟所以我设置了900秒,这样不会致使PHP-CGI死掉而出现502 Bad gateway这个错误。

 

四.pm.max_requests

        这个参数的含义是php-fpm工做进程处理完多少请求后自动重启,主要目的就是为了控制请求处理过程当中的内存溢出,使得内存占用在一个可接受的范围内。比较适用于服务器搭载项目比较杂乱,有点请求会比较占用内存

        致使php-fpm占用比较大。在通过必定次数请求后会结束掉进程,释放本身的内存。若是这个值过小就会致使全部的工做进程几乎同时达到这个值而且进入须要重启的状态,当全部的工做进程都在同一时刻重启就会发生在

  数秒内甚至更长的时间PHP将中止响应直到全部的进程均重启完为止。这是不能接受的,因此我通常会把这个值设置为PHP启动后第一批工做进程达到此值须要重启时,第一个进程重启与最后一个进程重启之间的时间相差

  1分钟以上,通常在压力比较大的晚上这个差值将会扩大到5分钟左右,此时对进程重启对服务器的负面影响就能够忽略了。

 

  下面补充几个命令统计相关php-fpm 相关数据  

  

 

一、查看php-fpm的进程个数

ps -ef |grep "php-fpm"|grep "pool"|wc -l

二、查看每一个php-fpm占用的内存大小

ps -ylC php-fpm --sort:rss

3.查看PHP-FPM在你的机器上的平均内存占用

ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

4.查看单个php-fpm进程消耗内存的明细

pmap $(pgrep php-fpm) | less

 

   补充一下与技术无关的:

  不少技术人员认为我把一台服务器性能压榨到极限,别人四台服务器承载的压力我一台服务器就承载住了,认为本身很厉害

       其实这种思惟是不对的。客户要的是作活动时服务的稳定,用户要的是流畅的体验。 该增长机器的时候增长机器,最重要的

  是活动能正常稳定的进行。

 

 今天就这样吧  之后再有进行补充  后面再完善一下nginx 和内核方面的

相关文章
相关标签/搜索