首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 記憶體被系統程序擠壓案例分析:svchost.exe (Remote Registry) 記憶體洩漏

     編輯:關於SqlServer

案例背景

  • 環境: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% (誤導性指標)。

根因追踪

  1. 任務管理員 / Process Explorer:發現 `svchost.exe` (PID xxx) 佔用 60 GB 記憶體。
  2. Process Monitor / services.msc:該 `svchost.exe` 承載 Remote Registry 服務。
  3. 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 → 告警

經驗總結

  1. 記憶體壓力多來自外部:SQL Server 記憶體管理機制會主動釋放記憶體回應 OS 壓力 (RESOURCE_MEMPHYSICAL_LOW),導致緩存大幅縮減、PLE 驟降、CPU 飆升 (因頻繁磁碟 I/O 取代記憶體存取)。
  2. 緩存命中率不可靠:高命中率僅代表「曾在緩存中找到資料」,不代表「緩存容量充足」。
  3. DBA 價值在於「防患未然」:建立基線監控、異常即時告警、定期複盤,將故障發現時間從「服務中斷後」前移至「指標異常初期」。
  4. 案例複用:同樣監控邏輯在另一台伺服器同樣偵測到 Remote Registry 記憶體洩漏,提前介入避免停機。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved