我是否需要向我的 SQL Server 2008 R2 實例添加更多記憶體?
有人問我,我們的 SQL Server 實例之一是否有足夠的記憶體。這是在具有 40 個 CPU 和 64 GB RAM 的 x64 電腦上執行的 SQL Server 2008 R2 標準版。
此實例下執行的所有數據庫的總大小略大於 300 GB。
該實例已配置為最小伺服器記憶體為 4096 MB,最大伺服器記憶體為 24000 MB。
到目前為止,我已經設法收集了以下資訊:
正在使用的物理記憶體:
SELECT physical_memory_in_use_kb, process_physical_memory_low, process_virtual_memory_low FROM sys.dm_os_process_memory physical_memory_in_use_kb process_physical_memory_low process_virtual_memory_low ------------------------- --------------------------- -------------------------- 25657180 0 0
性能計數器:
SELECT counter_name , cntr_value FROM sys.dm_os_performance_counters WHERE counter_name IN ('Total Server Memory (KB)', 'Target Server Memory (KB)', 'Granted Workspace Memory (KB)', 'Maximum Workspace Memory (KB)', 'Memory Grants Outstanding', 'Memory Grants Pending') counter_name cntr_value ----------------------------------- -------------------- Granted Workspace Memory (KB) 1024 Maximum Workspace Memory (KB) 17714520 Memory Grants Outstanding 1 Memory Grants Pending 0 Target Server Memory (KB) 24576000 Total Server Memory (KB) 24576000
緩衝池:
select count(*) AS Buffered_Page_Count ,count_big(*) * 8192 / (1024 * 1024) as Buffer_Pool_MB from sys.dm_os_buffer_descriptors Buffered_Page_Count Buffer_Pool_MB ------------------- -------------------- 2499693 19528
緩衝池大小圖:
BPHR:
裝滿:
計劃記憶體大小:
每秒頁面讀取次數
每秒頁面寫入次數
我的問題是:
我應該看的其他東西是什麼?
如果以上就足夠了,我是否必須建議添加更多記憶體(可能是 50 GB),因為 PLE 會隨著時間的推移而下降(而總 IO 等待時間顯示會增加)?
目標伺服器記憶體等於最大記憶體集。如果配置了實例,這是否表明實例可以利用更多記憶體?
那麼,我如何知道我的 SQL Server 是否需要更多記憶體?或者它沒有
我應該看的其他東西是什麼?
前幾句
這是在具有 40 個 CPU 和 64 GB RAM 的 x64 電腦上執行的 SQL Server 2008 R2 標準版。
為什麼你的最大記憶只有在
24000MB
你有64GB
物理記憶的時候?是否有其他實例/服務/…在其上執行?如果答案是否定的,那麼您可以將 max memory 設置為 about
56GB = 57344 MB
。附帶說明一下,sql server 2008 R2 沒有擴展支持。最好考慮遷移到更新的版本。
哪些對象正在消耗緩衝池記憶體
由於您的 PLE 一直很低,並且隨著時間的推移變得更低,您可以查看在一天中的不同時間點究竟是什麼在使用此 BP 記憶體。
首先看看哪些數據庫消耗最多:
-- get memory usage per database SELECT [DatabaseName] = CASE [database_id] WHEN 32767 THEN 'Resource DB' ELSE DB_NAME([database_id]) END, COUNT_BIG(*) [Pages in Buffer], COUNT_BIG(*)/128 [Buffer Size in MB] FROM sys.dm_os_buffer_descriptors GROUP BY [database_id] ORDER BY [Pages in Buffer] DESC;
之後,您可以在數據庫級別更深入地了解哪些對像在記憶體中,以及這些對像在記憶體中擁有多少頁。
-- get memory usage for objects in a database select count(*)as cached_pages_count, obj.name as objectname, ind.name as indexname, obj.index_id as indexid from sys.dm_os_buffer_descriptors as bd inner join ( select object_id as objectid, object_name(object_id) as name, index_id,allocation_unit_id from sys.allocation_units as au inner join sys.partitions as p on au.container_id = p.hobt_id and (au.type = 1 or au.type = 3) union all select object_id as objectid, object_name(object_id) as name, index_id,allocation_unit_id from sys.allocation_units as au inner join sys.partitions as p on au.container_id = p.partition_id and au.type = 2 ) as obj on bd.allocation_unit_id = obj.allocation_unit_id left outer join sys.indexes ind on obj.objectid = ind.object_id and obj.index_id = ind.index_id where bd.database_id = db_id() and bd.page_type in ('data_page', 'index_page') group by obj.name, ind.name, obj.index_id order by cached_pages_count desc;
如果更精細的查詢報告更少,則必須刪除
and bd.page_type in ('data_page', 'index_page')
以包含 LOB 數據頁。下一步
您應該將此資訊與系統上執行的查詢放在一起,您可能能夠優化某些查詢/添加索引,從而減少記憶體中需要的數據。
如果你想走得更遠,
ROW / PAGE
如果你有 CPU 能力,可以考慮壓縮。壓縮數據在記憶體中保持壓縮狀態。
另請注意,如果您使用的是 sql server 2008 R2 標準版,則只能轉到
64GB
max memory。從 sql server 2014 開始,這會達到128GB
最大記憶體。這也是遷移的另一個原因。如果以上就足夠了,我是否必須建議添加更多記憶體(可能是 50 GB),因為 PLE 會隨著時間的推移而下降(而總 IO 等待時間顯示會增加)?
僅基於 PLE,這不是唯一需要考慮的因素,我會說您的頁面過於頻繁地被刷新到記憶體之外。優化您的查詢或增加您的記憶體。
目標伺服器記憶體等於最大記憶體集。如果配置了實例,這是否表明實例可以利用更多記憶體?
目標伺服器記憶體 (KB) 是 SQL Server 在其目前負載下願意(可能)分配給緩衝池的記憶體量。Total Server Memory (KB) 是 SQL 目前已分配的記憶體。
它已將所有可能的記憶體分配給最大記憶體允許的緩衝池,它不會超過這個數量的緩衝池分配。
那麼,我如何知道我的 SQL Server 是否需要更多記憶體?或者它沒有
同樣,查看記憶體中的對像以及負責它的查詢是否可以優化將是一個好的開始。
此外,如果您有空間,我會增加最大記憶體(如果您實際上在機器上有 64GB 記憶體)或增加機器上的記憶體。
再次記住,
64GB
sql server 2008 R2 標準版有最大記憶體限制,並且128GB
從 sql server 2014 標準版開始增加。企業版沒有限制。