溫馨提示×

溫馨提示×

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

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

導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

發(fā)布時(shí)間:2020-08-02 21:30:07 來源:網(wǎng)絡(luò) 閱讀:1100 作者:DBA小y 欄目:關(guān)系型數(shù)據(jù)庫

前言

不知不覺,技術(shù)人生系列·我和數(shù)據(jù)中心的故事來到了第四期。小y又和大家見面了!

當(dāng)您看到業(yè)務(wù)系統(tǒng)壓測呈現(xiàn)以下波浪形的tps曲線時(shí),你會(huì)怎么下手?


導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒


小y(中亦科技)今天要和大家分享的就是這樣一個(gè)業(yè)務(wù)系統(tǒng)壓測性能問題的分析和解決過程。這個(gè)問題困擾了客戶相當(dāng)長一段時(shí)間,幸運(yùn)的是,小y通過遠(yuǎn)程在10分鐘定位到了問題的原因并幫助客戶最終解決了問題。需要說明的是,在這個(gè)CASE中,只調(diào)整數(shù)據(jù)庫參數(shù)是不夠的,還需要做其他分析和調(diào)整才可以解決問題。


為了保持原汁原味,同時(shí)增加文章的趣味性,小y除了會(huì)繼續(xù)堅(jiān)持以往分析報(bào)告的寫法外,會(huì)嘗試開始引入一些問題處理的心理歷程,希望朋友們可以了解到小y的真實(shí)工作狀態(tài)。


我們能學(xué)到什么


  Oracle數(shù)據(jù)庫在11.2.0.3及以上的版本上必須要調(diào)整的一個(gè)重要的性能相關(guān)的參數(shù)!

  如何在診斷失敗后堅(jiān)持或快速調(diào)整問題甄別方向的技巧!

  如何在處理跨團(tuán)隊(duì)/部門的綜合型問題中掌握主動(dòng)權(quán)的一些經(jīng)驗(yàn)!


溫馨提示


如果您的高并發(fā)、事務(wù)型的OLTP核心業(yè)務(wù)系統(tǒng)中中經(jīng)常會(huì)出現(xiàn)一些性能的抖動(dòng)。比如交易響應(yīng)時(shí)間突然急劇上升,同時(shí)伴隨著ap服務(wù)器端口數(shù)/進(jìn)程活動(dòng)數(shù)/jdbc連接數(shù)升高、數(shù)據(jù)庫每秒DB TIME升高等現(xiàn)象,并且Oracle版本在11.2.0.3或以上,那么很可能和該文章提到的一個(gè)重要參數(shù)有關(guān)系哦!如果調(diào)整參數(shù)后還無法解決,可以聯(lián)系小y診斷哦(mian fei de)。

Part 1

問題來了


上午10點(diǎn),QQ突然閃了起來,來活了!


小y,有空嗎?幫忙看個(gè)awr。

我一會(huì)跟你電話說一下情況。


今年他們新上的一個(gè)關(guān)鍵業(yè)務(wù)系統(tǒng),在做上線前的壓力測試時(shí),應(yīng)用的并發(fā)無法達(dá)到上線前的并發(fā)指標(biāo)和響應(yīng)時(shí)間指標(biāo)要求。壓測時(shí)TPS的曲線如下所示:發(fā)來QQ消息的是國內(nèi)一個(gè)大型航空公司的DBA,一般的問題他都可以自己解決,這次看上去他遇到麻煩了。

導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒



可以看到,壓測時(shí)的TPS呈現(xiàn)波浪形,極不穩(wěn)定。

客戶自己做了很多分析,資源層面,CPU、內(nèi)存使用率、IO均正常,不過客戶自己也發(fā)現(xiàn)了,壓測時(shí)后端Oracle數(shù)據(jù)庫中出現(xiàn)了大量的異常等待,主要是gc類型的等待,客戶懷疑是不是私網(wǎng)交換機(jī)有問題。但可惜的是,網(wǎng)絡(luò)團(tuán)隊(duì)卻未檢查出異常。


這個(gè)問題,他們也請現(xiàn)有的Oracle服務(wù)商進(jìn)行了分析,但問題遲遲沒有解決。這樣一來,離業(yè)務(wù)系統(tǒng)要求上線的時(shí)間越來越近了,客戶的壓力也越來越大!

