httpd.exe的CPU居高不下的另外一个处理办法

apache logo  昨天装好了PostgreSql之后,发现PostgreSql的CPU超高,当时通过Application Stack Builder也同时安装了EnterpriseDB-ApachePHP,发现安装完之后,httpd.exe的CPU也居高不下,一直徘徊在40%(双核中一个核的占用量)左右,昨天晚上由于时间关系没有办法具体细看问题,所以遗留到今天处理。

  首先是PostgreSQL,今天重启之后,一看CPU竟然是用正常了?!我什么都没有做——除了昨天关机,今天开机。难道是安装完全后没有重启的原因?测试了下,创建数据库正常。然后找到系统日志,发现昨天的日志中有很多像下面这样的记录:

2012-08-29 23:50:23 HKT 警告:  pgstat wait timeout
2012-08-29 23:51:29 HKT 警告:  pgstat wait timeout
2012-08-29 23:52:35 HKT 警告:  pgstat wait timeout
2012-08-29 23:53:41 HKT 警告:  pgstat wait timeout
2012-08-29 23:54:48 HKT 警告:  pgstat wait timeout
2012-08-29 23:55:54 HKT 警告:  pgstat wait timeout
2012-08-29 23:57:00 HKT 警告:  pgstat wait timeout
2012-08-29 23:58:06 HKT 警告:  pgstat wait timeout

至于其他的,就没有发现了,看到今天日志已经没有这些个警告了,也就暂时先缓了一下,转手处理httpd.exe的问题来。以前Apache安装之后,运行起来相当顺利,这次安装EnterpriseDB-ApachePHP之后,怎么会出现这种问题呢。打开Apache下面的logs目录,看到error.log昨天晚上短时间内就有11M的大小。打开error.log看到的满屏都是下面这个错误:

[Thu Aug 30 09:49:50 2012] [error] (OS 10038)在一个非套接字上尝试了一个操作。  : Child 3180: Encountered too many errors accepting client connections. Possible causes: dynamic address renewal, or incompatible VPN or firewall software. Try using the Win32DisableAcceptEx directive.

这个是什么问题,从字面上来看是说:在接受客户端连接的时候,遇到太多的错误,可能的原因是:动态地址的更新,或是不兼容的VPN或者防火墙软件。请尝试使用Win32DisableAcceptEx

Win32DisableAcceptEx从字面的意思就是要我们在 Windows 下关掉 AcceptEx这个功能。AcceptEx 是什么功能,可以参考下Apache 的说法:

http://httpd.apache.org/docs/2.0/mod/mpm_winnt.html#win32disableacceptex

上面说明使用Win32DisableAcceptEx就是使用Accept()这个方法来替代AcceptEx()这个方法来接受网络连接。

我没有使用VPN,有个防火墙。按照网上的说法要配置http.conf,在配置文件中找到mpm_winnt.c,修改如下:

<IfModule mpm_winnt.c>
Win32DisableAcceptEx #加入這一行
ThreadsPerChild 250
MaxRequestsPerChild 0
</IfModule>

配置文件解决问题是个非常简单直接明了的方法,不过,我倒是想看看,我的系统(Windows 2003 Sp2)为什么不能用了。于是我选择了继续寻找,在了解之后,发现引起这个问题的原因是Windows下的Winsock2,在这里面,如果Winsock2损坏或者修改了就可能导致这个问题。

那按着这条路走,首先在cmd下使用:

netsh winsock show catalog

查看下所有的当前winsock2的配置(这里补充下:用Windows久了的也许更习惯于使用这个方法:开始->运行->msinfo32.exe->组件->网络->协议,在右边可以看到所有的当前配置),网上说有10个系统自带的,我的找出了远远不止10个,这里不细说,最主要的是在里面看到了很多很多Xunlei和Youku的两个,这个会不会影响,我第一印象是,Xunlei好像在下载前会要求我改啥来着,不知道是不是这个问题。既然不是原来的东西,Xunlei和Youku现在这两在我机器上基本上不用了,已然是个废物了,就清理下吧。命令行下继续输入:

netsh winsock reset

这个命令是在Winsock2不太灵光的时候,负责重置Winsock目录为清除状态,帮助里面说,重置之后,“必须重新安装以前安装的所有 Winsock 分层服务提供程序。此命令不影响 Winsock 名称提供程序项。” 这对安装了很多Winsock分层服务提供程序的人来说,不是个好选择,但对我来说,正好!

重置之后,系统会要求我们重新启动,Ok,just do it!

重启之后,进入系统看到httpd.exe已经在运行了,CPU占用0%,查看日志,没有异常。

 

后记:

  本文记录的这个方法并不一定适用所有情况,在一般情况下,为了保证系统的正常运行下,在httpd.conf中修改httpd的运行配置来解决Apache中httpd.exe的问题,是个明智的选择。推而广之,当软件出现问题时,我们尽可能的在软件本身解决问题,是个更加明智的选择,这样更不会将问题扩散到同系统中其他的应用上。

Thursday, August 30, 2012 | 其他技术

文章评论

  • # re: httpd.exe的CPU居高不下的另外一个处理办法
    • 1
    • 5/24/2013 4:09 PM
    1

发表评论

Please add 7 and 4 and type the answer here:

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。