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

sunsapollos發表於2013-11-10
        簡單案例: 某客戶執行在HP Unix上的Oracle資料庫週期性的出現業務系統效能下降,甚至於業務系統掛起,每次都需要重新啟動伺服器來完成。伺服器擁有很高的記憶體,資料庫也沒有分配太高的記憶體,原因當然也很簡單,交換空間配置太少,使程式派生受限,導致程式空間的記憶體不斷被交換到磁碟上,效能下降甚至於掛起。這類故障在當年是極為普遍的,幾乎每個HP-UX使用者都會遇到,現在可能隨著作業系統特性的變更消失了。HP-UX在程式派生的時候,需要在交換空間複製一份程式資料,由於交換空間的不足導致HP-UX僅僅可以使用不超過交換空間的記憶體空間,即使你有32GB記憶體,如果交換空間只有2G,那麼你也只能使用2GB的程式記憶體空間。

      記憶體或者虛擬記憶體,Oracle業務系統執行最為重要的因素。記憶體無所謂多和少,在Oracle資料庫中,記憶體更多的表現為一個調和因素,為CPU提供低階的快取,為IO提供高階的快取,使CPU和IO處理之間調節劑。
      虛擬記憶體,實際記憶體+交換空間一起構成虛擬記憶體,Oracle實際上是在虛擬記憶體空間執行。可以看到,當Oracle訪問的資料如果處於交換空間之中,訪問效能將大幅度下降,記憶體訪問的速度將降低到磁碟訪問的速度。
     討論記憶體,主要是幾個問題:
    (1)、多少記憶體才足夠?
    (2)、多少記憶體表示不足?
    (3)、如何更好讓記憶體在CPU和磁碟之間協調?

   (1)、 多少記憶體才足夠
    Oracle需要多少記憶體? Oracle需要SGA空間和程式空間。
    Buffer Cache是作為磁碟系統的快取,只要訪問程式需要Buffer cache的時候有足夠的記憶體可用,就意味Buffer cache的分配是足夠的。free buffer waits等待事件體現了Buffer cache的記憶體是否足夠。
    Shared Pool是作為CPU系統快取,記憶體空間可多可少,只要不出現ora-4031錯誤就可以認為shared pool是夠用的。
   SQL workarea作為訪問程式的工作區域,只要大部分的排序區域可以在SQL workarea中執行,就表示足夠了。
   程式私有空間,每個程式都需要一定的私有記憶體,多少程式數量決定了程式私有空間的大小。

   從Oracle執行來說,只要具有一定的記憶體就可以執行,而且可以執行的很好。

  (2)、多少記憶體表示不足?
   很多人用free來剩下多少記憶體來表示記憶體空間是否足夠,事實上這個是不準確的。任何作業系統設計為了效能追求,都是貪婪型設計,也就是說只要有記憶體總會被吃完,free空間的多少並不反映記憶體是否足夠,絕大部分系統即使你擁有幾百GB的記憶體,記憶體剩餘空間也是很少的。當然這個free值是我們快速獲取記憶體是否足夠的指標之一,他某種程度上反映了處於空閒列表中的記憶體塊數量,其數量越多意味著記憶體分配的效率會越高。
   對於記憶體來說,基本上而言只有活動和髒的資料塊可以被認為是被使用的,其他都可以被認為是自由空間。
   多少記憶體才表示不足?
   (1)、當你的程式需要記憶體的,發現已經沒有記憶體可用,需要把髒塊寫到交換空間,等待記憶體空閒出來再分配。
   (2)、當你的程式訪問資料的時候,發現資料不在記憶體空間中,需要從交換空間把資料去讀出來。
   (3)、當你的程式需要記憶體的時候,需要掃描太多的記憶體塊去發現自由空間以提供分配。

    也就是說:process page in(pi),process page out(po),search page depth(sr),page replace number(fr),基本決定了記憶體是否足夠。
   主要的記憶體是否不足檢視的命令:
   vmstat 
   free
   sar
  另外除了process page in(pi)和process page out(po)之外,page in和page out是由作業系統lru演算法持續進行的工作,他總是把一些看起來不常用的頁面交換到交換空間,把髒資料塊寫到交換空間。大家只要想象一下Oracle dbwr程式如何工作就可以了。

   (3)、記憶體作為CPU和IO的協調器
    伺服器系統的發展,使記憶體成為最廉價和最容易調整的單元。CPU很難擴容,IO子系統的能力增強擴容也很難,往往涉及到大規模的投資和實施成本,只有記憶體的擴容在很多情況下采購成本低,業務成本低,是一種簡單可以選擇的方向。在現在的記憶體廉價時代,效能優化者可以考慮把增加記憶體配置作為一個重要的優化選擇項。
   
   記憶體作為IO的快取:
           記憶體和IO的速度差異至少100倍以上,甚至高達1000倍,通過更多的記憶體使IO結果快取在記憶體中,使訪問磁碟的IO數量降低而提高效能。
           分配更多的SGA區域: 減緩各種磁碟IO
           分配更多的記憶體:       訪問程式從來不到交換空間獲取資料,也從來不為了記憶體空間竊取記憶體頁面。

    記憶體作為IO的替代:
           對於Oracle來說,直接把一些IO頻繁的表格和索引Cache在記憶體中,使其從根本上消除IO。

     記憶體作為檔案系統快取:
           檔案系統快取對於Oracle全表掃描具有一定意義,但一般不建議如此,除非你有多的發閒的記憶體,同時快取資料庫又覺得不足。

    更多的記憶體訪問帶來的CPU壓力:
  
     更多的記憶體訪問將使CPU的壓力加大,加大的壓力來自於兩個方面:
    (1)、記憶體維護操作
    更大的記憶體鏈會帶來更高的維護成本,需要消耗更多的CPU
    (2)、大量記憶體操作將使CPU始終處於工作狀態,表面看來會導致CPU使用率升高。

    更多的記憶體訪問會帶來更大的IO壓力
   
    執行速度更快之後將會有更多的IO指令被壓上IO子系統,可能由於快取被消除的IO被其他IO迅速填補,表面上會發現並沒有IO改善。

   總之,在當今的效能優化時代,儘可能妥善的使用記憶體吧,可以很大程度上簡化我們的效能優化工作。
  

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

相關文章