小y最近一直在跟這個(gè)客戶,從心里真心希望能有機(jī)會(huì)為他們提供服務(wù),所以這樣的機(jī)會(huì)來了,小y自然是打起了十二分精神,準(zhǔn)備開始戰(zhàn)斗。


環(huán)境介紹:

操作系統(tǒng)Redhat 64   bit,64C 128G

數(shù)據(jù)庫   Oracle   11.2.0.3 ,2節(jié)點(diǎn)RAC


Part 2

分析過程

2.1分析Oracle數(shù)據(jù)庫每秒的DB TIME

導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

我們用DB Time除以Elapsed,可以看到每秒DB TIME達(dá)到75!這是極度不正常的。

說明數(shù)據(jù)庫正在經(jīng)歷嚴(yán)重的等待,需要查看數(shù)據(jù)庫top等待事件繼續(xù)分析。


2.2分析交易時(shí)間都消耗到哪了(TOP 5 wait event)


1)節(jié)點(diǎn)1等待事件如下所示:


導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

事件分析

  Oracle top 5等待里,gc buffer busy acquire排在第一位,占了51.2%,平均每次等待時(shí)間達(dá)到驚人的277毫秒!這里的gc buffer busy acquire表示在進(jìn)程A之前已經(jīng)有進(jìn)程B先行向節(jié)點(diǎn)2請求同樣的一個(gè)數(shù)據(jù)塊,并且還沒有完成,因此處在等待上。


  排在第二位的是log file sync,占了18.58%,平均每次達(dá)到293毫秒。這里的log file sync表示當(dāng)進(jìn)程發(fā)出commit時(shí),需要等lgwr后臺進(jìn)行將log buffer中的改變向量持久化到磁盤中的redo log中所發(fā)生的等待。


  排在第三位的是DB CPU,在一個(gè)小時(shí)的采樣里,總的等待時(shí)間是24648秒,也就是說大概占了7CPU時(shí)間,該服務(wù)器配置了64CPU,因此平均CPU使用率只用到了10%。這里小y順便提一下,通常情況下,我們期望DB CPU的比例越高越好,這樣就意味著SQL在執(zhí)行的過程中,幾乎不用發(fā)生等待,SQL的響應(yīng)時(shí)間也就越快。但不代表就沒問題,比如高邏輯讀的SQL,如果要操作的數(shù)據(jù)都在內(nèi)存中,也會(huì)導(dǎo)致DB CPU過高,此時(shí)就需要對高邏輯讀的SQL進(jìn)行優(yōu)化了,從而降低 DB CPU。


  排在第四位的是direct path read,平均等待時(shí)間也到了153毫秒。這里的direct path read表示進(jìn)程直接將數(shù)據(jù)塊讀入PGA內(nèi)存而不是讀進(jìn)buffer cache共享內(nèi)存。這種情況下,IO的吞吐顯然會(huì)更大,每個(gè)進(jìn)程都各自讀各自的哪怕是相同的數(shù)據(jù)。如果不同的進(jìn)程同時(shí)讀取的是相同的數(shù)據(jù),并且讀進(jìn)共享內(nèi)存,那么只需要一個(gè)進(jìn)程負(fù)責(zé)讀取,其他進(jìn)程直接操作內(nèi)存中的數(shù)據(jù)即可,此時(shí)IO吞吐會(huì)小很多。


  排在第五位的是buffer busy wait,平均等待時(shí)間到了驚人的499毫秒。這里的buffer busy wait表示當(dāng)兩個(gè)或者兩個(gè)以上的進(jìn)程需要同時(shí)對一個(gè)數(shù)據(jù)塊進(jìn)行寫/寫、寫/讀操作時(shí)發(fā)生沖突,即熱塊沖突。


看到這里,小Y已經(jīng)基本知道答案了!

不過從嚴(yán)謹(jǐn)?shù)慕嵌?,還是要把RAC 2節(jié)點(diǎn)的等待事件也稍微過一下。


2)節(jié)點(diǎn)2等待事件如下所示:

導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒


和節(jié)點(diǎn)1相比,沒有buffer busy wait,多了gc current block busy。

總體來說,兩個(gè)節(jié)點(diǎn)的等待事件差別不大!


