办理Apache呈现的CPU高占用率的问题

所谓Apache呈现CPU高占用率就是指Apache在一段时间内一连占用很高的CPU利用率,甚至到达CPU100%,这个时候造成网站无法会见。办理的要领就是仔细调查Apache的日志文件,查阅错误的信息。

下面我们针对几种错误信息举办阐明并给出办理的要领:


1. Apache与WinSock v2相斗嘴
Apache官方提供的手册中提到,在Windows系统下Apache2.x为了提高机能而利用了Microsoft WinSock v2 API,可是一些常见的防火墙软件会粉碎他的正确性,从而使得Apache呈现死轮回操纵造成CPU100%。

其错误提示如下所示:

[error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx failed. Attempting to recover.

[error] (OS 10038) : Child 3356: Encountered too many errors accepting client connections. Possible causes: dynamic address renewal, or incompatible VPN or firewall software. Try using the Win32DisableAcceptEx directive.

[warn] (OS 121)信号灯超时时间已到。 : winnt_accept: Asynchronous AcceptEx failed.

[warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.

可以依次回收下面的要领来办理上面的问题,假如举办了一步尚有问题就继承下一步:

1) 在httpd.conf文件中利用 Win32DisableAcceptEx 克制Apache利用 Microsoft WinSock v2 API :

<IfModule mpm_winnt.c>

Win32DisableAcceptEx # 克制利用AcceptEx()

</IfModule>

2) 利用System Repair Engineer(SREng)查察WinSocket供给者,假如呈现非MS的生疏项则将其删除,并利用软件的“重置WinSocket”按钮举办重置。

3) 卸载与Apache相斗嘴的杀毒软件或防火墙软件。

假如举办上面的三个步调之后尚有问题,那应该看看是不是尚有下面的错误。


2. 是否加载了第三方模块(so文件)
Apache2.x要求所有的第三方模块都必需是线程安详的,但有许多第三方的模块大概存在内存泄露,因此时间一长就可以极大的耗损Apache资源。所以可以回收将所有的第三方模块逐个封锁的要领看看运行一段时间之后Apache对资源的占用是否有所改进。


3. “Terminating 1 threads that failed to exit”错误
上面错误中的数字1有大概是其他数字,造成这个错误的原因是Apache在封锁并发线程的时候呈现线程溢出,从而造成内存泄露,表示出来的就是Apache所占用的系统资源一连增长。

详细来说,Apache的子历程在竣事当前请求之前会首先将所有的并发线程举办封锁,在封锁的时候会期待3分钟,假如3分钟之内没有将所有的线程封锁则会抛出上述的错误提示,然后强制封锁。这样就造成了内存溢出,时间一长会使得Apache所占用资源一连增长直到无法事情。这个时候可以适当将MaxRequestsPerChild的值低落,使得Apache子历程所并发的线程数量淘汰,从而低落该错误呈现的几率。

可是这种方法并不能彻底办理问题,幸好Apache2.0.x的最新版本(2.0.63)办理了之前版本的这个问题,假如3分钟之内有线程没有封锁的话会自动按照时间环境再增加期待竣事的时间直到最终将所有的线程竣事。日志文件中会呈现雷同下面的信息:

Child 1952: Waiting 150 more seconds for 2 worker threads to finish.
Child 1952: Waiting 120 more seconds for 1 worker threads to finish.
Child 1952: All worker threads have exited.


4. “file .\\server\\mpm\\winnt\\child.c, line 1078, assertion "(rv >= 0) && (rv < threads_created)" failed” 错误

这个错误是Apache的一个bug(#11997),可以通过 Win32DisableAcceptEx 克制Apache利用WinSocket v2来制止此bug,详细配置见前述。


5. PHP5.2.1以上版本的libmysql.dll与MySQL5不兼容
PHP5.2.1今后的新版本(截至今朝最新版本为5.2.5)顶用于毗连MySQL的libmysql.dll组件与MySQL5不兼容,在Apache中运行PHP的时候会造成Apache发生CPU100%的问题。

办理的要领就是从下载5.2.1版本,将压缩包中的libmysql.dll文件包围此刻的文件,然后重启Apache就可以了。


6. 病毒或木马措施定名为Apache.exe
有的时候病毒或木马措施会将其名称定名为Apache.exe文件到达一种掩饰的目标,这个时候利用第三方历程阐明器查察历程的路径然后将其删除或利用杀毒软件排除就可以了。


7. 措施编写不严谨造成死轮回等错误
假如上面的问题都不存在Apache依然发生CPU100%的问题的话,凡是来说就应该是Web措施自身的问题了,譬喻死轮回等等。这个时候需要在日志中配置HTTP请求的文件及执行的时间,然后查找出执行时间较量长的地点举办阐明排查。

日志名目配置如下:

LogFormat "%v %h %l %u %t [%Ts] \"%r\" %>s %b" vhost_common #配置措施执行时间

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8382.html