資源供給:再談記憶體和虛擬記憶體

sunsapollos發表於2013-11-10

     簡單案例描述:
     某客戶業務系統一直執行正常,突然之間業務系統急劇變慢,資料庫體現大量的buffer busy waits,部分cache buffer chain,作業系統表現出頁面交換,記憶體吃緊。原因很簡單,有人發起了一和大檔案的ftp操作,消耗了大量記憶體。類似的事件也很多會如此表現,比如Oracle由於故障做了大資料量的Core Dump。最終都會導致類似事件,在Oracle端的響應基本是buffer busy waits,cache buffer chian,甚至會出現free buffer waits等事件。

     導致上述原因的根本在於虛擬記憶體中的檔案系統快取頁設定,設定了過高的值,導致大量的記憶體被檔案頁所消耗,導致記憶體不足,形成記憶體交換。

   合理的檔案系統快取頁面設定:
   Oracle在檔案系統中會採取buffer read,但對於寫總是採用write through,也就是說必須寫到磁碟裡才認為寫完成,會忽略檔案系統快取。Oracle在ASM和裸裝置環境下都不會執行buffer read,也就是檔案系統的快取對於Oracle不起作用。在一個資料庫伺服器上,其主體業務應該是Oracle資料庫,絕大部分的資源應該被Oracle所使用,也就是說犧牲其他非資料庫目的來完成資料庫業務的高效能。從這個角度考慮,檔案系統快取在Oracle資料庫中都應該處於一個比較低的水準線,比如設定為5%左右,而不是預設的50%或者80%。

   頁面交換空間的效能
   頁面交換空間的效能如果不好,會直接導致作業系統記憶體交換到頁面的速度降低,間接使作業系統獲取自由空間的效率變低,干擾記憶體操作效率。在很多場合下,交換空間的效能是完全不可擴充套件的,只是在內建磁碟上開闢一個區域。想象一下,當大量的其他IO作用於交換空間所在磁碟的時候,會導致交換空間效能大幅度下跌,其直接的後果就是導致記憶體操作效率降低,從而影響業務系統效能。比如說:Oracle Dump,OS Dump等等,從這裡來看,大家可以看到,應該使交換空間區域處於獨立磁碟區域,雖然其對於效能要求不是很高,但也不能被完全的衝擊。


   頁面交換空間的大小:
   虛擬記憶體的最終大小為頁面交換空間的大小,當頁面交換耗盡的時候,系統將無記憶體可用,整個伺服器將會被Hang,所有的操作將掛起。合理的頁面交換空間大小是必須的,而且應該是大些好,似乎大除了消耗些磁碟空間,沒有其他的壞處。

   記憶體效率是伺服器執行的基本保證,記憶體效率低下會導致所有業務受到影響,除了普通的業務效能降低之外,這裡舉些更加嚴重的例子:
  (1)、Listener的連線速度將會非常慢,其派生程式速度極慢,甚至無法派生。
  (2)、RAC Instance會經常性掛起。

   計算頁和檔案頁:
   前面說了,檔案系統的快取對於Oracle的收益比較小,Oracle的記憶體系統都屬於計算頁,也就是說在Oracle環境下,應該只有在迫不得已的情況下才交換計算頁,總是應該首先交換檔案頁,並且使檔案頁在總記憶體消耗中處於比較低的水位。

   檔案系統快取在何時會發生作用:
   檔案系統快取對於Oracle發生作用,最主要的在於全表掃描操作,由於全表掃描的特性,使表格資料很難在Buffer CACHE中被快取,這個時候如果在檔案系統快取中包含該資料,全表掃描的效率將會大幅度提高。至於索引掃描,檔案系統快取生效的效率很低,不如把這部分記憶體分配給Buffer Cache使其直接被查詢到,除非你的Buffer Cache已經導致了Oracle的管理成本急劇上升,效率下降,才會考慮把隨機讀需要的快取分配到檔案系統快取中。

   記憶體段大小和數量
   一個OS有多少記憶體可以用,不僅僅是取決於有多少實體記憶體,還取決於設定的記憶體段大小和數量,最大可用的總記憶體:=shmax*shseg
 
   記憶體運算的速度:
   記憶體運算的速度往往在10ns左右,不過這個速度在實際中幾乎很難看到,我們在Oracle中的LIO不僅僅是簡單的記憶體讀,應該還包含很多其他的東西,包括分配,排程等等。通過在實際系統的驗證基本在1~20微妙之間,比較磁碟系統的幾ms,差距還是很明顯的,有幾百到幾千倍的差距,大家如果發現記憶體運算速度明顯上升到幾百甚至到ms的級別,那必然是記憶體系統出現了問題,或者配置問題或者記憶體本身出現了問題。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/92650/viewspace-776253/,如需轉載,請註明出處,否則將追究法律責任。

相關文章