2012年3月4日 星期日

調整Apache佔用CPU高使用率的問題

所謂Apache出現CPU高佔用率就是指Apache在一段時間內持續佔用很高的CPU使用率,甚至達到CPU100%,這個時候造成網站無法訪問。解決的方法就是仔細觀察Apache的日誌文件,查閱錯誤的信息。下面我們針對幾種錯誤信息進行分析並給出解決的方法: 1. Apache與Wi
所謂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 :
  1. <IfModule mpm_winnt.c>
  2. Win32DisableAcceptEx # 禁止使用AcceptEx()
  3. </IfModule>
2)使用System Repair Engineer(SREng)查看WinSocket供應者,如果出現非MS的陌生項則將其刪除,並使用軟件的“重置WinSocket”按鈕進行重置。
3) 卸載與Apache相衝突的殺毒軟件或防火牆軟件。
如果進行上面的三個步驟之後還有問題,那應該看看是不是還有下面的錯誤。
2. “Terminating 1 threads that failed to exit”錯誤
上面錯誤中的數字1有可能是其他數字,造成這個錯誤的原因是Apache在退出並發線程的時候出現線程溢出,從而造成內存洩露,表現出來的就是Apache所佔用的系統資源持續增長。
解決的方法也很簡單,將最大請求線程的值降低一些,但是也不能太低,太低的話會產生大量的請求隊列從而造成站點訪問緩慢。如果之前為0則將其設置為一個最大值。
  1. MaxRequestsPerChild 10000
3. “file .\\server\\mpm\\winnt\\child.c, line 1078, assertion “(rv >= 0) && (rv < threads_created)” failed” 錯誤
這個錯誤是Apache的一個bug(#11997),可以通過Win32DisableAcceptEx禁止Apache使用WinSocket v2來避免此bug,具體設置見前述。
4. 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就可以了。
5.病毒或木馬程序命名為Apache.exe
有的時候病毒或木馬程序會將其名稱命名為Apache.exe文件達到一種掩飾的目的,這個時候使用第三方進程分析器查看進程的路徑然後將其刪除或使用殺毒軟件清除就可以了。
6.程序編寫不嚴謹造成死循環等錯誤
如果上面的問題都不存在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>