2.3 前2分鐘里小y的頭腦風(fēng)暴


2.3.1是不是RAC私網(wǎng)的問題?


看到這里,也許有人會(huì)說:

gc等待那么高,是不是把另外一個(gè)RAC節(jié)點(diǎn)臨時(shí)關(guān)掉,問題就解決了呢?


首先答案是NO!其次,這樣的做法是生產(chǎn)出現(xiàn)緊急gc性能問題時(shí)可以臨時(shí)采用的,但是對于這樣一個(gè)case,客戶顯然是不接受的。

小y從技術(shù)層面來回答下這個(gè)問題。

首先,如下圖所示

兩個(gè)節(jié)點(diǎn)的私網(wǎng)不過是每秒3M,而RAC兩臺服務(wù)器為私網(wǎng)配置的是千兆交換機(jī)。


導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

其次,RAC兩個(gè)節(jié)點(diǎn)的CPU和內(nèi)存均處于低位,也就沒有出現(xiàn)因?yàn)橘Y源問題導(dǎo)致一個(gè)節(jié)點(diǎn)運(yùn)行緩慢,繼而導(dǎo)致無法快速響應(yīng)另外一個(gè)節(jié)點(diǎn)的gc請求的情況。

如果是該類問題,我們通常還可以看到gc*congested*類型的等待(擁堵)。


2.3.2是不是SQL效率導(dǎo)致gc/bbw/direct path read的問題?


其中bbw即buffer busy wait,

gc即表示gc buffer busy acquire等gc等待。


也許有人會(huì)說:

gc等待那么高,還有buffer busy wait等待,如果SQL效率足夠高,那么訪問的數(shù)據(jù)塊就少了,那么進(jìn)程發(fā)生gc請求的個(gè)數(shù)就很少,同時(shí)由于讀/寫造成的熱塊沖突自然也就沒了。


答案是NO!

見下圖,可以看到該應(yīng)用還是寫的相當(dāng)不錯(cuò)的,大部分SQL都控制在100個(gè)邏輯讀以下,只有3個(gè)SQL的邏輯讀在幾千到幾萬,這樣的SQL效率和邏輯讀數(shù)量不足以導(dǎo)致如此高的gc/bbw等待!另外,落到SQL效率不高這個(gè)點(diǎn)上,是沒有辦法解釋log file sync/direct path read也處于平均單次長時(shí)間等待的!錯(cuò)誤的方向是不能解決根本問題的!也就是說,即使你再花精力優(yōu)化掉這幾個(gè)邏輯讀稍微高一些的SQL,壓測的問題還是會(huì)依然存在,因?yàn)檫@不是根本原因,優(yōu)化SQL對于這個(gè)CASE而言是錦上添花而非雪中送炭!

導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒


2.3.3是不是direct path read導(dǎo)致IO帶寬占滿的問題?


也許有人會(huì)說,會(huì)不會(huì)有這樣一種可能:

  先是direct path read導(dǎo)致IO帶寬被占滿

說明:多個(gè)進(jìn)程把數(shù)據(jù)塊讀進(jìn)PGA私有內(nèi)存而不是buffer cache共享內(nèi)存,以多塊讀16計(jì)算,每個(gè)BLOCK 8K,每個(gè)進(jìn)程可以讀取30M左右,15個(gè)以上的進(jìn)程同時(shí)多塊讀就可以把hba卡帶寬占滿,設(shè)置10949 event可禁止該特性。

  由于IO帶寬被占滿,影響了lgwr寫日志的響應(yīng)時(shí)間,繼而導(dǎo)致log file sync等待長。

  而log file sync又是gc和buffer busy wait的一個(gè)環(huán)節(jié),從而將gc和buffer busy等待時(shí)間拉高,因此出現(xiàn)了AWR報(bào)告的等待?


首先,可以做出該假設(shè)的朋友,可以發(fā)小y發(fā)一份簡歷,說明你對數(shù)據(jù)庫有非常深入的理解,并且有非常豐富的TroubleShooting經(jīng)驗(yàn),而且也已經(jīng)不在割裂的分析問題的層面上了!

歡迎你加入中亦科技DBA團(tuán)隊(duì)!來了就是兄弟,我們一起并肩戰(zhàn)斗,一起挑戰(zhàn)各種疑難問題,一起分享收益!

