案例背景
- 環境:Windows Server 2008 R2,64 GB 實體記憶體,SQL Server 實例配置 Max Server Memory 56 GB。
- 現象:CPU 使用率長期飆升至 15%+ (告警閾值),Cacti 監控顯示 System Processor Queue Length 與 sqlservr %Processor Time 同步異常升高。
- 初步排查:活動監視器無高耗 CPU 查詢;效能計數器顯示 SQL Server Target Memory 僅 500 MB (預期 56 GB),Stolen Pages 200 MB,Data Pages 僅 200 MB,PLE (Page Life Expectancy) 僅 26 秒 (健康值通常 > 3000),但 Buffer Cache Hit Ratio 仍高達 98% (誤導性指標)。
根因追踪
- 任務管理員 / Process Explorer:發現 `svchost.exe` (PID xxx) 佔用 60 GB 記憶體。
- Process Monitor / services.msc:該 `svchost.exe` 承載 Remote Registry 服務。
- Google 關鍵字:`windows server 2008 r2 remote registry memory leak` → 命中已知 Bug:
「使用 Win7/2008 R2 機器查詢遠端電腦效能計數器時,本機 Remote Registry 服務記憶體持續增長直至耗盡可用記憶體。」 (KB 2618732 / KB 2640589)
解決與驗證
緊急緩解 (無需重啟資料庫)
net stop "Remote Registry"
net start "Remote Registry"
服務重啟後,SQL Server Target Memory 逐步回升至 60 GB+,PLE 從 26 秒增長至數萬秒,CPU 使用率恢復正常。
永久修復
- 安裝對應 Hotfix (KB 2618732) 或升級至 Windows Server 2012 R2 / 2016+。
- 若無法立即修補,建立排程工作每日低峰期重啟 Remote Registry 服務。
事後改善:建立記憶體監控儀表板
關鍵計數器 (建議 1 分鐘採樣):
SQL Server:Memory Manager → Target Server Memory (KB)
SQL Server:Memory Manager → Total Server Memory (KB)
SQL Server:Buffer Manager → Page Life Expectancy
Process(sqlservr) → Working Set / Private Bytes
Memory → Available MBytes
System → Processor Queue Length
設定告警:
① Target Memory 持續 < 設定值 80% > 10 分鐘 → 告警
② PLE < 300 秒 → 告警
③ Available MBytes < 4 GB → 告警
經驗總結
- 記憶體壓力多來自外部:SQL Server 記憶體管理機制會主動釋放記憶體回應 OS 壓力 (RESOURCE_MEMPHYSICAL_LOW),導致緩存大幅縮減、PLE 驟降、CPU 飆升 (因頻繁磁碟 I/O 取代記憶體存取)。
- 緩存命中率不可靠:高命中率僅代表「曾在緩存中找到資料」,不代表「緩存容量充足」。
- DBA 價值在於「防患未然」:建立基線監控、異常即時告警、定期複盤,將故障發現時間從「服務中斷後」前移至「指標異常初期」。
- 案例複用:同樣監控邏輯在另一台伺服器同樣偵測到 Remote Registry 記憶體洩漏,提前介入避免停機。