开发者社区> 问答> 正文

大量php-cgi导致cpu占用过高

已经修改cgi设置,如下图







展开
收起
散步的鱼 2016-03-08 10:59:31 15117 0
4 条回答
写回答
取消 提交回答
  • 程序就是我的人生!
    看一下网站访问日志,是不是哪个页面被大量访问,看一下php访问错误日志,或许可以找到原因
    2016-03-08 12:41:42
    赞同 展开评论 打赏
  • Re大量php-cgi导致cpu占用过高
    感谢总版主回复,在第二个截图里面已经限制了cgi的连接数,请问还需要做什么设置?上面的文章太多,没有针对性。

    -------------------------

    Re大量php-cgi导致cpu占用过高

    日志文件太大,1G多 怎么看哪个页面被大量访问呢?
    2016-03-08 12:27:30
    赞同 展开评论 打赏
  • 论坛总版主
    FastCGI优化配置文件fcgiext.ini,它在%windir%\system32\inetsrv里。我们将尝试用两种办法进行配置:FastCGI管理脚本fcgiconfig.js;记事本编辑fcgiext.ini。
      脚本配置FastCGI
      打开你的命令行cmd.exe,切换到目录 %windir%\system32\inetsrv。复制下面内容,回车执行以下即可完成。请根据需要设置后面的参数。
      1 cscript fcgiconfig.js -set -section:"PHP" -InstanceMaxRequests:5000
      2
      3 cscript fcgiconfig.js -set -section:"PHP" -EnvironmentVars:PHP_FCGI_MAX_REQUESTS:5000
      4
      5 cscript fcgiconfig.js -set -section:"PHP" -RequestTimeout:360
      6
      7 cscript fcgiconfig.js -set -section:"PHP" -ActivityTimeout:120
      脚本的含义,分别是:
      设置应用程序池回收。FastCGI进程请求数达到InstanceMaxRequests数值5000,应用程序池将自动回收。默认值是1000。
      当环境变量PHP_FCGI_MAX_REQUESTS达到10000将自动回收应用程序池。
      RequestTimeout 设置请求超时时间,也就是请求允许的最大时间,如果FastCGI进程请求超过此设置将被禁止,值是90秒。
      ActivityTimeout 指定FastCGI进程请求的最大活跃时间,在设定时间内,FastCGI进程和IIS没有通信,将终止进程。默认值是70秒。
      注意:脚本命令是全局设置,针对服务器上所有以FastCGI运行的PHP网站。因此对于多站点的虚拟机来说,InstanceMaxRequests设置成PHP网站数X500相对理想。
      500是变数。如果有10个网站,那么200X50=5000,类推。流量大的服务器,数值设置过小频繁回收应用程序池,并不是什么明智的做法。——虽然,系统回收了不少资源。
      RequestTimeout数值过大,无疑将让更多消耗系统资源的请求运行;ActivityTimeout设置为120秒不活动就断开好,还是30秒不活动就断开好,因人而异。
      复制粘贴适合懒人
      FastCGI配置文件fcgiext.ini设置
      InstanceMaxRequests=10000
      EnvironmentVars=PHP_FCGI_MAX_REQUESTS:10000
      RequestTimeout=360
      ActivityTimeout=120
      把上面代码复制到fcgiext.ini的末尾,保存就好了。
      PHP5.3.6的优化配置
      PHP5.3.6的php.ini配置也分为两部分:关于FastCGI的配置;关于PHP本身的配置。我的PHP5.3.6安装在C:\PHP。
      PHP.ini关于FastCGI部分
      fastcgi.impersonate = 1
      cgi.fix_pathinfo=1
      cgi.force_redirect = 0
      PHP.ini关于自身的部分
      一、搜索extension_dir,去掉前面注释“;”,修改成:
      1 extension_dir = "c:/php/ext"
      二、搜索date.timezone,去掉前面注释“;”,修改成:
      1 date.timezone = "asia/shanghai"
      三、搜索下面,然后去掉前面的注视“;”
      extension=php_gd2.dll
      extension=php_mbstring.dll
      extension=php_mysql.dll
      如此这般你的PHP基本可以畅通无阻了。至于一些更高级的修改,我们没有必要研究那么深,不是吗?
      windows 2003+IIS6中优化fastcgi配置文件fcgiext.ini,减少php-cgi.exe进程数量和所占内存大小
      本来听说fastcgi比isapi好就在服务器中装上了,配置环境为windows 2003+IIS6+fastcgi(FCGI)+PHP5.2.17,经过与很长一段时间观察,发现工作在FastCGI模式下的PHP会占用越来越多的内存,访问量稍微多点php-cgi进程就多了N个,同样情况下能比原来用isapi模式的时候多出几百M,我的服务器内存只有2G伤不起啊。
      我在网上搜索了一下,发现还有不少人面临同样的问题。来自PHP官方的一个比较正式的解释是:php-cgi进程并没有内存泄漏,php-cgi会在每个请求结束的时候回收脚本使用的全部内存,但是并不会释放给操作系统,而是继续持有以应对下一次PHP请求。这样做大概是为了减少内存碎片化或者解决从系统申请内存之后又释放回操作系统所需要的时间不可控问题。可是如果偶然一次PHP请求使用了诸如ftp或者zlib这样的大内存操作,那么将导致一大块系统内存被php-cgi持续占有,不能被利用。
      解决这个问题的办法是在web服务器配置中优化fastcgi配置文件参数。
      在C:\WINDOWS\system32\inetsrv\fcgiext.ini 文件中可以设定php-cgi进程相关参数,如:
      [Types]
      php = PHP
      [PHP]
      ExePath=C:\php-5.3.8-nts-Win32-VC9-x86\php-cgi.exe
      maxInstances=100
      InstanceMaxRequests=10000
      EnvironmentVars=PHP_FCGI_MAX_REQUESTS:10000
      RequestTimeout=600
      ActivityTimeout=900
      在上面的配置中:
      ExePath 指定了FastCGI解析程序的路径,
      instanceMaxRequests 指定了每个实例可以处理的最大请求数,
      maxInstances 指定可以启动的最大实例数目,
      EnvironmentVars 创建了一个环境变量 PHP_FCGI_MAX_REQUESTS ,默认值设为10000,
      requestTimeout 指定了请求的超时时间为600秒,
      activityTimeout 指定了活动会话超时时间为900秒。
      一下是建议值:
      maxInstances=
      把这个值改小
      建议
      512M 内存的改maxInstances=50
      1G 内存的改maxInstances=80
      2G 内存的改maxInstances=140
      再修改
      InstanceMaxRequests=
      把这个值改小
      建议
      512M 内存的改InstanceMaxRequests=200
      1G 内存的改InstanceMaxRequests=300
      2G 内存的改InstanceMaxRequests=500
      改完, 重启IIS。
      instanceMaxRequests PHP_FCGI_MAX_REQUESTS 这两个参数决定了一个php-cgi进程被创建出来之后,最多接受的PHP请求数,在lighttpd中默认配置是10000。也就是说这个php-cgi进程每接受10000次PHP请求后会终止,释放所有内存,并重新被管理进程启动。如果把它降低,比如改成100,那么php-cgi重启的周期会大大缩短,偶然的高内存操作造成的问题影响时间也会缩短。
      maxInstances 这个参数指定可以启动的最大实例数目,即php-cgi.exe进程的数目。如果把它降低,比如改成100,那么在任务管理器的进程中最多只有php-cgi.exe进程,php-cgi.exe所占用的总内存将大大减少。
      我现在用的服务器为windows 2003操作系统,4G内存,一个php-cgi.exe程序占用7-25M内存,我把maxInstances值调为300,减少了php-cgi.exe进程的总数量,占用内存也减小了,反应速度比以前快了不少,至少调整到多少,可根据您的站点访问量来决定。
    2016-03-08 12:17:39
    赞同 展开评论 打赏
  • 修改一下参数配置,限制一下。
    2016-03-08 12:06:04
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
阿里云栖开发者沙龙PHP技术专场-直面PHP微服务架构挑战-高驰涛 立即下载
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载