apache占用cpu过大怎么办
答案:2 悬赏:30 手机版
解决时间 2021-02-17 20:23
- 提问者网友:鐵馬踏冰河
- 2021-02-17 02:04
apache占用cpu过大怎么办
最佳答案
- 五星知识达人网友:你可爱的野爹
- 2021-02-17 02:59
所谓Apache出现CPU高占用率就是指Apache在一段时间内持续占用很高的CPU使用率,甚至达到CPU100%,这个时候造成网站无法访问。解决的方法就是仔细观察Apache的日志文件,查阅错误的信息。
下面针对几种错误信息进行分析并给出解决的方法:
1. Apache与WinSock v2相冲突
Apache官方提供的手册 中提到,在Windows系统下Apache2.x为了提高性能而使用了Microsoft WinSock v2 API,但是一些常见的防火墙软件会破坏他的正确性,从而使得Apache出现死循环操作造成CPU100%。
可以依次采用下面的方法来解决上问题,如果进行了一步还有问题就继续下一步:
1) 在httpd.conf文件中使用 Win32DisableAcceptEx 禁止Apache使用 Microsoft WinSock v2 API :
Win32DisableAcceptEx # 禁止使用AcceptEx()
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%的问题。
解决的方法就是从http://www.php.net/releases/ 下载5.2.1版本,将压缩包中的libmysql.dll文件覆盖现在的文件,然后重启Apache就可以了。
6. 病毒或木马程序命名为Apache.exe
有的时候病毒或木马程序会将其名称命名为Apache.exe文件达到一种掩饰的目的,这个时候使用第三方进程分析器查看进程的路径然后将其删除或使用杀毒软件清除就可以了。
7. 程序编写不严谨造成死循环等错误
如果上面的问题都不存在Apache依然产生CPU100%的问题的话,通常来说就应该是Web程序自身的问题了,例如死循环等等。这个时候需要在日志中设置HTTP请求的文件及执行的时间,然后查找出执行时间比较长的地址进行分析排查。
下面针对几种错误信息进行分析并给出解决的方法:
1. Apache与WinSock v2相冲突
Apache官方提供的手册 中提到,在Windows系统下Apache2.x为了提高性能而使用了Microsoft WinSock v2 API,但是一些常见的防火墙软件会破坏他的正确性,从而使得Apache出现死循环操作造成CPU100%。
可以依次采用下面的方法来解决上问题,如果进行了一步还有问题就继续下一步:
1) 在httpd.conf文件中使用 Win32DisableAcceptEx 禁止Apache使用 Microsoft WinSock v2 API :
Win32DisableAcceptEx # 禁止使用AcceptEx()
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%的问题。
解决的方法就是从http://www.php.net/releases/ 下载5.2.1版本,将压缩包中的libmysql.dll文件覆盖现在的文件,然后重启Apache就可以了。
6. 病毒或木马程序命名为Apache.exe
有的时候病毒或木马程序会将其名称命名为Apache.exe文件达到一种掩饰的目的,这个时候使用第三方进程分析器查看进程的路径然后将其删除或使用杀毒软件清除就可以了。
7. 程序编写不严谨造成死循环等错误
如果上面的问题都不存在Apache依然产生CPU100%的问题的话,通常来说就应该是Web程序自身的问题了,例如死循环等等。这个时候需要在日志中设置HTTP请求的文件及执行的时间,然后查找出执行时间比较长的地址进行分析排查。
全部回答
- 1楼网友:廢物販賣機
- 2021-02-17 03:42
Apache是某些Linux系统自带的服务器程序, 不知道你是出于何种原因装了这个,Windows下Aapche服务器的卸载于一般应用程序的卸载相似,直接使用其卸载程序进行卸载就可以了。卸载完成后可以使用CClean等软件清理下注册表,或者直接使用revouninstaller等软件在卸载的同时清理相关文件和注册表信息。
需要注意的是,由于Windows下的Apache是以MSI软件包的形式安装的,所以,卸载的时候必须满足如下条件:
1.系统中必须安装了Windows Install 3.1 or Higher
2.卸载时没有运行其它Windows Install 程序
3.Apache的安装维护包没有丢失,否则在卸载的时候会提示"找不到安装源"。
当出现这种情况的的时候,推荐的操作是"重新下载同样版本的软件,然后进行修复安装或全新安装,最后再卸载"。不推荐强制删除文件,手动清理注册表。(残留信息可能导致将来Apache版本的安装出错)
如果不还是不行, 你试着在系统中搜索一下Apache这个文件夹,找到删除后清理注册表即可.
需要注意的是,由于Windows下的Apache是以MSI软件包的形式安装的,所以,卸载的时候必须满足如下条件:
1.系统中必须安装了Windows Install 3.1 or Higher
2.卸载时没有运行其它Windows Install 程序
3.Apache的安装维护包没有丢失,否则在卸载的时候会提示"找不到安装源"。
当出现这种情况的的时候,推荐的操作是"重新下载同样版本的软件,然后进行修复安装或全新安装,最后再卸载"。不推荐强制删除文件,手动清理注册表。(残留信息可能导致将来Apache版本的安装出错)
如果不还是不行, 你试着在系统中搜索一下Apache这个文件夹,找到删除后清理注册表即可.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