簡歷請發(fā)至51994106@qq.com


那么Log file sync和gc有什么關(guān)系呢?

引用一張RAC SG的圖,其中原理如下圖所示

導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

從上圖可以看到:

gc類的請求,在第二步中包含了lgwr進(jìn)程寫日志的過程,

即log file sync是gc請求的一個(gè)子步驟,嚴(yán)格來說,該步驟叫g(shù)c log flush sync.

但答案依然是NO!


從下圖load profile中可以看到,每秒的物理讀是498個(gè)BLOCK,每個(gè)BLOCK是8K,也就是說每秒的IO才4M左右。IOPS和IO帶寬都非常低,顯然不是該問題!

導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

2.3.42.小y快速鎖定問題分析方向!


小y這兩分鐘里如同上述的分析一樣,飛速的進(jìn)行著各種假設(shè)和排除、問題串聯(lián)。

很快小y就鎖定了問題的分析方向——那就是要把分析焦點(diǎn)放在log file sync等待上!

原因很簡單,通過分析top 5等待,不難看到,他們之間是有關(guān)聯(lián)關(guān)系的:

log file sync是gc和buffer busy wait的一個(gè)環(huán)節(jié)?。ㄒ?.3.3中的圖)

如果log file sync等待解決了,自然gc*等待和buffer busy wait等待也就下去了!

問題也就得到解決了!


2.4 聚焦在“l(fā)og file sync“等待上


從上文,我們已經(jīng)知道,“l(fā)og file sync”等待事件表示:

當(dāng)進(jìn)程發(fā)出commit時(shí),需要等lgwr后臺進(jìn)行將log buffer中的改變向量持久化到磁盤中的redo log的過程中所發(fā)生的等待。因此,最常見的是lgwr寫日志寫的慢,或者是因?yàn)閏ommit太頻繁所導(dǎo)致!

接下來小y依次檢查了這兩個(gè)方面。

ORACLE當(dāng)中,如果lgwr寫日志寫的慢,會(huì)體現(xiàn)到log file parallel write單次響應(yīng)時(shí)間慢上。

節(jié)點(diǎn)1

導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

節(jié)點(diǎn)2

導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

可以看到,兩個(gè)節(jié)點(diǎn)無論是log file parallel write還是gc log flush sync都只在5個(gè)毫秒以下,其中l(wèi)og file parallel write更是只有1毫秒和3毫秒。排除該問題!

接下來檢查commit次數(shù)!


如下圖所示,每秒的transactions(commits/rollbacks)只有48個(gè)!

小y服務(wù)過的一些大型銀行的高并發(fā)的核心系統(tǒng)中,包括每秒事務(wù)數(shù)在10000以上的,log file sync也都控制在10個(gè)毫秒以內(nèi)。所以每秒transactions只有48個(gè)是非常小的指標(biāo),不至于引起這么嚴(yán)重的等待!

導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒


2.5 原因基本定位并開始第一次調(diào)整


分析到了這里,小y已經(jīng)已經(jīng)找到本次壓測的根本原因了,只需要調(diào)整驗(yàn)證即可。

建議朋友們,讀到這里也可以先停一下,看看自己是否找到了問題原因。

也就是客戶AWR報(bào)告發(fā)過來后的兩分鐘,小y告訴他


“我知道原因了,你把lgwr進(jìn)程的trace發(fā)我最后確認(rèn)一下,我們就開始調(diào)整”


其實(shí)并不奇怪,這樣的case小y在幾年前做大量系統(tǒng)升級到11g時(shí)就遇到過N次!客戶很驚訝,他甚至還來不及電話小y,小y怎么可以這樣…

這應(yīng)該是一個(gè)上線前的標(biāo)配,雖然現(xiàn)象不一樣,但本質(zhì)上是一個(gè)問題。


這也就是小y標(biāo)題中要重點(diǎn)提示大家的一個(gè)重要的數(shù)據(jù)庫參數(shù)。

如果Log file sync等待事件很長,但是lgwr寫日志的時(shí)間很快,并且commit次數(shù)也不大的話,那就是在發(fā)起commit的進(jìn)程和lgwr之間的通訊環(huán)節(jié)上出了問題。



