資源供給:再談記憶體和虛擬記憶體
簡單案例描述:
某客戶業務系統一直執行正常,突然之間業務系統急劇變慢,資料庫體現大量的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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資源供給:記憶體和虛擬記憶體記憶體
- 實體記憶體和虛擬記憶體記憶體
- 虛擬記憶體筆記記憶體筆記
- 虛擬記憶體到實體記憶體(32位)記憶體
- 【Java基礎】實體記憶體&虛擬記憶體Java記憶體
- 聊聊虛擬記憶體記憶體
- 記憶體管理兩部曲之虛擬記憶體管理記憶體
- Linux 虛擬記憶體Linux記憶體
- 5.虛擬記憶體記憶體
- 虛擬記憶體有什麼用 虛擬記憶體不足怎麼解決記憶體
- 虛擬記憶體系統——瞭解記憶體的工作原理記憶體
- 關於虛擬機器記憶體和JVM記憶體設定的思考虛擬機記憶體JVM
- 教你如何擴大電腦的虛擬記憶體? 什麼是虛擬記憶體?記憶體
- 走出虛擬記憶體禁(轉)記憶體
- ORACLE DISCOVERER虛擬記憶體低Oracle記憶體
- 虛擬記憶體(待補充)記憶體
- win10 8g記憶體虛擬記憶體設定多少合適_win10 8g記憶體怎麼分配虛擬記憶體Win10記憶體
- win10 8g記憶體還需要虛擬記憶體嗎 win10系統8g記憶體怎麼分配虛擬記憶體Win10記憶體
- 計算機作業系統——虛擬記憶體與實體記憶體計算機作業系統記憶體
- Sql Server實體記憶體及虛擬記憶體設定的總結SQLServer記憶體
- Java虛擬機器01——Java記憶體資料區域和記憶體溢位異常Java虛擬機記憶體溢位
- Linux記憶體不夠了?看看如何開啟虛擬記憶體增加記憶體使用量Linux記憶體
- win10怎樣刪虛擬記憶體_Win10虛擬記憶體如何關閉Win10記憶體
- 虛擬記憶體,實體記憶體,頁面檔案,還有工作管理員記憶體
- JAVA 虛擬機器可用記憶體Java虛擬機記憶體
- Java虛擬機器學習 - 記憶體調優Java虛擬機機器學習記憶體
- [轉貼]windows的虛擬記憶體Windows記憶體
- HP虛擬機器重分配記憶體虛擬機記憶體
- Linux增加虛擬記憶體方法Linux記憶體
- Ubuntu 新增虛擬記憶體檔案Ubuntu記憶體
- win10怎麼加虛擬記憶體_win10系統增加虛擬記憶體教程Win10記憶體
- win10虛擬記憶體如何優化_win10怎麼優化虛擬記憶體Win10記憶體優化
- win10虛擬記憶體怎麼設定 win10虛擬記憶體設定方法Win10記憶體
- win10 虛擬記憶體怎麼設定好 win10 虛擬記憶體設定方法Win10記憶體
- win10怎麼調整虛擬記憶體_win10怎麼調虛擬記憶體Win10記憶體
- 怎麼設定虛擬記憶體win10 win10虛擬記憶體如何設定記憶體Win10
- Win10設定虛擬記憶體方法 Win10怎麼設定虛擬記憶體Win10記憶體
- win10虛擬記憶體怎麼設定 筆記本win10虛擬記憶體怎麼看Win10記憶體筆記