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

SQL Server 內存被系統進程擠壓案例分析:Remote Registry 服務內存洩漏導致 Target Memory 驟降

     編輯:關於SqlServer

案例背景

  • 服務器:64GB 物理內存,SQL Server 實例。
  • 現象:CPU 偶發報警 (閾值 15%),頻率逐漸增加。
  • 排查無高耗 CPU 查詢,活動監視器顯示無明顯昂貴查詢。

排查路徑與關鍵發現

1. 監控基線對比

Cacti 圖表顯示某日後 System\Processor Queue Length 和 sqlservr\%ProcessorTime 同時顯著上升,提示系統級壓力而非 SQL 內部查詢問題。

2. SQL 內存計數器異常

  • Target Server Memory:僅 500+ MB (預期應接近 60GB)。
  • Stolen Pages:佔用 200+ MB。
  • Database Pages (Data):僅 200+ MB 可用。
  • Page Life Expectancy (PLE):僅 26 秒 (健康值通常 > 3000,甚至上萬)。
  • Buffer Cache Hit Ratio:98% (看似正常,實則不可信,因內存極小導致邏輯讀幾乎全命中緩存)。
💡 核心洞察:緩存命中率在內存嚴重不足時會虛高,PLE 和 Target Memory 才是真實內存壓力指標。

3. 系統進程佔用內存

任務管理器 → 顯示所有用戶進程 → 按內存排序:svchost.exe 佔用 60GB+!

4. 定位具體服務

使用 Process Monitor (ProcMon) 或 Resource Monitor 關聯 svchost.exe PID,發現其承載服務為 Remote Registry (遠程註冊表)。

5. 確認已知 Bug

搜索關鍵詞 windows server 2008 r2 remote registry memory leak,命中微軟 KB:

KB2699780:在 Windows 7 / Server 2008 R2 上,遠程查詢性能計數器會導致本地 Remote Registry 服務內存持續增長,直至耗盡可用內存。

解決方案與驗證

方案一:安裝熱修復 (需重啟)

  1. 下載並安裝 KB2699780 對應補丁。
  2. 重啟服務器生效。

方案二:重啟 Remote Registry 服務 (緊急繞過,無業務影響)

net stop "Remote Registry"
net start "Remote Registry"

服務重啟後,SQL Server Target Memory 迅速回升至 60GB+,CPU 歸於正常,PLE 穩步上升。

事後復盤與預防體系建設

建立內存監控儀表板

  • 核心指標:Target Server Memory (KB), Total Server Memory (KB), Page Life Expectancy, Available MBytes (系統可用內存)。
  • 告警閾值:Target Memory 持續低於配置上限 80%、PLE < 300、系統可用內存 < 10%。

同步發現另一台同款故障服務器

部署監控 1 天后,發現另一台業務庫同樣出現 Target Memory 驟降、svchost 佔用高內存,同樣重啟 Remote Registry 服務恢復。驗證了監控體系的有效性。

總結:DBA 的價值在於「防患於未然」

  • 性能問題多有前兆,內存洩漏是緩慢擠壓過程,而非突發。
  • 關注 Target Memory、PLE、系統可用內存 趨勢變化,而非單一時點的 CPU/命中率。
  • 善用系統工具 (任務管理器、Resource Monitor、ProcMon) 定位非 SQL 進程壓力。
  • 建立基線、自動化告警、事後複盤機制,將「救火」轉為「防火」。

關鍵性能計數器速查

計數器健康基線異常含義
SQLServer:Memory Manager\Target Server Memory接近 Max Server Memory 設定值被系統回收/擠壓,或配置過低
SQLServer:Memory Manager\Total Server Memory接近 Target實際使用量,滯後於 Target
SQLServer:Buffer Manager\Page Life Expectancy> 3000 (OLTP), > 300 (OLAP)頁面在緩存平均壽命,低表示內存壓力大
SQLServer:Buffer Manager\Buffer Cache Hit Ratio> 95%參考值,內存極小時會虛高
Memory\Available MBytes> 總內存 10%系統可用內存,低表示外部壓力
Process(sqlservr)\Working Set穩定進程工作集,被 Trim 時驟降
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved