首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Windows 服務啟動超時根因分析:內存映射文件鎖定導致 150 秒延遲

     編輯:關於.NET

故障現場

機房斷電後服務器重啟,數據庫服務 (6大服務依賴鏈) 自動啟動失敗。手動啟動卻成功。排除文件損壞。

日志定位

  • 自動啟動日志:Snapshot 服務啟動耗時 150 秒後無後續日志
  • 系統事件查看器:Event ID 7022 Snapshot 服務啟動時掛起

超時機制

Windows 服務控制管理器 (SCM) 默認 30 秒 啟動超時。超時視為失敗並記錄掛起事件。

根因:鎖定大文件觸發磁盤狂讀

Snapshot 啟動時調用 VirtualLock 鎖定兩個 15GB 內存映射文件 (歷史數據緩存 + 補寫緩存)。
開機初始化階段,內存中無這些文件頁面 → 強制從機械磁盤讀取 30GB 數據 → 150 秒遠超 30 秒超時。

二次啟動極快的原因

Windows 內存管理器 不立即釋放卸載的映射文件頁面。首次啟動讀入內存後,服務失敗退出,頁面駐留在待頁池。
手動再次啟動時,頁面仍在內存 → 零磁盤讀取 → 3 秒完成鎖定。

解決方案對比

方案優點缺點
註冊表 ServicesPipeTimeout (DWORD, ms) 延長超時零代碼修改,立竿見影影響所有服務,治標不治本
優化啟動流程:延後鎖定 / 異步預讀 / 啟動後鎖定根治,啟動時間可控需修改服務代碼,測試成本高

關鍵註冊表

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
  ServicesPipeTimeout = 300000 (5分鐘, 單位毫秒)

核心心得

日志系統是故障分析的生命線。騷年,乖乖給程序加完善的日志吧!
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved