当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Apache提示CPU占用率高解决办法

    栏目:Linux/apache问题 时间:2019-06-25 16:40

      所谓Apache出现CPU高占用率就是指Apache在一段时间内持续占用很高的CPU使用率,甚至达到CPU100%,这个时候造成网站无法访问。解决的方法就是仔细观察Apache的日志文件,查阅错误的信息。
     
      下面针对几种错误信息进行分析并给出解决的方法:
     
      1.Apache与WinSockv2相冲突
     
      Apache官方提供的手册中提到,在Windows系统下Apache2.x为了提高性能而使用了MicrosoftWinSockv2API,但是一些常见的防火墙软件会破坏他的正确性,从而使得Apache出现死循环操作造成CPU100%。
     
      可以依次采用下面的方法来解决上问题,如果进行了一步还有问题就继续下一步:
     
      1)在httpd.conf文件中使用Win32DisableAcceptEx禁止Apache使用MicrosoftWinSockv2API:
     
      <IfModulempm_winnt.c>
     
      Win32DisableAcceptEx#禁止使用AcceptEx()
     
      </IfModule>
     
      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<threads_created)”failed”错误
     
      这个错误是Apache的一个bug(#11997),可以通过Win32DisableAcceptEx禁止Apache使用WinSocketv2来避免此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请求的文件及执行的时间,然后查找出执行时间比较长的地址进行分析排查。