Sql-Server

SQL Server 記憶體

  • October 31, 2020

這是關於 SQL Server 記憶體的。當伺服器記憶體不足時,我們建議向硬體添加額外記憶體以解決 CPU 使用率問題。

但是在進行記憶體升級之前,作為故障排除的一部分,我們如何檢查/計算目前在實例上消耗的 SQL 記憶體。

例如:

伺服器名稱:XXXXXXXXXXXXX

安裝的物理記憶體 (RAM):64.0 GB

目前分配的 SQL Server 記憶體:58982 MB –> 58.982 GB

在這種情況下,我們在伺服器上只有一個實例 (MSSQLSERVER),並且按照標準為實例分配了 80% 的記憶體。20% 分配給應用程序和作業系統。

當我們檢查資源監視器時,它將顯示為 80% 填充,因為我們已將 SQL Server 記憶體設置為該值。

但這並不意味著 80% 的 SQL 被完全利用,因為 SQL 會在後端的緩衝區中保留一些空間。當我上網時,我得到了下面的公式來計算實例上消耗的 SQL 記憶體,但是這些參數早就在性能監控工具上被刪除了。

有沒有辦法檢查,目前在我們可以進行記憶體升級的指標上,80% (OR) 中的 SQL 使用了多少。

計算 SQL 記憶體的公式:(以下參數已從性能監視器中刪除)

*Database Usage(GB) = (Totalpages-Freepages-Stolenpages)8/1024=MB/1024=GB

我們如何檢查/計算實例上目前消耗的 SQL 記憶體。

這很簡單。你有 DMV sys.dm_os_process_memory會給你資訊。它會給你physical memory usedtotal memory used (RAM+Page file)

   select (physical_memory_in_use_kb/1024) as Phy_Mem_used_MB, (virtual_address_space_committed_kb/1024) as Total_mem_Used_MB
  from sys.dm_os_process_memory

但這並不意味著 80% 的 SQL 被完全利用,因為 SQL 會在後端的緩衝區中保留一些空間

一旦 SQL Server 達到最大伺服器記憶體值,它將保留該記憶體,除非記憶體不足通知要求它釋放記憶體。所以是的,它可能沒有全部使用它,但它仍然會持有它。這稱為記憶體,因為這有助於避免硬頁面錯誤。

有沒有辦法檢查,目前在我們可以進行記憶體升級的指標上,80% (OR) 中的 SQL 使用了多少。

就像我說的那樣,一旦使用它就會顯示所有已使用的記憶體,即使它在查詢處理中不需要這些頁面。當新請求到來時,這些頁面將被移出以為新頁面騰出空間。

你如何定義“利用”?一秒鐘前讀入記憶體的頁面,會被視為已使用嗎?一分鐘前?一小時?一周?

關鍵是沒有“利用”之類的東西。SQL 伺服器將頁面(和其他東西)保存在記憶體中。當存在記憶體壓力(內部或外部)時,傳統的記憶體老化機制(基本上)用於刪除最近最少使用的內容。當然,記憶體(記憶體)處理還有更多細節,但原則上它的處理方式與任何記憶體機制一樣。

因此,諸如“已利用”或最佳配置之類的概念根本不存在。當然,您可以查看是否有一堆記憶體根本沒有被 SQL Server 使用。但是當 SQL server 分配記憶體時,它會一直掛在它上面,除非有記憶體壓力。誰知道,也許下一秒有人會需要那個頁面?

例如,您可以減少最大伺服器記憶體並查看性能何時開始受到影響。

引用自:https://dba.stackexchange.com/questions/278669