問題背景:
????????用戶來電報故障,他們一套正常運行的Oracle數(shù)據(jù)庫,突然出現(xiàn)了10分鐘左右的性能卡頓問題,期間全部的業(yè)務(wù)操作都變慢,他們通過查看問題期間的awr報告,發(fā)現(xiàn)數(shù)據(jù)庫在問題時間出現(xiàn)大量的libary cache等待事件,但每秒的硬解析并不高,不知道是什么原因?qū)е碌臄?shù)據(jù)庫性能問題,需要我們查找問題的原因。
問題分析:
????????分析問題時間段的awr報告,可以看到問題期間的TOP等待事件相比與正常時間段,多了很多的涉及SGA內(nèi)存池buffer pool,shared pool的內(nèi)存latch鎖等待事件。
????????查看數(shù)據(jù)庫的配置以及運行指標,問題時間段數(shù)據(jù)庫的負載相對還是比較高的,屬于業(yè)務(wù)的高峰期,每秒的SQL執(zhí)行35699次,并且存在一定數(shù)量的SQL硬解析每秒平均17次,此外,數(shù)據(jù)庫的服務(wù)器內(nèi)存配置為1T,SGA配置為500G,其中buffer cache和shared pool的配置分別為450048M以及50097M,這個內(nèi)存配置還是比較大的。
????????繼續(xù)往下分析,由于數(shù)據(jù)庫服務(wù)器沒有配置OSW等其他的資源監(jiān)控工具,我們只能通過AWR里面操作系統(tǒng)的性能統(tǒng)計進行分析,可以看到問題時間段內(nèi)存分頁寫入磁盤虛擬內(nèi)存swap的計數(shù)VM_OUT_BYTES(Bytes paged out due to virtual memory swapping)數(shù)量有大幅的增長,短時間出現(xiàn)這么多的內(nèi)存分頁操作,很有可能是當時的操作系統(tǒng)內(nèi)存已經(jīng)耗盡或是內(nèi)存參數(shù)配置不合理導(dǎo)致,而內(nèi)存分頁寫入到磁盤的操作,會導(dǎo)致數(shù)據(jù)庫性能出現(xiàn)下降甚至卡頓,因為在內(nèi)存里面的操作速度跟在磁盤里面的操作速度不是一個量級的,這也難怪問題時間段數(shù)據(jù)庫出現(xiàn)大量的內(nèi)存池latch鎖等待。
????????分析數(shù)據(jù)庫當前的內(nèi)存使用情況,當前服務(wù)器的配置內(nèi)存為1T,HugePage巨頁內(nèi)存分配了402G,但可以看到HugePages_Free的剩余內(nèi)存為396G,也就是說數(shù)據(jù)庫其實沒有使用到這一部分的巨頁內(nèi)存 ,而服務(wù)器程序進程的通常也不會使用到巨頁內(nèi)存,所以這部分內(nèi)存被完全閑置。
????????從數(shù)據(jù)庫實例最近一次啟動的alert日志,也可以看到數(shù)據(jù)庫實例初始化SGA的時候并沒有用到巨頁內(nèi)存。
????????計算服務(wù)器總的內(nèi)存分配情況,數(shù)據(jù)庫SGA配置500G,PGA配置125G,因為SGA沒有存放在HugePage巨頁內(nèi)存里面,所以實際的服務(wù)器內(nèi)存分配情況為SGA+PGA+HugePage=1027G,這里還沒算上集群以及操作系統(tǒng)其他服務(wù)使用使用到的內(nèi)存,而服務(wù)器的內(nèi)存為1T,實際可以使用為1010G左右,所以當前服務(wù)器的內(nèi)存已經(jīng)屬于超配的情況。
????????對于服務(wù)器的內(nèi)存出現(xiàn)超配的問題,只要數(shù)據(jù)庫并發(fā)負載增高或者出現(xiàn)大排序或是使用了大量內(nèi)存的慢語句,都很有可能會導(dǎo)致操作系統(tǒng)物理內(nèi)存分頁寫入了磁盤虛擬內(nèi)存,進而導(dǎo)致一個平??雌饋磉\行正常的數(shù)據(jù)庫突然出現(xiàn)了性能卡頓的問題。
問題解決:
????????當前的數(shù)據(jù)庫服務(wù)器內(nèi)存為1T,SGA配置為500G,對于這種大內(nèi)存的數(shù)據(jù)庫,開啟大頁內(nèi)存的做法是合理的,因為它可以確保數(shù)據(jù)庫SGA內(nèi)存不會交換出去以及減少內(nèi)存頁的分配爭用,但對于設(shè)置大頁內(nèi)存,一定要按正確的步驟進行設(shè)置,并確認數(shù)據(jù)庫實例SGA內(nèi)存已經(jīng)使用到,小心將提升性能的方法變成引發(fā)性能惡化的問題。
大頁內(nèi)存大致步驟可以參考以下
????????1 計算大頁內(nèi)存的配置大小,可以使用官方的hugepages_settings.sh腳本進行評估或者按公式(SGA大小/M+5120M)/2M。
????????2 關(guān)閉數(shù)據(jù)庫實例,并確認數(shù)據(jù)庫實例使用到的共享內(nèi)存已經(jīng)釋放。
????????3?變更配置操作系統(tǒng)文件/etc/sysctl.conf,配置大頁內(nèi)存參數(shù)。
--設(shè)置大頁內(nèi)存頁數(shù)
vm.nr_hugepages= 66560
--設(shè)置大頁內(nèi)存的用戶oracle的gid
vm.hugetlb_shm_group =54321
????????4 變更配置操作系統(tǒng)文件/etc/security/limits.conf,設(shè)置oracle用戶大頁內(nèi)存資源限制為無限制。
oracle soft memlock unlimited
oracle hard memlock unlimited
????????5 生效大頁內(nèi)存參數(shù),并通過操作系統(tǒng)/proc/meminfo文件確認大頁內(nèi)存是否被使用。
sysctl -p
????????6 啟動數(shù)據(jù)庫實例。文章來源:http://www.zghlxwxcb.cn/news/detail-831964.html
????????7 確認數(shù)據(jù)庫實例使用到大頁內(nèi)存,并通過數(shù)據(jù)庫啟動的alert日志和操作系統(tǒng)/proc/meminfo文件確認大頁內(nèi)存是否被使用。文章來源地址http://www.zghlxwxcb.cn/news/detail-831964.html
到了這里,關(guān)于大頁內(nèi)存配置引發(fā)的數(shù)據(jù)庫性能問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!