cache ORACLE讀寫磁碟經過的快取

2021-06-20 10:40:35 字數 2519 閱讀 4208

cache和buffer是兩個不同的概念,簡單的說,cache是加速「讀」,而buffer是緩衝「寫」,前者解決讀的問題,儲存從磁碟上讀出的資料,後者是解決寫的問題,儲存即將要寫入到磁碟上的資料。在很多情況下,這兩個名詞並沒有嚴格區分,常常把讀寫混合型別稱為buffer cache,本文後續的論述中,統一稱為cache。

oracle中的log buffer是解決redo寫入的問題,而data buffer cache則解決data block的讀寫問題。對於oracle來說,如果io沒有在sga中命中,都會發生物理io,oracle並不關心底層儲存的型別,可能是一套儲存系統,可能是本地磁碟,可能是raid 10,也可能是raid 5,可能是檔案系統,也可能是裸裝置,或是asm。總之,oracle把底層的儲存系統稱為儲存子系統。

在儲存系統中,cache幾乎無處不在(在後面的論述中,我們統稱為cache),檔案系統有cache,儲存有cache,raid控制器上有cache,磁碟上也有cache。為了提高效能,oracle的乙個寫操作,很有可能寫在儲存的cache上就返回了,如果這時儲存系統發生問題,oracle如何來保證資料一致性的問題。

首先先說明一下oracle體系結構裡面會出現快取的地方:

1、oracle快取(包括pga/sga);

2、os快取(其實這個一直都有點歧義,我個人感覺應該是說檔案系統的快取,所以說如果是裸裝置的話就會沒有os快取這個說法);

3、儲存快取;

4、硬碟快取;(如果使用的是儲存,硬碟快取通常都是關掉的。儲存的電池,一般只保護儲存cache,不對硬碟快取提供保護。如果沒使用儲存,我們之前的做法,是禁掉硬碟快取。)

5、cpu一二級快取。

oracle的buffer cache和作業系統的cache buffer誰更有效率。其實無論誰,都很有效率,但為什麼通常建議繞過os 檔案系統的cache呢,這是因為資料庫的buffer cache是針對資料庫設計的,os 檔案系統層cache是通用型的,所以在有些情況下,os層cache不如oracle buffer cache表現更好。

一般讀流程:

cpu------一二級快取(如有)-----sga-----os(如有)------儲存coache-----硬碟coache------儲存物理

一般寫寫流程:

cpu-----sga-----儲存coache-----儲存物理

相關cache l1、l2 cache的,在oracle中不必關心,因為無法觀察。如果對這一塊感興趣,推薦一本書《深入理解計算機系統》,有比較詳細的cpu 一、二級cache原理。還有就是,硬碟cache大部分是關閉的,如果沒關,建議關閉,否則有可能丟失資料。

oracle資料庫最重要的特性是:write ahead logging,在data block在寫入前,必須保證首先寫入redo log,在事務commit時,同時必須保證redo log被寫入。oracle為了保證資料的一致性,對於redo log採用了direct io,direct io會跳過了os上檔案系統的cache這一層。但是,os管不了儲存這一層,雖然跳過了檔案系統的cache,但是依然可能寫在儲存的cache上。

一般的儲存都有cache,為了提高效能,寫操作在cache上完成就返回給os了,我們稱這種寫操作為writeback,為了保證掉電時cache中的內容不會丟失,儲存都有電池保護,這些電池可以供儲存在掉電後工作一定時間,保證cache中的資料被刷入磁碟,不會丟失。不同於ups,電池能夠支撐的時間很短,一般都在30分鐘以內,只要保證cache中的資料被寫入就可以了。儲存可以關閉寫cache,這時所有的寫操作必須寫入到磁碟才返回,我們稱這種寫操作為writethrouogh,當儲存發現某些部件不正常時,儲存會自動關閉寫cache,這時寫效能會下降。

raid卡上也有cache,目前一般是256mb或者更大,同樣是通過電池來保護的,不同於儲存的是,這個電池並不保證資料可以被寫入到磁碟上,而是為cache供電以保護資料不丟失,一般可以支撐幾天的時間。還有些raid卡上有flashcache,掉電後可以將cache中的內容寫入到flash cache中,保證資料不丟失。如果你的資料庫沒有儲存,而是放在普通pc機的本地硬碟之上的,一定要確認主機中的raid卡是否有電池,很多硬體提供商預設是不配置電池的。當然,raid卡上的cache同樣可以選擇關閉。

磁碟上的cache,一般是16mb-64mb,很多儲存廠商都明確表示,儲存中磁碟的cache是禁用的,這也是可以理解的,為了保證資料可靠性,而儲存本身又提供了非常大的cache,相比較而言,磁碟上的cache就不再那麼重要。scsi指令中有乙個fua(force unit access)的引數,設定這個引數時,寫操作必須在磁碟上完成才可以返回,相當於禁用了磁碟的寫cache。雖然沒有查證到資料,但是我個人認為一旦磁碟被接入到raid控制器中,寫cache就會被禁用,這也是為了資料可靠性的考慮,我相信儲存廠商應該會考慮這個問題。

至此,我們可以看到oracle的乙個物理io是經歷了一系列的cache之後,最終被寫入到磁碟上。cache雖然可以提高效能,但是也要考慮掉電保護的問題。關於資料的一致性,是由oracle資料庫,作業系統和儲存子系統共同來保證的。

---the end---

微博

磁碟讀寫之磁碟騙了我?

我們總是想如何將自己磁碟空間能得到最大化的利用,即去掉無用檔案。畢竟磁碟也就這麼大 我的磁碟空間為50g 你有過鬼迷心竅的時候嗎?突然心血來潮,想將你的磁碟寫滿。寫滿,寫滿磁碟,天吶!感覺恐怖!先來認識下dd命令 dd if dev zero of tmp file bs 1g count 10 下...

測試磁碟讀寫效能

讀效能測試 time dd iflag direct,nonblock if dev sda2 of dev null bs 8k count 8388608 因為 dev sda2是乙個物理分割槽,對它的讀取會產生io,dev null是偽裝置,相當於黑洞,of到該裝置不會產生io,所以,這個命令...

linux磁碟讀寫測試

time dd 測磁碟讀寫速度 1 先熟悉兩個特殊的裝置及一些相關引數 1 time有計時作用,dd用於複製,從if讀出,寫到of 2 if dev zero 產生字元 不產生io,因此可以用來測試純寫速度 3 同理of dev null 站 無底洞 不產生io,可以用來測試純讀速度 4 將 tmp...