win2008解决php-cgi进程过多占用系统内存,导致服务器卡死

灰暗的星星灰暗的星星灰暗的星星灰暗的星星灰暗的星星
 
分类:技术文章

最近处理一个客户问题,遇到这样一个问题,具体现象是:网站打不开,访问显示被拒绝访问;服务器远程桌面无法连接;通过平台控制台查看服务器状态,发现服务器响应异常慢;查看内存监控数据,发现内存使用率超过90%。通过以上这些现象基本可以判断服务器内存资源不够用,导致服务器无法持续运行,发生宕机。具体排查过程是这样的:1、在平台尝试重启服务器,并通过控制台查看服务器启动状态,发现服务器启动到登陆界面后,进入系统非常缓慢。在等待了差不多10分钟左右时间,终于进到了桌面,此时远程还无法正常连接(ps 正常情况

最近处理一个客户问题,遇到这样一个问题,具体现象是:网站打不开,访问显示被拒绝访问;服务器远程桌面无法连接;通过平台控制台查看服务器状态,发现服务器响应异常慢;查看内存监控数据,发现内存使用率超过90%。通过以上这些现象基本可以判断服务器内存资源不够用,导致服务器无法持续运行,发生宕机。

具体排查过程是这样的:

1、在平台尝试重启服务器,并通过控制台查看服务器启动状态,发现服务器启动到登陆界面后,进入系统非常缓慢。在等待了差不多10分钟左右时间,终于进到了桌面,此时远程还无法正常连接(ps 正常情况下这时已经可以连接了),又等了5分钟左右,资源管理器才启动起来,桌面图标终于出现。

2、这时网络服务还没正常启动,服务器网络还没连通,打开任务管理器后,发现很多php-cgi进程,内存使用率90%多,服务器操作很卡,为了释放内存,以便操作,停止了IIS服务器。从这里基本可以判断是因为php-cgi进程过多导致系统内存资源耗尽,刚开机资源就不够用(ps 该客户服务器是2G内存),所以需要调整php-cgi进程数限制,并且建议客户升级服务器配置。

说明:php-cgi是在2008以上系统中使用的php脚本处理程序,来自PHP官方的一个比较正式的解释是:php-cgi进程并没有内存泄漏,php-cgi会在每个请求结束的时候回收脚本使用的全部内存,但是并不会释放给操作系统,而是继续持有以应对下一次PHP请求。这样做大概是为了减少内存碎片化或者解决从系统申请内存之后又释放回操作系统所需要的时间不可控问题。可是如果偶然一次PHP请求使用了诸如ftp或者zlib这样的大内存操作,那么将导致一大块系统内存被php-cgi持续占有,不能被利用。

3、打开IIS服务器,在根节点中打开下图标注的fastcgi设置

4、如果只安装了一个版本的php,在这里只会显示一个,如果安装了多个版本,会依次列出,因此需要修改每个php-cgi的设置,尽可能的减小实例数,为系统节省内存(ps 系统默认是对php-cgi进程实例数不做限制,因为在一些大流量访问的访问来说,增加php-cgi进程会提高网站访问性能,但同时也会带来内存使用率的增加,因为不能一味的增加php-cgi进程数,需要和系统配置互相平衡,这样才能发挥最大的性能,一旦因为进程过多导致内存不够用,则会起到相反的作用,严重影响服务器运行,甚至宕机)。

具体设置方法如下是:依次选中每个php-cgi,右键选择编辑,打开设置对话框,如下图

如下图,可以看到,默认的最大实例数是0,也就是不做限制,这时如果访问量增大,系统就会创建新的php-cgi进程来处理请求,而且由于php-cgi进程的内存回收机制影响(上文已提及),会使内存使用率增加。因此,这里我们适当的减小最大实例数,建议再给系统预留40%可用内存的情况下,按照每个php-cgi进程占用15M内存计算最大实例数,比如系统内存是2G,为系统预留40%可用内存后剩余1.2G,减去系统运行占用的内存(2008系统假设占用900M-1000M)则可以设置的进程数就是(1.2G-1G)/15M=13,也就是说2G内存的2008系统服务器,设置最大进程数13个是合适的。这样基本可以保证服务器运行正常,也能发挥最好的网站访问效果。 建议最大请求数保持默认不要修改,切不可设置太小,以免进程异常退出。