程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> 更多數據庫知識 >> SQL Server 數據頁緩沖區的內存瓶頸分析

SQL Server 數據頁緩沖區的內存瓶頸分析

編輯:更多數據庫知識

SQL Server會把經常使用到的數據緩存在內存裡(就是數據頁緩存),用以提高數據訪問速度。因為磁盤訪問速度遠遠低於內存,所以減少磁盤訪問量同樣是數據庫優化的重要方面。

當數據頁緩存區出現內存不足,則會出現查詢慢,磁盤忙等等問題。

分析方法:主要是用到性能計數器。

查看如下性能計數器:

1. SQL SERVER:Buffer Manager-Lazy Writes/sec:內存不足則會頻繁調用Lazy Writer把數數據寫入磁盤,此值會經常不為0.

2. SQL SERVER:Buffer Manager-Page life expectancy:內存不足時,此計數器表現為下降趨勢或者一直停留在較低值。

3. SQL SERVER:Buffer Manager-Page reads/sec:內存不足時,則查詢那些經常使用但又沒有緩存在內存裡的數據時,就不需要讀取磁盤,這此值表現為持續上升或者停留在較高值。

4. SQL SERVER:Buffer Manager-Stolen pages:Stolen pages通常用於緩存執行計劃,以備重用。內存不足時,SQL Server本身機制會優先清除執行計劃緩存,則此值表現為下降或者較低水平。

查詢當前用戶任務等待:

復制代碼 代碼如下:
select * from sys.sysprocesses

如果內存不足則,會看到較多的ASYNC_IO_COMPLETION等待類型。這是因為內存不足時:a.內存和磁盤間會頻繁進行交互,磁盤負載增加 b.需要讀取磁盤上的數據完成查詢,磁盤負載增加。

也就是說這時候磁盤也出現了性能瓶頸,但是這只是“表面”的,我們要結合多個性能指標來認清根本原因是“內存不足”。

確定壓力來源及解決辦法:

通過前的分析,確定了數據頁緩存相關的內存瓶頸。就要分析為什麼會這樣及解決辦法。主要分為如下5個方面:

1. 外部壓力

如果OS層面或者其它應用服務需要更多的內存,windows會壓縮Database Pages的內存量。這時內存壓力來自外部。可以查看如下性能計數器確定是否是外部壓力:

1. SQL Server:Memory Manager-Total Server Memory:此計數器值會下降。

2. Memory:Available Mbytes:此值會下降到較低水平。

3. 在沒有使用AWE或者Lock page in memory前提下,查看Process:Private Bytes-SqlServer和Process:Working Set-SqlServer,兩者值會有顯著下降。

解決方法:如果非DB專用服務器,則要權衡各個應用服務之間重要性來分配內存或者加大內存。盡量讓服務器只運行SQL Server,成為DB專用服務器。

2. SQL Server自身對Database Page的使用壓力

當Total Server Memory已經達到設定的Max Server Memory或者無法從OS獲得更多內存,但是經常訪問的數據量又遠大於物理內存用於數據緩存的容量時,SQL Server被迫將內存的數據移入又移出,用於完成當前查詢。

觀察如下性能計數器:

1. SQL Server:Memory Manager-Total Server Memory 和 SQL Server:Memory Manager-Target Server Memory兩者值將會相等。但是前者不會大於後者。

2. 將會出現“分析方法”所述之情況。

解決方法:既然SQL Server沒有足夠內存存放Database Page,那就要麼增加SQL Server使用的內存量或者減少其使用的內存裡。

增加:可以通增加物理內存,啟用AWE等方法。

減少:可以通過橫向擴展,有兩台或者多台服務器分別載部分庫;優化相關讀取量較大的語句等。

3. Buffer Pool中的Stolen Memory壓力

正常情況下Buffer Pool中的Stolen Memory不會給Database Pages造成壓力。因為Database Pages有壓力,會觸發Lazy Writes,同時SQL Server 會清理Stolen Memory中的執行計劃緩存。

但是,如果用戶申明了過多的對象,而沒有登出,並且占用內存過多,就會壓縮Database Pages.如:游標,自定義引用的執行計劃等。

解決方法:通常是會表現為a)用戶提交的請求因內存不足無法完成,701錯誤;b)需要壓縮某些clerk的內存量,來完成用戶請求,造成響應延時和緩慢。

通過查詢sys.dm_os_memory_clerks的字段Single_pages_kb,找出是哪個clerk使用了過多內存並分析其原因,然後解決之。

4. Multi-Page的壓力

multi-page跟Buffer Pool共享OS的虛擬地址空間,如果multi-page使用過多內存,就會壓縮Datbase pages。multi-page內存用量一般較小且相對固定,可能發生的情況有:

a. 未開啟AWE的32位SQL Server只有2G地址空間,且用-g啟動參數擴展的MemToLeave的上限。

b. 64位SQL Server調了內存洩露的第三方代碼。

c. 使用帶有大量參數或者較長的”IN”語句

d. 調高了Network Packet Size,大於或等於8KB,並且較多這種連接。

e. 大量復雜XML查詢,或者第三代碼。

解決方法: 通過查詢sys.dm_os_memory_clerks的字段multi_pages_kb,找出是哪個clerk使用了過多內存並分析其原因,然後解決之。


作者:Joe.TJ

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved