對于IIS管理員來說,經常會碰到Web服務器CPU占用100%的情況,以下是個人的日常工作總結和一些解決辦法,主要用來剖析w3wp.exe(IIS?)占用CPU?100%的一些原因?和解決方案,希望能對你有所幫助
w3wp.exe的解釋:全名,IIS?Application?Pool?Process。?w3wp.exe是IIS工具的一部。w3wp.exe是在IIS(因特網信息服務器)與應用程序池相關聯的一個進程,如果你有多個應用程序池,就會有對應的多個w3wp.exe的進程實例運行。這個進程用來分配大量的系統資源。
引起?w3wp.exe(IIS?)?Cpu占用100%的常見原因如下:
1.?Web?訪問量大,從而服務器壓力大而引起的
這個也是最常見的情況。如果?Web訪問量大,特別是同時在線人數過多,處理的Requests?Current(當前請求數)過高,就會同時對IIS和服務器造成較大的壓力。特別是?服務器需要不斷的運算,往客戶端發送生成后的頁面,這些都需要占用大量的CPU資源,從而造成Cpu?100%
2.?動態頁面(.aspx)的程序邏輯復雜程度
這個問題,對?w3wp.exe的CPU占用?來說也是蠻嚴重的,可能在訪問量級比較小的情況下并沒有多少影響,但是在高并發的網站上面來說,特別是Asp.Net的Requests?Current超過250的時候,將會是w3wp.exe占用CPU的一個重要的因素。
我曾經碰到過這樣一個情況,兩個?web(A和B)在兩臺?配置相當的?服務器中部署,且兩個站點的訪問量都很大,訪問頁面都集中在兩個站點的兩個單獨頁面,且這兩個頁面?的IIS連接數都是50個左右,但是頁面程序的復雜程度就錯了很多,A站點中的頁面,只有幾個?簡單的Repeater綁定,?而B站點中的頁面,則有大量的綁定、字符串過濾替換、Repeater嵌套綁定等等。這樣的情況,在?大流量、高并發的環境中,A站點?在IIS連接數?達到3?W多的時候,CPU占用仍然是50?%左右,而B站點在IIS連接數?達到7K左右的時候,CPU就90%多了,造成了?服務器的壓力很大,并且IIS遭到了堵塞。
3.?頁面程序中有死循環
如果Web訪問量不大,但是CPU卻占用很高,那么頁面中的程序肯定有死循環或者性能比較嚴重的?程序語句
4.?Http方式下載的站點
如果站點是HTTP形式下載站,也遇到過w3wp.exe占用CPU?100%的情況
5.?服務器資源不會自動釋放
有時,一個站點的流量在一個小時內陡增,結果操作系統分配了比較多的?CPU資源,但是當流量下去后,w3wp.exe占用的CPU并沒有及時釋放,仍然在保持在90%以上
6. 對 IIS 日志文件操作
比如此時分析 IIS 日志文件里面的數據,把 IIS Log 日志導入到數據庫中等操作,也會造成此現象
解決辦法:
1.?快速定位到出問題的站點
利用iisapp?-a命令,快速的定位到出問題的站點。當然如果當前服務器只跑了一個web站點,那么此步驟可以跳過
在?cmd中?輸入iisapp?-?a,會出現下圖中的信息:
當然,這個要求你沒個站點,都要有獨立的應用程序池與之對應,應用程序池的名稱,最好就是站點的名稱,如下圖:
關于?IIS的應用程序池的配置,這里就不說了,不懂的可以search下
之后,再打開任務管理器,如下圖:
觀察進程為?w3wp.exe的,查看那個CPU占用的高,再利用其PID于iisapp中列出的結果對比,就能輕松的找出是那個站點占用的CPU過高了
2.?重啟?IIS和?應用程序池
此步是緊急處理,一般都是治標不治本的步驟。如果你的站點搭建的有?負載均衡(負載均衡、NLB),那么請在?負載均衡(負載均衡、NLB)把當前服務器下了,然后重啟。如果你沒有?負載均衡(負載均衡、NLB),而且你的站點又是在線的,那么,就悲劇10多秒吧,短暫的不能訪問吧
3.?給頁面加上頁面級別緩存
如果Web是Asp.Net程序,那么請一定要。但是有好多人都沒有用好OutputCache,導致經常出現下載頁面的問題,所以都放棄了使用,這里有
OutputCache?非常有用,好處有三:直接從內存讀頁面,頁面響應速度更快,用戶體驗更好;大大的降低了服務器的壓力,特別是對于高并發的網站,特別是CPU的壓力;減少了DB的強求,降低DB(數據庫)的壓力。
4.?檢查頁面邏輯
如果WEB流量很低,但是還有w3wp.exe(IIS?)?CPU占用100%左右的情況,那么就檢查頁面的代碼邏輯吧,很有可能是死循環或大量的運算導致。