SQL SERVER——內存問題定位與解決

內存問題定位基本流程:
 
 

主要用到的性能計數器

  1. Page life expectancy (數據庫計數器:主要顯示不被使用的頁,將在緩存中停留的秒數 )
  2. Lazy writes/sec  (數據庫計數器:惰性寫入器會在內存有壓力且有新的內存需求時觸發,成批的刷新“老化的緩衝區”)
  3. Page Reads/sec,Page Writes/sec  (這裏使用數據庫級別計數器:當需要讀取或寫入的頁不在內存中,需要到磁盤中讀取時計數)
  4. Target Server Memory (KB)  (SQL server能夠使用的內存總量)
  5. Total Server Memory (KB)  (SQL SERVER使用的內存總量,這裏指BUFFER POOL的大小)
  6. Available MBytes  (系統係數器:主要顯示系統還有多少可用內存)

  注:Target Server Memory (KB) - Total Server Memory (KB) 約等於SQL SERVER還可以使用的內存數。

 

 

步驟1.排除應用影響內存

 

 

    Total Server Memory (KB)(SQL SERVER使用的內存總量,這裏指BUFFER POOL的大小)可以查看SQL Server使用的內存總量,如果當使用的內存總量很小,而服務器依然有很大的內存Available MBytes請檢查,是否限制了SQL Server的內存使用。

    Available MBytes 主要顯示系統中還多少空閒內存 (如果這個值較大,而Target Server Memory (KB) - Total Server Memory (KB) 爲0或者較小,可以適當的調大max server memory(最大內存,稍後介紹))

 

    如果Total Server Memory (KB) 計數器有陡降的情況發生,一般可以說明有外部程序對內存的使用佔用的數據庫使用的內存。

 

 

步驟2.內存問題定位


內存持續壓力
 
Lazy writes/sec
 
Page life expectancy
 
 
內存波動壓力

 

 Page Reads/sec

 Lazy writes/sec

Page life expectancy 


 

 
步驟3.內存問題分析與解決(通用步驟)

 

系統設置最大內存max server memory
 

問:我係統內存本來就不夠爲什麼還要設置使用上限?我這服務器就給數據庫用還用設置?

答:數據庫是運行在windows 上的應用,他和notepad對於操作系統來說本質上沒區別,那麼這就好比君(操作系統)與 臣(數據庫)的關係。

而SQL SERVER是一個很喜歡內存的應用,所以很可能吃掉大量內存導致windows系統沒有足夠內存使用,,那麼這時候君臣關係就體現的淋漓盡致了,君(windows) 要臣(SQL SERVER)死(釋放內存)臣不得不死呀...這個釋放在一定程度上可不是單單讓windows夠用了,很可能導致SQL內存陡降,以致SQL 短時間假死(操作無響應)。所以爲了你數據庫的穩定性,這個最大上限一定要設置。

 

內存設置推薦:

       一般我比較推薦如果內存較小操作系統預留3G-4G ,如果內存大256或512以上在數據庫內存無壓力時預留5%給操作系統,剩下給SQL SERVER ,如果服務器還有其他應用還要在SQL 中減掉應用所佔的內存。

  如果內存比較小且數據庫內存壓力大,則可以通過前面講述的Available MBytes 的判斷結果適量給系統預留內存。

注意:最大內存的設置單位爲 MB。

 

語句的優化,讓語句消耗內存更少!

    語句優化系列請關注後續文章,這裏只針對降低內存

    降低內存對語句優化主要集中在幾個方面:

      1. 是否缺失索引? 
      2. 消耗內存的操作是否可以消除(如排序)
      3. 降低語句複雜性,讓優化器能選用最佳計劃

 

    語句消耗內存主要體現在大量的讀取,或者有排序等操作。

    所謂的讀,簡單理解就是在語句執行時所需要用到的數據頁數,需要的越多就需要越大的內存來緩存這些數據頁。如果需要的頁不在內存中還需要從磁盤讀取 (磁盤讀取就是爲什麼Page Reads/sec 會高

 

    簡單的一個加索引降低邏輯讀的例子~

 

    語句使用了一個整個表掃描的計劃,執行了 19秒,邏輯讀取143800次,預讀137236 (磁盤上讀取),消耗了40KB 的內存 ,並且明確提示出缺少索引!

    那麼我們加上提示缺少的索引,再次執行

 

    加上索引的語句執行不到1秒 邏輯讀降低到13次,內存消耗已經可以忽略不計。這就是索引對語句的重要性!單條語句如此,你的系統中到底有多少這樣的語句呢?

 

 

 

    再來看一個寫法修改的例子 :

 

 

 

    只是簡單的改了下語句的寫法時間有7秒變成1秒,內存消耗從300+MB 變成 1MB

    這兩個例子,告訴我們也許系統中簡簡單單做一些調整,內存的壓力就會明顯降低或者變得非常充足,所以在你下了一個需要購買內存的決定前,是否針對系統的語句進行過調優?

 

 

 

步驟4.內存問題分析與解決(特殊排查步驟)

內存波動

 

            如果你是系統維護人員,看到類似這樣的內存數據指標,如果你還不能有一些思路,請你好好熟悉下你的系統。

    這張圖很清晰地反映出系統每隔幾小時會有一次的內存壓力,那麼別忙着去找對應時間點的語句,我們最少要好好想一下,系統中有什麼操作定時執行?SQL JOB?計劃任務?前臺定時處理?等等等

    這個規律的定時處理是否有異常?是否最近有什麼改動?執行的結果是不是和你想的一樣?

    也許問題就這麼清晰的定位了......

 

 

 

 

 -----------------------------------------------------------------------------------------------------

  總結:內存對於數據庫來說是最爲重要的依賴之一,內存的問題診斷和優化對系統至關重要。

     優化語句可以讓你的系統內存壓力明顯降低。

     語句優化所帶來的效果,在很大程度上會比添加硬件更有效!

     作爲一個技術人員對於系統問題的定位、分析、調優是最重要的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章