SQL調優日志--內存問題排查入門篇


概述

很多系統的性能問題,是由內存導致的。內存不夠會導致頁面頻繁換入換出,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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM