httpd.exe是apache的一個進程,有了它我們的網站才正常運行,但最近我發現我的httpd.exe占cpu 100%一直高居不下,下面我來分享一些解決辦法。
網上說了是我們沒有限制apache的并發數與子進行數,后來百度得出下面代碼,編輯httpd.conf
- Win32DisableAcceptEx ##加入這行
- ThreadsPerChild 250
- MaxRequestsPerChild 0
重啟apache就解決了。
MaxRequestsPerChild這個指令設定一個獨立的子進程將能處理的請求數量。在處理“MaxRequestsPerChild 數字”個請求之后,子進程將會被父進程終止,這時候子進程占用的內存就會釋放,如果再有訪問請求,父進程會重新產生子進程進行處理。
如果MaxRequestsPerChild缺省設為0(無限)或較大的數字(例如10000以上)可以使每個子進程處理更多的請求,不會因為不斷終止、啟動子進程降低訪問效率,但MaxRequestsPerChild設置為0時,如果占用了200~300M內存,即使負載下來時占用的內存也不會減少。內存較大的服務器可以設置為0或較大的數字。內存較小的服務器不妨設置成30、50、100,以防內存溢出
另一種解決辦法
如果你以前是沒有問題,突然有問題了而且服務器安裝了金山毒霸,這個可能是金山毒霸或者升級精靈修改了WINSOCK導致
解決辦法
在win命令行cmd下,輸入以下命令
- netsh winsock reset
還有可能碰到一種情況就是否cpu沒有點,內存占很高或突然卡死過一會就好了,這個解決辦法可嘗試在httpd.conf加入
- <IfModule mpm_winnt.c>
- ThreadsPerChild 1000
- MaxRequestsPerChild 10000
- Win32DisableAcceptEx
- </IfModule>
最后上面的辦法解決了不根本的問題,我們可以對apache進行優化,最常用的就是apache緩存優化。
apache緩存分為兩種緩存模式(mod_disk_cache與mod_mem_cache):
mod_disk_cache
一個基于磁盤的存儲管理模塊。
基于硬盤文件存儲的緩存由mod_disk_cache 模塊實現:
- <IfModule mod_cache.c>CacheDefaultExpire 3600
- CacheMaxExpire 86400
- CacheLastModifiedFactor 0.1
- <IfModule mod_disk_cache.c>
- CacheRoot /usr/local/apache/cache
- CacheEnable disk /
- CacheDirLevels 5
- CacheDirLength 3
- CacheMaxFileSize 10000000
- CacheMinFileSize 1
- </IfModule>
- </IfModule>
拷貝上面內容到apache 的 httpd.con文件中,在httpd.conf文件中搜索:
- #LoadModule cache_module modules/mod_cache.so // 去掉前面的# 號
使用磁盤文件緩存:
- #LoadModule disk_cache_module modules/mod_disk_cache.so // 去掉前面的# 號
mod_mem_cache
一個基于內存的存儲管理模塊。mod_mem_cache可以被配置為兩種不同的操作模式:①緩存打開的文件描述符;②在堆(heap)上緩存對象。mod_mem_cache既可以用于緩存本地生成的內容,也可以用于為反向代理模式下的mod_proxy緩存后端服務器輸出的內容。
基于內存的緩存主要由 mod_mem_cache 模塊實現:
- <IfModule mod_cache.c>
- <IfModule mod_mem_cache.c>
- CacheEnable mem /
- MCacheSize 4096
- MCacheMaxObjectCount 2000
- MCacheMinObjectSize 1
- MCacheMaxObjectSize 2048
- </IfModule>
- </IfModule>
安裝完成之后,需要搜索
- LoadModule cache_module modules/mod_cache.so // 去掉前面的# 號
使用內存文件緩存:
- #LoadModule mem_cache_module modules/mod_mem_cache.so // 去掉前面的# 號
新聞熱點
疑難解答