關(guān)鍵知識點(diǎn):

ORACLE從11G開始,為lgwr寫日志引入了polling機(jī)制,而在以前只有post/wait機(jī)制。

同時(shí)引入了一個(gè)隱含參數(shù),"_use_adaptive_log_file_sync",即在兩個(gè)機(jī)制之間自適應(yīng)的切換。在11.2.0.3以下,該參數(shù)的默認(rèn)值為false,即只啟用post/wait機(jī)制。

從11.2.0.3開始,該參數(shù)的默認(rèn)值為true,即Oracle會(huì)在post/wait機(jī)制和polling機(jī)制自適應(yīng)。

  Post/wait進(jìn)制下,lgwr進(jìn)程在寫完log buffer中的改變向量后,立刻通知待commit的進(jìn)程,因此log file sync等待時(shí)間短,但lgwr相對來說,負(fù)擔(dān)要重一些。畢竟12C以下lgwr進(jìn)程只有1個(gè),當(dāng)同時(shí)commit的進(jìn)程比較多的時(shí)候,通知待commit的進(jìn)程也是一種負(fù)擔(dān)。

  Polling模式下,待commit的進(jìn)程,通知lgwr進(jìn)程進(jìn)行寫入操作后,會(huì)進(jìn)入sleep環(huán)節(jié),并在timeout后去看是否log buffer中的內(nèi)容被寫入了磁盤,lgwr進(jìn)程不再單獨(dú)通知待commit的進(jìn)程寫已經(jīng)完成。Polling機(jī)制下,解放了一部分lgwr的工作,但是會(huì)帶來待commit的進(jìn)程長時(shí)間處于log file sync等待下。對于交易型的系統(tǒng)而言,該機(jī)制是極度不適用的!


在post/wait和polling機(jī)制之間的切換,ORACLE會(huì)記錄到lgwr進(jìn)程的trace當(dāng)中,如下所示。

當(dāng)切換到polling模式下時(shí),很容易引起log file sync等待而影響交易的響應(yīng)時(shí)間!


Log file sync switching to polling

……

Log file sync switching to post/wait


在Oracle 11.2.0.3以下,建議關(guān)閉自適應(yīng)log file sync,務(wù)必讓lgwr進(jìn)程運(yùn)行在post/wait機(jī)制下,以確保數(shù)據(jù)庫性能不會(huì)出現(xiàn)大的抖動(dòng)!關(guān)閉的命令如下,可在線修改!因此,小y在這里提示各位

alter system set   "_use_adaptive_log_file_sync"=false    sid='*';


沒錯(cuò),小y的第一次調(diào)整措施就是調(diào)整該參數(shù)為false。


2.6 第一次調(diào)整后的結(jié)果讓是失望!


在線調(diào)整參數(shù)后,為了安全起見,客戶把兩個(gè)節(jié)點(diǎn)數(shù)據(jù)庫都重啟了一遍。

并且重新做了壓力測試,重新收集后的AWR報(bào)告如下所示!


導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

看到節(jié)點(diǎn)1的這個(gè)AWR報(bào)告,gc等待和log file sync等待依然存在,并且看上去單次等待的時(shí)間更長了!

難道小y的分析出了問題? 或者說,小y這次遇到了好幾個(gè)摻雜在一起的問題?冷靜了一下,RAC的問題,切記只看單個(gè)節(jié)點(diǎn),因此,小y讓客戶出了節(jié)點(diǎn)2的AWR報(bào)告,調(diào)整后節(jié)點(diǎn)2的awr報(bào)告如下圖所示:


導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

可以看到:

雖然等待還在,但節(jié)點(diǎn)2的log file sync等待沒有了!這說明這次調(diào)整還是起到效果了的!


并且細(xì)心的朋友,可能已經(jīng)發(fā)現(xiàn)了,節(jié)點(diǎn)1的第一位的等待gc buffer busy acquire完全沒有了(說明節(jié)點(diǎn)2 log file sync快了),從gc buffer busy acquire變成了gc buffer busy release。這不正好說明調(diào)整還是起到作用了么?


