减少php-cgi进程降低vps内存占用

原创 2012年02月22日 11:20:56
 减少php-cgi进程降低vps内存占用

  
有些vps只有128m的内存,所以要尽量减少内存占用避免内存不够down机.修改php-fpm 进程数在/usr/local/php/etc/php-fpm.conf 查找max_children 将后面的值修改成你要设置的值就可以,因为是子进程的原因,所以设置成1的话实际上会有两个进程,因为还有一个主进程。

  命令:

  #vi /usr/local/php/etc/php-fpm.conf

  lnmp.org出品的lnmp一键安装包路径,其它请自行找目录

  <valuename="max_children">1</value>

  <valuename="request_terminate_timeout">30s</value>

  <valuename=”style”>apache-like </value>

  php-fpm的默认静态处理方式会使得php-cgi的进程长期占用内存而无法释放,这也是导致nginx出错的原因之 一,因此可以将php-fpm的处理方式改成apache模式。

  request_terminate_timeout 指的是fast-cgi的执行脚本时间,它默认是0s。0s的含义是让php-cgi一直执行下去而没有时间限制。如果你在此设成0s,那么当出现502 Bad Gateway的时候,这个502的状态将一直持续下去不会改变。但是如果你设置成5s,那么当php-cgi假死5s以后会自动恢复。华夏名网代理这个值可以根据你 服务器的性能进行设定,这里我设置的是30s。

  BTW:修改nginx进程数在/usr/local/nginx/conf/nginx.conf 查找:worker_processes 将后面的值修改成你要设置的值就可以。  ++++++++++++++++++++++++++++++++++++++++++++++++++ +

  php-fpm的两种进程管理模式

  php-fpm的进程数也是可以根据设置分为动态和静态的。

  一种是直接开启指定数量的php-fpm进程,不再增加或者减少;另一种则是开始的时候开启一定数量的php-fpm进程,当请求量变大的时候,动态的增加php-fpm进程数到上限,当空闲的时候自动释放空闲的进程数到一个下限。

  这两种不同的执行方式,可以根据服务器的实际需求来进行调整。

  这里先说一下涉及到这个的几个参数吧,他们分别是pm、pm.max_children、pm.start_servers、pm.min_spare_servers和pm.max_spare_servers。

  pm表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。在更老一些的版本中,dynamic被称作apache-like。这个要注意看配置文件给出的说明了。

  下面4个参数的意思分别为:

  pm.max_children:静态方式下开启的php-fpm进程数量。

  pm.start_servers:动态方式下的起始php-fpm进程数量。

  pm.min_spare_servers:动态方式下的最小php-fpm进程数量。

  pm.max_spare_servers:动态方式下的最大php-fpm进程数量。

  如果dm设置为static,那么其实只有pm.max_children这个参数生效。系统会开启设置的数量个php-fpm进程。

  如果dm设置为dynamic,那么pm.max_children参数失效,后面3个参数生效。系统会在php-fpm运行开始的时候启动 pm.start_servers个php-fpm进程,然后根据系统的需求动态在pm.min_spare_servers和 pm.max_spare_servers之间调整php-fpm进程数。

  那么,对于我们的服务器,选择哪种执行方式比较好呢?事实上,跟Apache一样,我们运行的PHP程序在执行完成后,或多或少会有内存泄露的问题。

  这也是为什么开始的时候一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M的原因了。所以,动态方式因为会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或者VPS上使用。具体最大数量根据 内存/20M 得到。比如说512M的VPS,建议pm.max_spare_servers设置为20。至于pm.min_spare_servers,则建议根据服务器的负载情况来设置,比较合适的值在5~10之间。

  然后对于比较大内存的服务器来说,设置为静态的话会提高效率。因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。数量也可以根据内存/30M 得到。比如说2GB内存的服务器,可以设置为50;4GB内存可以设置为100等。

  ++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++

  解决Nginx 504 Gateway Time-out的一些方法

  在CentOS下配置lnmp组合基本上用的都是同样的配置文件,一直都没出现过问题,可最近在一个vps上安装同样的环境之后,网站在线10多人就出 现了打开速度非常缓慢的情况,有好几次都是直接达到了nginx中设置的脚本最大超时时间300秒,结果导致nginx往客户端浏览器发送了一个504 Gateway Time-out的错误代码,分析了之后改动了几处配置文件,终于避免了该情况的出现。

  从错误代码基本可以确定跟nginx本身无关,主要是提交给php-fpm的请求未能正确反馈而导致,一般情况下,提交动态请求的时候,nginx会直接把 请求转交给php-fpm,而php-fpm再分配php-cgi进程来处理相关的请求,之后再依次返回,最后由nginx把结果反馈给客户端浏览器,但 我这个vps目前跑的是个纯php应用内容,实际上用户所有的请求都是php请求,有的耗费时间比较久,php-cgi进程就一直都被用满,而php- fpm本身的配置文件只打开了10组php-cgi进程,这样的话在线用户稍微多的话就会导致请求无法被正常处理而出错。

  大概分析出了原 因,下面做就比较容易了,首先是更改php-fpm的几处配置:

  把max_children由之前的10改为现在的30,这样就可以保证 有充足的php-cgi进程可以被使用;

  把request_terminate_timeout由之前的0s改为60s,这样php-cgi进程 处理脚本的超时时间就是60秒,可以防止进程都被挂起,提高利用效率。

  接着再更改nginx的几个配置项,减少FastCGI的请求次 数,尽量维持buffers不变:

  fastcgi_buffers由 4 64k 改为 2 256k;

  fastcgi_buffer_size 由 64k 改为 128K;

  fastcgi_busy_buffers_size 由 128K 改为 256K;

  fastcgi_temp_file_write_size 由 128K 改为 256K。

  好了,重新加载php-fpm和nginx的配置,再次测试,至今两周时间内没有再出现504 Gateway Time-out的情况,算是达到效果了。

  另外,php-fpm的默认静态处理方式会使得php-cgi的进程长期占用内存而无法释放,这也是导致nginx出错的原因之一,因此可以将php-fpm的处理方式改成apache模式。

  <value name=”style”>apache-like</value>

  从更改完毕到现在的测试表明上述方式的效果还是很明显的,并没有发现一次Nginx502 bad gateway或504 Gateway Time-out错误。当然,如果你的VPS或者服务器的性能足够好可以根据具体情况不必做无谓的改动。

  ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++

  关于php-fpm占用系统资源分析 测试人员向我们反映:在Facebook平台的游戏比其它平台的游戏明显更慢。我询问,是不是因为翻墙网络原因。他们说:不是,其它游戏也比较流畅。使用httpwatch查看了http请求,发现api.php请求花了6秒,且大部分时间是红色(httpwatch红色表示服务器运算时间)。平常2秒,现在6秒,服务器处理时间在不同的服务器相差这么多。直觉告诉:服务器资源。 服务器概况

  操作系统:CentOS5.3-64-2.6.18-164.el5

  应用服务Nginx0.6、PHP-Fpm、MySQL5.1、PHP5.2、Memcached

  Memcached仅cached游戏系统设置与模板参数据

  故障检测

  1.别的先不管,先top看一下cpu、ram、swap哪个比较紧张。 由上图分析,可以看出共有602个进程,其中有601个进程休眠了。这好像有点不对劲,内核进程也就80个左右,加上memcached, nginx, mysqld,也不会超出90个。除了这些,剩下的只有php-fpm管理的php-cgi,难道是…?

  CPU显示,CPU压力并不大,可以说没有压力。我们再看内存使用概要,发现4G的内存,消耗得所剩余无几(free+buffers), 95%以上的内存都已分配。交互空间使用情况,我们暂时不去关心。指令top还列出了占用资源最多的进程,运行时间最久(Time+)的mysqld(约2小时)占用资源并不是最多。另外,再看php-cgi,单个php-cgi占用的内存也不算多。所以,可以大胆地猜想:服务器内存资源比较紧张,并没有被某个进程占用大量内存,有可能被某些挂起的进程占着内存没有释放。通过free进一步监控内存使用情况,验证我们的想法。

  2.指令free,了解RAM资源使用情况。当然,你也可以查看文件/proc/meminfo

  我们先来看Mem统计信息,total表示物理内存总量,约4G。used,表示已分配内存,分配了并不表示使用了,包括(buffer&cached)。free指未分配的内存,buffers与cached表示分配了但还没有被使用的内存。第二行(buffers/cache)的,used表示真正被使用了内存,由第一行的(used-buffer-cached)得到,free则表示还没有被使用的内存,由第一行的(free+buffer+cached)得到。Swap行则表示内存交换使用情况,少量的(不频繁地)swpd,是不会影响服务器性能的,因为系统需要将V类型的内存页面交换出去或者调整了buffer与cached的大小。但是频繁地swpd,则有可能意味着服务器物理内存不足,小于指定的swap额定值,需要换出内存页。

  查看free结果的时候,我们主要查看第二行。一眼就能看出4G的内存,其中有3898M内存被用了,还有49M内存没有,都快用完了。这也证实了我们第一步的猜想,内存被用完。这里,我们进一步猜想,内存空间严重不足的情况下,进程会被blocked,系统会不断地将不用的数据换出so,将要用的数据读入si。我们能通过vmstat进一步验证,我们的这个猜想。

  3.指令vmstat监控内存使用情况

  作为对内存监控,我们比较关心swpd、free、si、so。一般系统不繁忙的状态下,我们看到swpd,so的值不会持续很高,经常为0。这里,我们看到swpd值为1.5G,以及free值很小,再一次表明物理内存不足。其中si报告了每秒从swap区移入到物理内存的内存总量,so报告了每秒从物理内存移出到swap区的内存总量。当然,si有时较大,并不要过份的焦虑,经常碰到一个程序需要较大内存来读写媒体文件时,si值就会变大。反倒是so,它通常是一个内存紧缺的一个信号,如果长时间这个值一直保持较大的话,则很有可能内存不够,小额波动,可以不用理会。接下来,可以通过ps找出消耗内存的元凶。

  4.指令ps找出消耗内存的元凶 [root@localhost ~]# ps -A –sort -rss -o comm,pmem,pcpu |uniq -c |head -15

  1 COMMAND %MEM %CPU

  1 mysqld 0.6 0.0

  503 php-cgi 0.3 0.0

  5 php-cgi 0.2 0.0

  1 php-cgi 0.1 0.0

  1 php-cgi 0.0 0.0

  1 memcached 0.0 0.0

  1 sshd 0.0 0.0

  1 nginx 0.0 0.0

  1 sshd 0.0 0.0

  1 nginx 0.0 0.0

  2 bash 0.0 0.0

  3 nginx 0.0 0.0

  1 sshd 0.0 0.0

  1 nginx 0.0 0.0

  指令ps比较常用,也比较简单。上面报告结果,我们一眼就可以命中php-cgi这个进程。虽然单个php-cgi占用内存并不算太大,但是503个php-cgi进程,就有点恐怖了。几乎占尽了全部内存(503*0.3%)。我们可以猜想,php-cgi由php-fpm管理,是不是可以php-fpm的某个参数配置不当,导致打开过多的php-cgi进程。

  5. 设置php-fpm进程数量管理

  通过重新将php-conf.conf的max_children值设置为150,系统内存又恢复到正常使用情况。free、si、so、b均表示内存系统资源正常,没有压力。

  php-cgi进程释放的内存并不会被系统立即回收,一个php-cgi大概占用20MB内存(取决于你加载的php extensions)。所以,有必要限制你启动的php-cgi进程数量。那么,这个数量多少合适呢,你可以在服务器高峰期通过top统计出php-cgi数量。也可以像php-fpm建议的那样,通过netstat -np | grep 127.0.0.1:9000来收集数据,通过设置max_children使等待的数量尽量小

  6.一个php-cgi占用多少内存

  一个php-cgi进程,大概占用多少内存呢,大概是20MB(具体的要看你的php加载了多少模块)。可以通过pmap指令查看哪些地方占用了内存。所以,尽量不要加载不必要的php扩展模块,可以减少不必要的内存浪费。 [root@localhost etc]# pmap $(pgrep php-cgi |head -1)

  6746: /usr/local/php/bin/php-cgi –fpm –fpm-config /usr/local/php/etc/php-fpm.conf

  0000000000400000 6680K r-x– /usr/local/php/bin/php-cgi

  0000000000c86000 268K rw— /usr/local/php/bin/php-cgi

  0000000000cc9000 56K rw— [ anon ]

  0000000005012000 2240K rw— [ anon ]

  0000003efd200000 112K r-x– /lib64/ld-2.5.so

  …….

  00002ac28a7a5000 2048K —– /usr/local/php/lib/php/extensions/no-debug-non-zts -20060613/xhprof.so

  00002ac28a9a5000 4K rw— /usr/local/php/lib/php/extensions/no-debug-non-zts -20060613/xhprof.so

  00002ac28a9a6000 84K r-x– /usr/local/php/lib/php/extensions/no-debug-non-zts -20060613/apc.so

  00002ac28a9bb000 2048K —– /usr/local/php/lib/php/extensions/no-debug-non-zts -20060613/apc.so

  00002ac28abbb000 8K rw— /usr/local/php/lib/php/extensions/no-debug-non-zts -20060613/apc.so

  00002ac28abbd000 32K rw— [ anon ]

  00002ac28abd4000 40K r-x– /lib64/libnss_files-2.5.so

  00002ac28abde000 2044K —– /lib64/libnss_files-2.5.so

  00002ac28addd000 4K r—- /lib64/libnss_files-2.5.so

  00002ac28adde000 4K rw— /lib64/libnss_files-2.5.so

  00007fffa717e000 84K rw— [ stack ]

  ffffffffff600000 8192K —– [ anon ]

  total 154172K

