溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

內(nèi)存問題定位與解決

發(fā)布時間:2020-07-17 12:24:04 來源:網(wǎng)絡(luò) 閱讀:281 作者:張立達 欄目:數(shù)據(jù)庫

內(nèi)存問題定位基本流程:

內(nèi)存問題定位與解決

 

 

主要用到的性能計數(shù)器

  1. Page life expectancy (數(shù)據(jù)庫計數(shù)器:主要顯示不被使用的頁,將在緩存中停留的秒數(shù) )

  2. Lazy writes/sec ?。〝?shù)據(jù)庫計數(shù)器:惰性寫入器會在內(nèi)存有壓力且有新的內(nèi)存需求時觸發(fā),成批的刷新“老化的緩沖區(qū)”)

  3. Page Reads/sec,Page Writes/sec ?。ㄟ@里使用數(shù)據(jù)庫級別計數(shù)器:當(dāng)需要讀取或?qū)懭氲捻摬辉趦?nèi)存中,需要到磁盤中讀取時計數(shù))

  4. Target Server Memory (KB)  (SQL server能夠使用的內(nèi)存總量)

  5. Total Server Memory (KB) ?。⊿QL SERVER使用的內(nèi)存總量,這里指BUFFER POOL的大?。?/p>

  6. Available MBytes  (系統(tǒng)系數(shù)器:主要顯示系統(tǒng)還有多少可用內(nèi)存)

  注:Target Server Memory (KB) - Total Server Memory (KB) 約等于SQL SERVER還可以使用的內(nèi)存數(shù)。

 

內(nèi)存問題定位與解決

 

步驟1.排除應(yīng)用影響內(nèi)存

 

 

    Total Server Memory (KB)(SQL SERVER使用的內(nèi)存總量,這里指BUFFER POOL的大?。┛梢圆榭碨QL Server使用的內(nèi)存總量,如果當(dāng)使用的內(nèi)存總量很小,而服務(wù)器依然有很大的內(nèi)存Available MBytes請檢查,是否限制了SQL Server的內(nèi)存使用。

    Available MBytes 主要顯示系統(tǒng)中還多少空閑內(nèi)存 (如果這個值較大,而Target Server Memory (KB) - Total Server Memory (KB) 為0或者較小,可以適當(dāng)?shù)恼{(diào)大max server memory(最大內(nèi)存,稍后介紹))

內(nèi)存問題定位與解決

 

    如果Total Server Memory (KB) 計數(shù)器有陡降的情況發(fā)生,一般可以說明有外部程序?qū)?nèi)存的使用占用的數(shù)據(jù)庫使用的內(nèi)存。

內(nèi)存問題定位與解決

 

 

步驟2.內(nèi)存問題定位


內(nèi)存持續(xù)壓力

 

Lazy writes/sec

內(nèi)存問題定位與解決

 

Page life expectancy

內(nèi)存問題定位與解決

 

 

內(nèi)存波動壓力

 

 Page Reads/sec

內(nèi)存問題定位與解決

 Lazy writes/sec

內(nèi)存問題定位與解決

Page life expectancy 

內(nèi)存問題定位與解決


 

 

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

 

系統(tǒng)設(shè)置最大內(nèi)存max server memory

內(nèi)存問題定位與解決

 

問:我系統(tǒng)內(nèi)存本來就不夠為什么還要設(shè)置使用上限?我這服務(wù)器就給數(shù)據(jù)庫用還用設(shè)置?

答:數(shù)據(jù)庫是運行在windows 上的應(yīng)用,他和notepad對于操作系統(tǒng)來說本質(zhì)上沒區(qū)別,那么這就好比君(操作系統(tǒng))與 臣(數(shù)據(jù)庫)的關(guān)系。

而SQL SERVER是一個很喜歡內(nèi)存的應(yīng)用,所以很可能吃掉大量內(nèi)存導(dǎo)致windows系統(tǒng)沒有足夠內(nèi)存使用,,那么這時候君臣關(guān)系就體現(xiàn)的淋漓盡致了,君(windows) 要臣(SQL SERVER)死(釋放內(nèi)存)臣不得不死呀...這個釋放在一定程度上可不是單單讓windows夠用了,很可能導(dǎo)致SQL內(nèi)存陡降,以致SQL 短時間假死(操作無響應(yīng))。所以為了你數(shù)據(jù)庫的穩(wěn)定性,這個最大上限一定要設(shè)置。

 

內(nèi)存設(shè)置推薦:

       一般我比較推薦如果內(nèi)存較小操作系統(tǒng)預(yù)留3G-4G ,如果內(nèi)存大256或512以上在數(shù)據(jù)庫內(nèi)存無壓力時預(yù)留5%給操作系統(tǒng),剩下給SQL SERVER ,如果服務(wù)器還有其他應(yīng)用還要在SQL 中減掉應(yīng)用所占的內(nèi)存。

  如果內(nèi)存比較小且數(shù)據(jù)庫內(nèi)存壓力大,則可以通過前面講述的Available MBytes 的判斷結(jié)果適量給系統(tǒng)預(yù)留內(nèi)存。

注意:最大內(nèi)存的設(shè)置單位為 MB。

 

語句的優(yōu)化,讓語句消耗內(nèi)存更少!

    語句優(yōu)化系列請關(guān)注后續(xù)文章,這里只針對降低內(nèi)存

    降低內(nèi)存對語句優(yōu)化主要集中在幾個方面:


    1. 是否缺失索引? 

    2. 消耗內(nèi)存的操作是否可以消除(如排序)

    3. 降低語句復(fù)雜性,讓優(yōu)化器能選用最佳計劃


 

    語句消耗內(nèi)存主要體現(xiàn)在大量的讀取,或者有排序等操作。

    所謂的讀,簡單理解就是在語句執(zhí)行時所需要用到的數(shù)據(jù)頁數(shù),需要的越多就需要越大的內(nèi)存來緩存這些數(shù)據(jù)頁。如果需要的頁不在內(nèi)存中還需要從磁盤讀取 (磁盤讀取就是為什么Page Reads/sec 會高

內(nèi)存問題定位與解決

 

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

內(nèi)存問題定位與解決

 

內(nèi)存問題定位與解決

內(nèi)存問題定位與解決

    語句使用了一個整個表掃描的計劃,執(zhí)行了 19秒,邏輯讀取143800次,預(yù)讀137236 (磁盤上讀?。牧?0KB 的內(nèi)存 ,并且明確提示出缺少索引!

    那么我們加上提示缺少的索引,再次執(zhí)行

內(nèi)存問題定位與解決

內(nèi)存問題定位與解決

 

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

 

 

 

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

內(nèi)存問題定位與解決

 

 

 

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

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

 

 

 

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

內(nèi)存波動

 

內(nèi)存問題定位與解決

            如果你是系統(tǒng)維護人員,看到類似這樣的內(nèi)存數(shù)據(jù)指標,如果你還不能有一些思路,請你好好熟悉下你的系統(tǒng)。

    這張圖很清晰地反映出系統(tǒng)每隔幾小時會有一次的內(nèi)存壓力,那么別忙著去找對應(yīng)時間點的語句,我們最少要好好想一下,系統(tǒng)中有什么操作定時執(zhí)行?SQL JOB?計劃任務(wù)?前臺定時處理?等等等

    這個規(guī)律的定時處理是否有異常?是否最近有什么改動?執(zhí)行的結(jié)果是不是和你想的一樣?

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


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI