解决Apache出现的CPU高占用率的问题
来源:互联网 发布:云计算erp系统 编辑:程序博客网 时间:2024/05/05 15:39
所谓Apache出现CPU高占用率就是指Apache在一段时间内持续占用很高的CPU使用率,甚至达到CPU100%,这个时候造成网站无法访问。解决的方法就是仔细观察Apache的日志文件,查阅错误的信息。
下面我们针对几种错误信息进行分析并给出解决的方法:
1. Apache与WinSock v2相冲突
Apache官方提供的手册中提到,在Windows系统下Apache2.x为了提高性能而使用了MicrosoftWinSock v2 API,但是一些常见的防火墙软件会破坏他的正确性,从而使得Apache出现死循环操作造成CPU100%。
其错误提示如下所示:
[error] (730038)An operation was attempted on something that isnot a socket.: winnt_accept: AcceptEx failed. Attempting torecover.
[error] (OS 10038) : Child 3356: Encountered too many errorsaccepting client connections. Possible causes: dynamic addressrenewal, or incompatible VPN or firewall software. Try using theWin32DisableAcceptEx directive.
[warn] (OS 121)信号灯超时时间已到。 : winnt_accept: Asynchronous AcceptExfailed.
[warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptExfailed.
可以依次采用下面的方法来解决上面的问题,如果进行了一步还有问题就继续下一步:
1) 在httpd.conf文件中使用 Win32DisableAcceptEx 禁止Apache使用 MicrosoftWinSock v2 API :
- <IfModule mpm_winnt.c>
- Win32DisableAcceptEx # 禁止使用AcceptEx()
- </IfModule>
2) 使用System RepairEngineer(SREng)查看WinSocket供应者,如果出现非MS的陌生项则将其删除,并使用软件的“重置WinSocket”按钮进行重置。
3) 卸载与Apache相冲突的杀毒软件或防火墙软件。
如果进行上面的三个步骤之后还有问题,那应该看看是不是还有下面的错误。
2. 是否加载了第三方模块(so文件)
Apache2.x要求所有的第三方模块都必须是线程安全的,但有很多第三方的模块可能存在内存泄露,因此时间一长就可以极大的消耗Apache资源。所以可以采用将所有的第三方模块逐个关闭的方法看看运行一段时间之后Apache对资源的占用是否有所改善。
3. “Terminating 1 threads that failed toexit”错误
上面错误中的数字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 tofinish.
Child 1952: Waiting 120 more seconds for 1 worker threads tofinish.
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%的问题。
解决的方法就是从http://www.php.net/releases/下载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#设置程序执行时间
<VirtualHost xxx.xxx.xx.xx:80>
ServerName xxx.xxx.com
DirectoryIndex index.php index.html index.htm
DocumentRoot “xxx”
# cronolog.exe是Apache自带的用于将日志文件进行分割的应用程序
CustomLog “|bin/cronolog.exe e:/%Y%m%d.log” vhost_common
</VirtualHost>
参考资料:
apache 遇到[error] (OS 10038) 错误
Error in my_thread_global_end(): 1 threads didn’texit
Apache 2.2.x (ASF) faulting module errors
Need some advice on Apache 2.2.4 PHP 5.2.3 MYSQL4.0.26
查看Apache并发请求数及其TCP连接状态
Apache Bug 11997
关于apache.exe开机占用cpu100%的终极解决方法
apache cpu占用100%的问题。
空间持续CPU100%时间过长,如何优化程序
- 解决Apache出现的CPU高占用率的问题
- 解决Apache出现的CPU高占用率的问题
- 解决Apache出现的CPU高占用率的问题
- cpu占用,解决Apache出现的CPU高占用率的问题
- VPS使用xampp Apache出现的CPU高占用率的问题
- 怎样定位CPU占用率高的问题
- 解决CPU占用率过高的问题
- 解决cpu占用率过高的问题
- ros路由器cpu占用率高的原因和解决
- 解决polkit-gnome-manage CPU占用率高的现象
- 小议 Thread.sleep(0) 造成 CPU占用率高的问题
- linux问题排查 - 高cpu占用率的进程和线程
- eclipse在ubuntu16.04下cpu占用率高的问题
- IIS解决CPU和内存占用率过高的问题
- CPU占用率高的九种可能
- CPU占用率高的N种原因
- CPU占用率高的九种可能?
- 找出cpu占用率高的sql语句
- WEB基础信息提供服务设想
- 主板驱动导致电脑死机故障
- 不用电的微星主板风扇
- MSI微星主板MSI Dual CoreCenter监控软件 2.0.1.5
- Dell 640m上的Debian Linux CPU/风扇/按键
- 解决Apache出现的CPU高占用率的问题
- 电脑黑屏案例入手分析解决显卡常见故障
- [系统增强]驱动程序智能选择工具 7.0 Final[可支持多声卡、多显卡]简体中文绿色版
- 经典C/C++算法
- [硬件相关]夏雨专用驱动光盘 11.0 Build 0218┊装机必备驱动盘包括常见驱动┊简体中文版
- 不好我不发出来,2008最新驱动大全(万能驱动光盘),
- [广州]AMD主板新丁报到!磐正超磐手NF520上市
- Windows Mobile 6注册表修改大全
- 工程师爆料!笔记本维修行业惊天黑幕