自已電腦上裝的apache突然間,內存及cpu占用率一直飆升。 找了篇文章解決了。順便發來這里轉轉
所謂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 :
<IfModule mpm_winnt.c>
Win32DisableAcceptEx # 禁止使用AcceptEx()
</IfModule>
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請求的文件及執行的時間,然后查找出執行時間比較長的地址進行分析排查。
日志格式設置如下:
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用于將日志文件進行分割的應用程序,可以在 http://cronolog.org/ 下載
CustomLog “|bin/cronolog.exe e:/%Y%m%d.log” vhost_common
原文出處: http://www.javatang.com/archives/2008/01/22/0615259.html