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