概述
很多系統的性能問題,是由內存導致的。內存不夠會導致頁面頻繁換入換出,IO隊列高,進而影響數據庫整體性能。
排查
內存對數據庫性能非常重要。那么我當出現問題的時候,我們怎么排查性能問題呢?
存在問題
主要查看2個部分。頁生命周期 Page Life Expectancy,和 lazy writer /sec.
頁生命周期 的參考值在很久很久以前,很多同學可能看到過,建議值是300s。但是這是基於32位操作系統,最大只能使用4GB內存給出的。 Jonathan Kehayias and Ted Krueger 的書A Guide for the Accidental DBA 有給出一個當下的參考值:Buffer Pool / 4 GB * 300 。 當然這值只是一個參考值。如果你發現系統的頁生命周期長期低於某個值,或者經常出現劇烈的波動,那說明內存可能存在問題。
lazy writer /sec 如果長期大於1 ,就需要關注了。
注意:如果你的系統使用了NUMA。可能會遇到lazy writer /sec 很高,但 Page Life Expectancy非常穩定的情況。這個問題不太常見,暫不詳述。
內存分布
判斷內存存在問題后,我們需要查看內存的分布。
1.總內存,使用中,可用內存
2.SQL SERVER使用的內存
注意
有的同學可能會遇到,服務器內存使用快滿了,但是從上面圖中看到的內存使用很少。內存被誰用掉了,是內存泄漏嗎?當然不是。原因是SQL SERVER 內存使用可以分為緩沖池和非緩沖池內存。在開啟了 鎖定內存頁 選項后,在任務管理器中只能看到非緩沖池內存部分。
3.緩沖池
這種情況下,怎么查看緩沖池的內存怎么呢?通過SQL SERVER :Memory Manager Total server memory 來查看
4.非緩沖池內存分布
SELECT M.type, SUM(M.virtual_memory_reserved_kb) AS VirtualMemoryReservedKB, SUM(M.virtual_memory_committed_kb) AS VirtualMemortCommitedKB, SUM(M.shared_memory_committed_kb) AS SharedMemroyCommittedKB, SUM(M.shared_memory_reserved_kb) AS SharedMemroyReservedKB, SUM(M.multi_pages_kb) AS MultiPagesKB, SUM(M.single_pages_kb) AS SinglePagesKB, SUM(M.multi_pages_kb)+SUM(M.single_pages_kb) AS TotalPagesKB FROM sys.dm_os_memory_clerks M GROUP BY M.type ORDER BY TotalPagesKB DESC
已經按照內存使用排序,找到使用內存最多的部分。分析使用的原因,並解決。
案例
某客戶的客戶系統使用緩慢,通過上面的排除方法依次排查,最后找到是非緩沖池部分的 MEMORYCLERK_SQLOPTIMIZER占用內存太多造成
解決
sp_configure N'show advanced options',1 GO reconfigure GO sp_configure N'optimize for ad hoc workloads',1 GO sp_configure N'show advanced options',1 GO reconfigure GO
開啟上面的選項后,內存仍然沒有自動釋放。重啟SQL SERVER 服務,釋放掉已經使用掉的內存。
參考
https://simplesqlserver.com/2013/08/19/fixing-page-life-expectancy-ple/ 詳細講解PLE