相关文章推荐

手把手教你在centos下编译安装配置高性能web服务器环境nginx+php(fast-cgi)+mysql等/适合小内存vps使用

本文原载于个人独立博客Just fengyqf's blog 最新更新请到这里参阅 http://blog.path8.net/archives/6068.html 本文为实战操作过程的全程记...
  • fengyqf
  • fengyqf
  • 2012年08月09日 16:11
  • 1358

php-cgi进程占用cpu资源过多负载高的原因分析及解决步骤

服务器环境:redhat linux 5.5 , nginx ,  phpfastcgi   在此环境下,一般php-cgi运行是非常稳定的,但也遇到过php-cgi占用太多cpu资源而导...
  • hb1707
  • hb1707
  • 2011年11月18日 13:48
  • 293

服务器php-cgi.exe进程过多,导致CPU占用100%的解决方法

再使用iis服务器中经常会出现php-cgi.exe进程过多,导致CPU占用100%,最终造成网站运行过慢甚至卡死的情况,重启iis会好一会,过一段时间久出现这种情况,为什么会出现这种情况呢,应该怎么...

服务器大量php-cgi.exe进程,导致CPU占用100%的解决

出现该问题一般为程序方面问题,如程序采用fastcgi方式运行PHP,而程序设置的StartProcesses又偏大,如6甚至更大。 解决参考: 1.检查系统盘空间。查看系统临时文件是否过多,...

nginx+php-cgi 进程守护工具

  • 2017年07月05日 09:21
  • 278KB
  • 下载

Nginx 0.7.x + PHP 5.2.6(FastCGI)+ MySQL 5.1 在128M小内存VPS服务器上的配置优化

[文章作者:张宴 本文版本:v1.0 最后修改:2008.10.28 转载请注明原文链接:http://blog.s135.com/post/375/]   VPS(全称Virtual Priv...

PHP-CGI 进程 CPU 100% 与 file_get_contents 函数的关系

有时候,运行 Nginx、PHP-CGI(php-fpm) Web服务的 Linux 服务器,突然系统负载上升,使用 top 命令查看,很多 php-cgi 进程 CPU 使用率接近100%。后来,我...
  • oeasy_
  • oeasy_
  • 2012年07月29日 22:52
  • 591

PHP-CGI 进程 CPU 100% 与 file_get_contents 函数的关系

[文章作者:张宴 本文版本:v1.0 最后修改:2011.08.05 转载请注明原文链接:http://blog.s135.com/file_get_contents/] 有时候,运行 Ngin...

lnmp开启nginx和php-cgi多个进程

修改nginx进程数在/usr/local/nginx/conf/nginx.conf 查找:worker_processes 将后面的值修改成你要设置的值就可以。 修改php-fpm 进程数在...

Linux VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本

Linux VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本 288月2011 0 主要用于监控 linux 服务器负载及内存占用,如 My...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:减少php-cgi进程降低vps内存占用
举报原因:
原因补充:

(最多只允许输入30个字)