在windows server 2003中對於每一個web應用,iis 6.0都用一個獨立的w3wp.exe的執行個體來運行它。w3wp.exe也稱為背景工作處理序(每一個主機頭都會有一個)
直接在工作管理員中結束進程是不起作用的,結束後不久它會執行啟動,要想結束它可以在iis中找到相應的應用程式集區停止相應的應用程式集區工作。
這些都不是解決辦法,它的根本問題是你的那個網站程式有問題,在找到問題以前可以先開啟iis找到應用程式集區先用右鍵屬性中設定“效能”把其中的cpu設成大於60%關閉應用程式集區,把關閉時間和開啟時間設短一些比如10秒,這樣當您的網站程式大量佔用系統資源時iis自動快速回收進程並且快速啟動進程,您的網站暫時還可以將就著工作。
要解決根本問題還要從程式查起,您可以在iis中的應用程式集區中右鍵建立多個應用程式集區,然後在每個主機頭中的檔案家選項的底部將應用程式集區對應道剛才建好的應用程式集區,然後一個一個關閉在工作管理員中看看是哪個程式佔用的資源較大。
下面是一些網友的相關貼子也許對大家有協助
朋友的web伺服器一直運行正常,但這幾天cpu佔用率一直將近100%,遂去看個究竟。
伺服器採用windows 2003, 網站使用asp+access資料庫, 查看進程列表發現w3wp.exe 佔用了70%以上的cpu,
查看web日誌,網站訪問量不大,查看tcp串連也不多。用net stop w3svc停掉web服務,cpu佔用立即正常,net start w3svc啟動web後不久現象又出來了。停止所有虛擬網站,建立一個虛擬網站發現並沒有問題,懷疑是網站本身的代碼問題。
檢查首頁代碼,大致是如下結構:
粗看一下並沒有問題,但就是這段代碼造成了w3wp.exe佔用大量cpu,難道是死迴圈?似乎沒有理由。在迴圈體內加入計數,發現確實是死迴圈,說明rs.eof一直為false,加入如下代碼:
if rs.eof = true then response.write "eof is true"
if rs.eof = false then response.write "eof is false"
發現輸出竟然是eof is true eof is false, 說明無法判斷rs.eof的值,為何如此百思不得其解。檢查資料庫,發現庫中並沒有mytable表, 如果該表不存在,rs.open "select * from mytable", conn 就會出錯,為何沒有出錯,很有可能捕獲的異常被忽略了。
檢查包含檔案conn.asp, 發現了異常處理代碼:
on error resume next
原來問題在此。
on error resume next忽略了查詢表時的失敗以及後續的錯誤,造成進入死迴圈。
那為何網站本來運行正常,現在卻找不到mytable表了呢?仔細檢查網站才發現“有‘客'自遠方來”,上傳了後門工具、刪除了多張資料表,害我忙活了一天。
更多的內容大家還可以到:http://www.microsoft.com/china/technet/security/guidance/secmod93.mspx
尋找更詳細的安全設定
windows2003 iis6.0假死問題解決
這幾天伺服器總是運行緩慢,遠程登入後發現一個w3wp.exe的進程佔用了100% cpu。
問題的原因最終找到兩個:
1.採用的jet 資料庫連接方式存在問題:http://support.microsoft.com/?id=838306
補丁下載:
chs:windowsserver2003-kb838306-x86-chs.exe
enu:windowsserver2003-kb838306-x86-enu.exe
2.將access資料庫副檔名改為asp
下面是我的差錯過程和解決方案:
搜尋一下發現類似問題還真不少,那個w3wp的進程是iis6.0的應用程式集區,網上的說法有兩種,一是因為asp或者asp.net代碼中含有死迴圈引起的。但是伺服器上這麼多網站,誰知道那個網站出了問題。二是由於上面的jet串連資料庫方式的bug引起的,下載838306的補丁,或者升級到sp1可以解決這個問題,但是打了這個補丁後,有些網站的問題依然存在。
又去搜尋,有人說將每個網站建立獨立的應用程式集區,應用程式集區的安全性帳戶設為本地服務即可。方法如下:
首先建立應用程式集區:
然後將網站的應用程式集區指向剛才建立的應用程式集區:
在建立完所有應用程式集區後,統一修改應用程式集區的屬性:
將應用程式集區安全帳戶指定為本地服務:
設定完這些之後,問題依然存在,這樣一個網站出現問題,不致影響其他網站,但是這個網站仍然佔用大量資源,導致其它網站響應緩慢。不過在工作管理員中出現了每個應用程式集區的進程,因此可以找到具體出問題的進程了。
下面是尋找出錯網站的過程:要找到這個網站,必須把有問題的進程跟該網站的應用程式集區聯絡起來。首先設定工作管理員的查看方式,加入pid的顯示:
然後再命令列運行iisapp -a,可以看到pid跟應用程式集區的對應關係:
再去iis中看該應用程式集區對應的網站,有問題的網站就找到了,剩下的就是這個網站代碼中的問題了。
在某位網站管理員的糾纏不休下,我終於無法忍受,幫他找錯誤- - 無數次配置iis,網站程式也換了,該升級的也升級了,問題還是存在,黔驢技窮,把網站下載到本地看看到底怎麼回事。當我試圖開啟他的資料庫的時候,問題出現了:
他的資料庫是.asp的副檔名,要先修改為.mdb才能開啟,但是當我點擊要改名字的時候,我的電腦沒有響應了~!看來問題在這個資料庫了。
用命令列rename之後,開啟資料庫,修複,似乎沒有任何問題,但是再改為.asp時,又出現了剛才的問題。哈~原來是.asp的副檔名在作怪。
但是我試著將其他的資料庫改為.asp,沒有問題。根本原因不得而知,望知情者告知。
最後,在iis中隨便添加了一個isapi對應到mdb,造成mdb無法執行,防止下載,將所有的.asp的資料庫改回.mdb,問題解決。
1.w3wp.exe,應用程式,應用程式集區之間的關係
一個應用程式集區可以包含多個應用程式,一個應用程式集區建立一個w3wp.exe進程.那麼我們就不能簡單的說一個應用程式對應一個w3wp.exe進程了!
其實是多個應用程式對應一個w3wp.exe進程的.
2.如何啟動和關閉w3wp.exe這個進程
w3wp.exe這個進程將在你訪問www應用程式的時候啟動.有人就會這麼問了:"我啟動了一個web應用程式,發現系統自動建立了一個w3wp.exe進程。但我關閉這個web應用程式後,發現這個剛建立的w3wp.exe進程還在,請問如何關閉該進程。"
這個進程不會在你關閉了這個程式以後,就馬上關閉的.那是因為http是不需連線的訪問,當你關閉了web網頁,不會返回相應的關閉資訊,所以w3wp.exe這個進程不會因為你關閉了web應用程式爾關閉.
那麼如何關閉這個進程呢?在應用程式集區的配置中,"空閑逾時"中設定合適的時間,系統預設的是20分鐘.設定好指定的時間,那麼在這個時間範圍內沒有在訪問應用程式,那麼系統會自動的關閉w3wp.exe這個進程的.而不需要我們人為的幹預的.
要是你有這個精力的話,也可以在windows工作管理員裡面,結束這個進程的生命(^_^)!
3.如何讓w3wp.exe進程長時間的運行.
w3wp.exe這個進程的預設生命是1740分鐘,但依然是在這種預設的自然規律下,w3wp.exe將在自己失業20分鐘後,被系統直接槍殺.
這樣就可以看出,要想讓w3wp.exe長時間的生存,那我們可以通過”空閑逾時”不作處理來達到我們的目的.
這樣可是缺點多多,但是為了達到個人的私慾,這又算什麼.本來也不是什麼正式的項目.
4.如何降低w3wp.exe佔用的記憶體和cpu
結合網上的諸多建議,主要的解決辦法是:
a.在iis中對每個網站進行單獨的應用程式集區配置;
b.合理的配置你的應用程式集區;