到這里,先不要著急,這里因?yàn)楣?jié)點(diǎn)1依然存在log file sync,所以節(jié)點(diǎn)2的gc buffer busy acquire還依然存在!那么接下來,小y就要集中精力再解決掉節(jié)點(diǎn)1的log file sync就好了!


2.7 真相浮出水面(懷疑一切)


總結(jié)一下,這里調(diào)整log file sync自適應(yīng)后,問題還是沒有得到解決,那么回到傳統(tǒng)思路上,最可能的問題那就還是lgwr進(jìn)程寫日志慢了!雖然awr報(bào)告中l(wèi)og file parallel write指標(biāo)只有幾個(gè)毫秒,但是awr報(bào)告畢竟是一個(gè)工具,提供的只是參考值,因此我們還是要抱著懷疑一切的態(tài)度,再來塞查一次!

這一次,我們來實(shí)時(shí)觀察lgwr進(jìn)程寫日志的情況。發(fā)出SQL語句,結(jié)果如下圖所示:


導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

可以看到:

  RAC兩個(gè)節(jié)點(diǎn)中,只有1個(gè)節(jié)點(diǎn)出現(xiàn)log file parallel write的等待,剛好和前面的所有分析相互吻合!

  在state是waiting的情況下,log file parallel等待的seq#都是35693,但是seconds_in_wait達(dá)到了21秒。簡單來說,就是lgwr進(jìn)程寫一個(gè)IO需要21秒!

至此,我們可以肯定,IO子系統(tǒng)有問題,需要重點(diǎn)排查IO路徑下的光纖線、SAN交換機(jī)、存儲的報(bào)錯(cuò)和性能情況。


2.8 如何進(jìn)一步證明IO路徑環(huán)節(jié)有問題(跨部門合作)


考慮到客戶那邊管存儲的團(tuán)隊(duì)/部門可能不承認(rèn)數(shù)據(jù)庫的IO慢的證據(jù),同時(shí)為了讓對方增加排查力度,小y讓客戶發(fā)出以下命令,查看多路徑軟件的IO情況,結(jié)果如下圖所示:


導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

節(jié)點(diǎn)1上出現(xiàn)明顯的IO ERROR,并且在持續(xù)增加!

繼續(xù)檢查節(jié)點(diǎn)2,發(fā)現(xiàn)節(jié)點(diǎn)2上沒有任何IO ERROR!

回顧前面的分析,節(jié)點(diǎn)2在調(diào)整數(shù)據(jù)庫自適應(yīng)log file sync為false后,并且沒有出現(xiàn)IO ERROR,因此已經(jīng)沒有l(wèi)og file sync。


至此,分析結(jié)束!所有問題都得到了完美的解釋!

找到原因了,還拿到了說服力極強(qiáng)的證據(jù),客戶終于松了一口氣,不怕存儲團(tuán)隊(duì)不認(rèn)賬了!


2.9 問題得到圓滿解決


在鐵的證據(jù)面前,客戶的存儲團(tuán)隊(duì)沒有再掙扎,而是開始認(rèn)認(rèn)真真逐個(gè)在排查,最終在更換了光纖線后問題得到圓滿解決。以下是更換光纖線后再次壓測的等待事件!


導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

壓測的TPS曲線從原來的波浪形:


導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

變成了如下的良好曲線


導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

Part 3

問題原因和總結(jié)和風(fēng)險(xiǎn)提示

3.1 問題原因總結(jié)


該航空客戶業(yè)務(wù)上線時(shí)壓測無法達(dá)到并發(fā)和響應(yīng)時(shí)間指標(biāo)的原因在于同時(shí)遇到了兩個(gè)混在一起的問題:

1)Oracle 11.2.0.3上log file sync默認(rèn)打開自適應(yīng),當(dāng)切換到polling模式后,導(dǎo)致log file sync等待時(shí)間變長,而log file sync是gc和buffer busy wait的一個(gè)環(huán)節(jié),因此導(dǎo)致大量的等待

小y將"_use_adaptive_log_file_sync"調(diào)整為false后,就解決了一部分的log file sync等待的問題

2)由于節(jié)點(diǎn)1的光纖線存在質(zhì)量問題,會(huì)導(dǎo)致IO錯(cuò)誤,繼而導(dǎo)致IO重發(fā),影響了lgwr寫日志的性能。

