SQL Server 資料頁緩衝區的記憶體瓶頸分析

2022-10-03 12:42:12 字數 2827 閱讀 9875

sql server會把經常使用到的資料快取在記憶體裡(就是資料頁快取),用以提高資料訪問速度。因為磁碟訪問速度遠遠低於記憶體,所以減少磁碟訪問量同樣是資料庫優化的重要方面。

當資料頁快取區出現記憶體不足,則zoeonkkokr會出現查詢慢,磁碟忙等等問題。

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

檢視如下效能計數器:

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. m程式設計客棧emory:**ailable mbytes:此值會下降到較低水平。

3. 在沒有使用awe或者lock page in memory前提下,檢視proceswww.cppcns.coms: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. bufwww.cppcns.comfer 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啟動引數擴充套件的memtole**e的上限。

b. 64位sql server調了記憶體洩露的第三方**。

c. 使用帶有大量引數或者較長的」in」語句

d. 調高了network packet size,大於或等於8kb,並且較多這種連線。

e. 大量複雜xml查詢,或者第三**。

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

作者:joe.tj

本文標題: sql server 資料頁緩衝區的記憶體瓶頸分析

本文位址:

輸入緩衝區與輸出緩衝區

本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...

使用者程序緩衝區和核心緩衝區

常常聽到有程式設計師會跟你討論 我們在讀寫檔案的時候,系統是有快取的 但實際上有一部分人把使用者程序緩衝區和系統空間的緩衝區的概念混淆了,包括這兩種緩衝區的用法和所要解決的問題,還有其它類似的概念。本文就來區分一下不同的緩衝區概念 主要針對類unix平台 使用者程序和作業系統的關係 首先我用一張圖來...

php 緩衝區,PHP的輸出緩衝區

1 什麼是緩衝區?緩衝區的作用是把輸入或者輸出的內容先放進記憶體,而不顯示或者讀取,最本質的作用就是協調高速cpu和相對緩慢的io裝置 磁碟等 的運作。2 php在執行的時候,在什麼地方有用到緩衝區?當執行php的時候,如果碰到了echo print r之類的會輸出資料的 php就會將要輸出的資料放...