如何在 SQL Server 2008 上找到記憶體壓力故障的根本原因?
我一直在進行性能監控的其中一台伺服器開始從資源耗盡檢測器發出以下警告:
Windows 成功診斷出虛擬記憶體不足的情況。以下程序消耗的虛擬記憶體最多:sqlservr.exe (1560) 消耗 14960812032 字節,ReportingServicesService.exe (1936) 消耗 506359808 字節,w3wp.exe (7376) 消耗 273764352 字節。
SystemCommitLimit 38068215808 SystemCommitCharge 37800669184 ProcessCommitCharge 16727490560 PagedPoolUsage 359088128 PhysicalMemorySize 17098584064 PhysicalMemoryUsage 16881131520 NonPagedPoolUsage 221425664 程序 48
此伺服器是 windows server 2008,執行 MSSQL 2008 R2,具有 16GB 的 RAM 和 24 個處理器。它執行 SQL 和訪問 SQL for Data 的 Web 服務。
我在報價單中包含的數字來自事件查看器的詳細資訊部分。我無法確定根本原因。我已經知道 SQL 需要大量記憶體才能執行,而且當時它使用了大量記憶體,但我也將上限設置為 14000MB。
除了 Resource-Exhaustion-Detector 警告之外,SQL 還開始出現 Out of Memory 錯誤。
找到其根本原因的最佳方法是什麼?我沒有在日誌中看到任何看起來不尋常的東西。在這個錯誤一遍又一遍地重複了幾個小時之後,記憶體終於用完了,服務開始失敗,直到服務不得不重新啟動。
當有壓力時,SQL 還不夠聰明,不能放棄部分記憶體嗎?頁面文件(虛擬記憶體)為 20GB,而 SQL 僅使用 16GB 的物理記憶體。是什麼填滿了虛擬記憶體的其餘部分?SQL 是否真的使用了所有的頁面文件?
我應該尋找記憶體洩漏嗎?日誌文件增長?
伺服器上使用最多的 .mdf 每天增長約 100mb。日誌文件一次增長了 3gb,現在是 40gb。
通常當存在記憶體壓力時,我們從來沒有達到伺服器崩潰的地步。它通常只是緩慢地執行,直到壓力消失。
有沒有辦法有效地阻止這個問題的發生?
為了正確診斷這一點,我們需要更多資訊。
SQL Server 就像任何其他 Windows 程序一樣;它的虛擬地址空間可以遠大於物理RAM。如果它的任何部分使用記憶體映射文件,它甚至可以大於 RAM + 分頁文件。
SQL Server 中的調整參數是一種告訴它永遠不要使用超過“x”MB 的方法。您必須查看盒子上所有其他服務的峰值送出費用,從您的物理 RAM 數字中減去此費用,然後將剩餘部分提供給 SQL Server。據我所知,記憶體上限僅適用於 RDBMS,不適用於相關 SQL 伺服器服務的動物園。我在這裡可能是錯的。
所以,我們需要更多的數據來處理剩餘的流程。例如,您有一個消耗 273MB 的 IIS 工作程序;只有一個工作程序嗎?您是否安裝了防病毒軟體或備份軟體?
您可以使用 WSRM 來分析正在發生的事情,然後考慮應用記憶體上限。或者,我建議安裝更多 RAM。
要獲得記憶體去向的圖形視圖,請使用 Microsoft SysInternals 的 RAMMap 實用程序。