减少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

unity内存减少方法集合

本文集合了网上许多关于U3D内存减少方法的说发。博主未进行考证测试,仅仅收集以备用。 GarbageCollectAssetsProfile: 1.引擎在执行UnloadUnusedAssets...
  • alayeshi
  • alayeshi
  • 2016年09月23日 17:16
  • 1231

php-fpm占用系统资源分析

故障检测 1.别的先不管,先top看一下cpu、ram、swap哪个比较紧张。     由上图分析,可以看出共有602个进程,其中有601个进程休眠了。这好像有点不对劲,内核进...
  • xhjcehust
  • xhjcehust
  • 2016年08月02日 17:01
  • 1296

Python 进程内存增长解决方案

作者简介: 张炎泼(XP) 白山云科技合伙人兼研发副总裁,绰号XP。 张炎泼先生于2016年加入白山云科技,主要负责对象存储研发、数据跨机房分布和修复问题解决等工作。以实现100PB...
  • BaishanCloud
  • BaishanCloud
  • 2017年07月31日 11:05
  • 240

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

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

[H5]如何减少网页的内存与CPU占用

有的网页看起来并不大但打开会很卡,有的网页虽然很长但使用流畅,占用用户电脑的内存与CPU就影响这些。 浏览器问题,有各自的浏览器处理内存问题会影响到,但几乎没办法控制得了,Windows上的: ...
  • wabil
  • wabil
  • 2016年05月31日 11:46
  • 1973

关于php-fpm占用系统资源分析

http://www.opsers.org/linux-home/server/php-fpm-on-analysis-of-system-resources.html 服务器概况 操...
  • pestd
  • pestd
  • 2014年05月19日 11:41
  • 2273

阿里云云盾占用过多内存

双十一的活动就是好,好久以前就想买一个云服务器,但是感觉有点小贵,所以就一直没买,双十一搞活动只要7折,所以就立马买了一个低配的,512内存,虽然少,但是估计个人用差不多了,当把我的这个个人博客架起的...
  • f369504543
  • f369504543
  • 2015年12月20日 14:01
  • 3172

apache占用内存高解决办法

apache占用内存高解决办法 我用512M的vps,访问量不大,但内存占用很大,甚至宕机。 我用top,然后shitf+m发现,httpd占用内存极大。经过网上找资料设置后,用过一段...
  • klpk521
  • klpk521
  • 2015年04月06日 23:19
  • 2293

3.redis内存占用飙升

一、现象:     redis-cluster某个分片内存飙升,明显比其他分片高很多,而且持续增长。并且主从的内存使用量并不一致。   二、分析可能原因:  1.  redis-cluster...
  • shuyun123456789
  • shuyun123456789
  • 2016年03月12日 21:39
  • 2974

redis内存优化、持久化以及主从复制

Redis 数据库内存优化参数的配置,每种持久化方式的利与弊以及主从复制的原理 常用内存优化手段与参数 redis的性能如何是完全依赖于内存的,所以我们需要知道如何来控制和节省内存。 首先最重要的...
  • QH_JAVA
  • QH_JAVA
  • 2015年05月03日 10:11
  • 2492
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:减少php-cgi进程降低vps内存占用
举报原因:
原因补充:

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