在 Windows Server 2019 中為 SQL Server 執行個體釋放記憶體?

在 Windows Server 2019 中為 SQL Server 執行個體釋放記憶體?

我們有 Windows Server 2019 Standard (x64),記憶體為 64GB。

下面的螢幕截圖顯示記憶體使用率為 96%SQL Server Windows NT運行並使用 344.5 MB。

在此輸入影像描述

這是停止服務後的任務管理器SQL Server Windows NT。記憶體使用率下降至 8%。

在此輸入影像描述

我開始服務SQL Server Windows NT再次。任務管理器非常低,為 9%,但 Sql 伺服器現在使用的記憶體比記憶體使用率為 96% 時更多。 在此輸入影像描述

兩個問題:

  1. 內存有什麼問題嗎?
  2. 如何在不重新啟動 sql server 實例的情況下降低記憶體使用量?

答案1

這裡遺漏了一個重要的細節:任務管理器顯示 SQL Server 僅使用 344.5 MB RAM,但它實際上保留了更多(幾乎全部)供自己使用。任務管理器不會顯示此內容。任務管理器中的數字實際上並沒有達到系統記憶體的 97%,因為那裡沒有顯示保留記憶體。

您假設幾乎所有記憶體都被其他東西用完了,因此 SQL Server 無法使用超過 344.5 MB 的內存,這是完全錯誤的。它不是這樣工作的。任務管理器可能會產生很大的誤導,請查看實際的效能計數器。


更新以嘗試更好地解釋它。

SQL伺服器按設計將資料緩存在記憶體中,隨著時間的推移,它會耗盡系統中幾乎所有的可用記憶體;但是這個內存並沒有顯示在任務管理器中(或至少不是全部),因為SQL Server 試圖表現得很好並告訴操作系統“我想要這麼多內存,但它只是用於緩存,沒有它我也能生存,因此,如果需要,請隨時回收它」。這意味著任務管理器顯示 SQL Server 使用的記憶體比實際保留的記憶體少得多。

這是絕不是一個問題;這是有意而為之的。您看到的「問題」並不存在,只是您在任務管理器中看到的內容具有誤導性。

如果您停止 SQL Server,它當然會釋放所有已分配的內存,包括任務管理器中顯示的內存和未顯示的內存(更多)。當您再次啟動它時,它將使用很少的記憶體:隨著 SQL Server 將資料載入到記憶體中並對其進行緩存,使用量將隨著時間的推移再次增長。但大部分記憶將再次不是顯示在任務管理器中,因為該特定工具無法看到它。

我還要補充一點,如果 SQL Server 實際上需要內存,它會以不同的方式分配它並且然後工作管理員會顯示它;如果 SQL Server 實際上使用了 60 GB 內存,您會看到必需的那麼多內存,而不是僅僅將其用於緩存。

答案2

你在這台機器上運行 SQL Server,所以它正在做 SQL Server 所做的事情 - 它保留作業系統上(幾乎)所有可用的內存,這樣當它進行大查詢或其他操作時,它就不必分配 RAM ,它已經有了。

你有幾個選擇。

  1. 接受。如果您僅在此電腦上執行 SQL Server,那麼它會如預期運作。不要管它。
  2. 蓋上蓋子。如果您需要在此伺服器上執行其他工作負載,則可以限制 SQL 將保留的 RAM 量。

我絕對不會選擇選項 2,除非 SQL 永遠不會使用它所佔用的 RAM。只有在測量作業系統層級 SQL 效能計數器和 SQL 層級動態管理檢視時您才會知道這一點。

從大局來看,您實際上想解決什麼問題?在這種情況下,「釋放記憶體」是一項毫無意義的任務,除非您知道您正在將其釋放以供其他用途使用。您是否遇到 SQL 效能問題?

我要帶你去的是使用適當的監控來診斷效能問題。為此,您需要了解大量有關 SQL 的知識和相當多的有關 Windows 的知識。如果您不是 DBA,請僱用 DBA 或簽訂合同,或與您的軟體供應商合作(如果這是針對已購買產品的 SQL)。如果這是你的公司在沒有 DBA 的情況下自己寫的東西,那就去找一個吧。

https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/monitor-memory-usage?view=sql-server-ver15

預設情況下,隨著時間的推移,SQL Server 執行個體可能會消耗伺服器中大部分可用的 Windows 作業系統記憶體。一旦獲取內存,除非檢測到內存壓力,否則不會釋放。這是設計使然,並不表示 SQL Server 進程中存在記憶體洩漏。

/根據您的編輯進行編輯:

雖然我不是系統管理員,但在我看來,sql server 佔用的記憶體很少,因為其他所有內容都被 Windows 消耗了。

你在這裡幾乎肯定是錯的。正如我上面提到的,隨著時間的推移,SQL Server 將分配幾乎所有的系統 RAM。 sqlserver.exe 進程使用的 RAM 量並不能告訴您 SQL 實際上分配了多少 RAM。 DMV 和效能計數器會告訴您這一點。

我使用 SSMS 來處理資料庫,我直接注意到一切都很慢。即使是簡單的事情,例如打開表格窗格來查看我的所有表格,也需要一段時間,有時甚至會超時。

不要在 SQL 伺服器上運行它,而是從您的工作站運行它。

相關內容