云服务器Apache提示CPU占用率高怎么解决?

[复制链接] |主动推送
查看44 | 回复0 | 2024-9-11 18:11:56 | 显示全部楼层 |阅读模式
  所谓Apache出现CPU高占用率就是指Apache在一段时间内持续占用很高的CPU使用率,甚至达到CPU100%,这个时候造成网站无法访问。解决的方法就是仔细观察Apache的日志文件,查阅错误的信息。

  下面针对几种错误信息进行分析并给出解决的方法:

  1.Apache与WinSockv2相冲突

  Apache官方提供的手册中提到,在Windows系统下Apache2.x为了提高性能而使用了MicrosoftWinSockv2API,但是一些常见的防火墙软件会破坏他的正确性,从而使得Apache出现死循环操作造成CPU100%。

  可以依次采用下面的方法来解决上问题,如果进行了一步还有问题就继续下一步:

  1)在httpd.conf文件中使用Win32DisableAcceptEx禁止Apache使用MicrosoftWinSockv2API:

  

  Win32DisableAcceptEx#禁止使用AcceptEx()

  

  2)使用SystemRepairEngineer(SREng)查看WinSocket供应者,如果出现非MS的陌生项则将其删除,并使用软件的“重置WinSocket”按钮进行重置。

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

  如果进行上面的三个步骤之后还有问题,那应该看看是不是还有下面的错误。

  2.是否加载了第三方模块(so文件)

  Apache2.x要求所有的第三方模块都必须是线程安全的,但有很多第三方的模块可能存在内存泄露,因此时间一长就可以极大的消耗Apache资源。所以可以采用将所有的第三方模块逐个关闭的方法看看运行一段时间之后Apache对资源的占用是否有所改善。

  3.“Terminating1threadsthatfailedtoexit”错误

  上面错误中的数字1有可能是其他数字,造成这个错误的原因是Apache在关闭并发线程的时候出现线程溢出,从而造成内存泄露,表现出来的就是Apache所占用的系统资源持续增长。

  具体来说,Apache的子进程在结束当前请求之前会首先将所有的并发线程进行关闭,在关闭的时候会等待3分钟,如果3分钟之内没有将所有的线程关闭则会抛出上述的错误提示,然后强制关闭。这样就造成了内存溢出,时间一长会使得Apache所占用资源持续增长直到无法工作。这个时候可以适当将MaxRequestsPerChild的值降低,使得Apache子进程所并发的线程数量减少,从而降低该错误出现的几率。

  但是这种方式并不能彻底解决问题,幸好Apache2.0.x的最新版本(2.0.63)解决了之前版本的这个问题,如果3分钟之内有线程没有关闭的话会自动根据时间情况再增加等待结束的时间直到最终将所有的线程结束。日志文件中会出现类似下面的信息:

  Child1952:Waiting150moresecondsfor2workerthreadstofinish.

  Child1952:Waiting120moresecondsfor1workerthreadstofinish.

  Child1952:Allworkerthreadshaveexited.

  4.“file.//server//mpm//winnt//child.c,line1078,assertion“(rv>=0)&&(rv
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则