在調(diào)整數(shù)據(jù)庫參數(shù)默認(rèn)值并且更換光纖線后,問題得到圓滿解決。

壓測的TPS曲線從原來的波浪形


導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

變成了如下的良好曲線


導(dǎo)致Oracle性能抖動(dòng)的參數(shù)提醒

3.2 解決問題的關(guān)鍵點(diǎn)回顧


1)對Oracle等待事件不要割裂的來分析

       小y在本case中通過梳理等待事件的共同點(diǎn)為log file sync,從而找到了突破口


2)了解不同版本數(shù)據(jù)庫的特性和行為

       小y平時(shí)在不斷了解11g的新特性,并且通過大量的故障處理深入理解了這些特性,因此,當(dāng)log file sync出現(xiàn)的時(shí)候,可以很快定位到新特性引起


3)不要完全相信AWR報(bào)告,他只是個(gè)工具,要懷疑一切去驗(yàn)證。

   在這個(gè)case中,awr報(bào)告的指標(biāo)并不能真實(shí)反映lgwr寫性能的情況,要懷疑一切


4)一個(gè)Oracle服務(wù)人員,如果只懂?dāng)?shù)據(jù)庫,就會(huì)出現(xiàn)你懷疑這懷疑那,但是其他人根本不認(rèn)賬的情況,因此必須掌握更多的包括操作系統(tǒng)、存儲、網(wǎng)絡(luò)、中間件的技能。當(dāng)然了,找一家綜合服務(wù)能力強(qiáng)的服務(wù)商也是不錯(cuò)的選擇。


在這個(gè)case中,小y通過多路徑的命令,找到了直接證據(jù),最終獲得了其他團(tuán)隊(duì)的大力度排查也是這次問題最終解決的關(guān)鍵。


風(fēng)險(xiǎn)提示


ORACLE從11G開始,為lgwr寫日志引入了polling機(jī)制,而在以前只有post/wait機(jī)制。

同時(shí)引入了一個(gè)隱含參數(shù),"_use_adaptive_log_file_sync",即在兩個(gè)機(jī)制之間自適應(yīng)的切換。在11.2.0.3以下,該參數(shù)的默認(rèn)值為false,即只啟用post/wait機(jī)制。

從11.2.0.3開始,該參數(shù)的默認(rèn)值為true,即Oracle會(huì)在post/wait機(jī)制和polling機(jī)制自適應(yīng)。


  Post/wait進(jìn)制下,lgwr進(jìn)程在寫完log buffer中的改變向量后,立刻通知待commit的進(jìn)程,因此log file sync等待時(shí)間短,但lgwr相對來說,負(fù)擔(dān)要重一些。畢竟12C以下lgwr進(jìn)程只有1個(gè),當(dāng)同時(shí)commit的進(jìn)程比較多的時(shí)候,通知待commit的進(jìn)程也是一種負(fù)擔(dān)。

  Polling模式下,待commit的進(jìn)程,通知lgwr進(jìn)程進(jìn)行寫入操作后,會(huì)進(jìn)入sleep環(huán)節(jié),并在timeout后去看是否log buffer中的內(nèi)容被寫入了磁盤,lgwr進(jìn)程不再單獨(dú)通知待commit的進(jìn)程寫已經(jīng)完成。Polling機(jī)制下,解放了一部分lgwr的工作,但是會(huì)帶來待commit的進(jìn)程長時(shí)間處于log file sync等待下。對于交易型的系統(tǒng)而言,該機(jī)制是極度不適用的!

進(jìn)制之間的切換回記錄到lgwr進(jìn)程的trace當(dāng)中,如下所示。

當(dāng)切換到polling模式下時(shí),很容易引起log file sync等待而影響交易的響應(yīng)時(shí)間!


Log file sync switching to polling

……

Log file sync switching to post/wait


因此,小y在這里提示各位。

在Oracle 11.2.0.3以下,建議關(guān)閉自適應(yīng)log file sync,務(wù)必讓lgwr進(jìn)程運(yùn)行在post/wait機(jī)制下,以確保數(shù)據(jù)庫不會(huì)出現(xiàn)嚴(yán)重的性能抖動(dòng)!關(guān)閉的命令如下,可在線修改!


向AI問一下細(xì)節(jié)

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

AI