同事分享冷知識一枚,依據微軟官方建議,我平時順手就來一發的 IISRESET,是 IIS 5.0 時代的產物,IIS 6.0 後已不建議使用,登楞!!

原文是這麼寫的:

IISReset.exe is a command-line utility that was introduced in IIS 5.0 that could be used to stop, start, and restart IIS Internet services. Its use is not recommended for IIS 6.0 and is not supported in IIS 7.0 or IIS 7.5.
Note: Restarting or stopping IIS, or rebooting your Web server, is a severe action. When you restart the Internet service, changes to the metabase can be lost. All sessions connected to your Web server are dropped, and any data held in Web applications is lost. All Internet sites are unavailable until Internet services are restarted. For these reasons, the use of IISReset is not recommended.

大意是 IISRESET 是 IIS 5.0 引進可重啟 IIS 的工具程式,不建議在 IIS 6.0 使用,且 IIS 7.0 後將不再支援。理由是重啟 IIS 或重開機是一個 Server 層級動作,可能造成 Metabase 修改遺失,網站連線會被丟棄、記憶體資料也會遺失,網站會無法使用直到服務啟動,故不建議使用。

查了一下,IIS 6.0 始於 Windows 2003,若 IISRESET 不該用,我豈不錯用了 21 年?


IIS 版本對照表 參考

不過呢,我注意到該文件的最近更新日期是 2009,適用 Windows Server 2008 R2,文章上方有警示 "We're no longer updating this content regularly.",代表文件久未更新,資訊可能已過時。我決定打破砂鍋,探索這個議題。

文件有個 "Restarting IIS (IIS 6.)" 連結提供詳情,但超連結已失效,我找到網友留存的備份,裡面提到不建議使用 IISRESET 的理由:

  1. IIS 6.0 已新增更優雅的重啟選項:有 AppPool 可停止啟動重啟,非必要別重啟整台 IIS
  2. IIS 跟 FTP、NMTP、SMTP 也有關,若只是要重啟 Web,沒必要全部一起暫停服務重啟
  3. 過往 IIS 5 必須 IISRESET 是因為 IISAdmin 跟 W3SVC 綁在一起(shared the same application space),IIS 6 起二者為獨立 Process,IISAdmin 停止時,W3SVC 仍可執行但被通知 Metabase 來源異常中止,IIS 則會在 IISAdmin 恢復後再連上 W3SVC。

我另外查到一篇 IISRESET: the WORST way to restart your IIS website 有更完整的闡述,給足不該用 IISRESET 的理由:

  1. 過去有些 Registry 異動需重啟 IIS 套用,IIS 7+ 已能自動偵測並套用 IIS 修改,需重啟的機會已大幅減少。(註:但經驗不乏有其他設定需 IISRESET 生效,例如:ODP.NET)
  2. IIS 6 加入 AppPool 架構,單一網站有問題重啟 AppPool 即可,沒必要整台網站重啟
  3. 回收(Recycle) AppPool 會另起新 Process,原 Process 會等請求處理完才結束,讓客戶端無感,是更優雅的作法
  4. 下圖是 IISRESET 的運作流程,步驟多時間長(數秒到數十秒),中間會有一段時間使用者會看到 503:

    若外,若 IISRESET 程序失敗將可能讓 IIS 留在停機狀態。
    下圖是不同重啟方式的網站停機時間及網頁錯誤次數,回收 AppPool 是首選:

    若非用 IISRESET 不可,以下是更嚴謹的做法:
    iisreset /stop /timeout:60
    taskkill /F /FI "SERVICES eq was"
    iisreset /start
    
  5. IISRESET 是系統不穩、Memory Leak、網站當死、CPU 飆高等各式疑難雜症的鋸箭特效藥,但過度依賴會錯失根本解決問題的機會,埋下日後大爆炸的種子。

另外,在這篇部落格有提到 IISRESET 如遇 IISAdmin 停不掉會強制砍程序(應是導致 IIS Metadata 遺失的情境),並中止所有使用 IISW3ADM.DLL 的程序。(用 IISRESET /NOFORCE 可改善,它只會跑 NET STOP IISADMIN /Y,停不掉就算了不會砍 Process)

到這裡,差不多可以理解 IISRESET 的缺點:拉長服務中斷時間,降低網站可用性,但看起來並無嚴重後遺症,不到罪無可赦的程度。且十多年前 IIS 7.0+ 將不再支援 IISRESET 的計劃看來也修改了,至今 IIS 10 都還支援 IISRESET,故我認為它仍是可用選項。

話說回來,如果目的是重啟網站,你有其他更輕巧快速的做法,例如:

  • PowerShell 回收特定 AppPool:(Get-IISAppPool <AppPoolName>).Recycle() 參考
  • PowerShell 重啟特定 AppPool:Restart-WebAppPool <AppPoolName>Restart-WebAppPool (Get-Website -Name <YourSiteName>).ApplicationPool 參考
  • 重啟所有 AppPool:NET STOP W3SVC && NET START W3SVC 或 PowerShell Restart-Service W3SVC

當然,如果不在乎網站中斷(例如開發或測試環境),也不介意等久一點(以及發生機率不高的 Metadata 遣失),指令短又好記是 IISRESET 的最大優點,是能少打幾個字的簡單粗暴選項。估評過缺點跟風險仍決定使用,便是思考過的取捨而非不明究理盲用,我可以接受。

結案。

IISRESET has been declared as not recommended for use after IIS6. This article explores the issues that may be caused by using IISRESET and how to properly restart IIS websites.


Comments

# by 艾里克斯

使用時機正確就是好工具,二十幾年沒冤枉的:p

# by 小克

回饋 typo:IISREST

# by 小雞

如果是某特定站台呢?? NET STOP W3SVC + ??

# by Jeffrey

to 小克,竟一口氣打錯六處,廢到笑了。感謝指正。

# by Jeffrey

to 小雞,指 IIS 有多個 WebSite,WebSite 有多個 WebAppliation 使用不同 AppPool?

Post a comment