資源供給:記憶體和虛擬記憶體
簡單案例: 某客戶執行在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改善。
總之,在當今的效能優化時代,儘可能妥善的使用記憶體吧,可以很大程度上簡化我們的效能優化工作。
記憶體或者虛擬記憶體,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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資源供給:再談記憶體和虛擬記憶體記憶體
- 實體記憶體和虛擬記憶體記憶體
- 虛擬記憶體筆記記憶體筆記
- 虛擬記憶體到實體記憶體(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記憶體筆記