Cache 和 Buffer 的區別在哪裡?
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資料庫最重要的特性是: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了,我們稱這種寫操作為write back,為了保證掉電時cache中的內容不會丟失,儲存都有電池保護,這些電池可以供儲存在掉電後工作一定時間,保證cache中的資料被刷入磁碟,不會丟失。不同於UPS,電池能夠支撐的時間很短,一般都在30分鐘以內,只要保證cache中的資料被寫入就可以了。儲存可以關閉寫cache,這時所有的寫操作必須寫入到磁碟才返回,我們稱這種寫操作為write throuogh,當儲存發現某些部件不正常時,儲存會自動關閉寫cache,這時寫效能會下降。
RAID卡上也有cache,一般是256M,同樣是透過電池來保護的,不同於儲存的是,這個電池並不保證資料可以被寫入到磁碟上,而是為cache供電以保護資料不丟失,一般可以支撐幾天的時間。還有些RAID卡上有flash cache,掉電後可以將cache中的內容寫入到flash cache中,保證資料不丟失。如果你的資料庫沒有儲存,而是放在普通PC機的本地硬碟之上的,一定要確認主機中的RAID卡是否有電池,很多硬體提供商預設是不配置電池的。當然,RAID卡上的cache同樣可以選擇關閉。
磁碟上的cache,一般是16M-64M,很多儲存廠商都明確表示,儲存中磁碟的cache是禁用的,這也是可以理解的,為了保證資料可靠性,而儲存本身又提供了非常大的cache,相比較而言,磁碟上的cache就不再那麼重要。SCSI指令中有一個FUA(Force Unit Access)的引數,設定這個引數時,寫操作必須在磁碟上完成才可以返回,相當於禁用了磁碟的寫cache。雖然沒有查證到資料,但是我個人認為一旦磁碟被接入到RAID控制器中,寫cache就會被禁用,這也是為了資料可靠性的考慮,我相信儲存廠商應該會考慮這個問題。
至此,我們可以看到Oracle的一個物理IO是經歷了一系列的cache之後,最終被寫入到磁碟上。cache雖然可以提高效能,但是也要考慮掉電保護的問題。關於資料的一致性,是由Oracle資料庫,作業系統和儲存子系統共同來保證的。
作者 | michael1983 轉自 |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545820/viewspace-2665351/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux Buffer/Cache 的區別Linux
- buffer與cache的區別
- Cache 和 Buffer 有什麼區別?
- Cache和Buffer都是快取,有什麼區別?Linux快取Linux
- 33、buffer_cache_3(redo的產生、LRBA、buffer cache裡的等待事件)事件
- 計算機buffer和cache的區別?linux運維學習知識計算機Linux運維
- Service Worker Cache 和 HTTP Cache 的區別HTTP
- Client Side Cache 和 Server Side Cache 的區別clientIDEServer
- 創業和打工的最本質區別在哪裡?創業
- CC攻擊和DD攻擊的區別在哪裡
- 微信小程式和app最大區別在哪裡微信小程式APP
- 聯合辦公和孵化器的區別在哪裡
- Vue.js 的 computed 屬性和 watch 的區別在哪裡?Vue.js
- 華納雲:cdn和普通伺服器的區別在哪裡伺服器
- MPLS與專線的區別在哪裡?——VecloudCloud
- IO之核心buffer----"buffer cache"
- 前端和後端的區別在哪?前端後端
- Oracle Cache Buffer ChainsOracleAI
- 【Cache】將常用的“小表”快取到Buffer Cache快取
- 單件流與批次流的區別在哪裡?
- 手動釋放Linux上的Swap、Buffer和CacheLinux
- 【Linux基礎】ftp、sftp和scp是什麼?區別在哪裡?LinuxFTP
- Linux和Unix之間有什麼關聯?區別在哪裡?Linux
- Spring Cloud:Zookeeper和Eureka的區別在哪?SpringCloud
- 清理buffer/cache/swap的方法梳理
- 新媒體運營與文案的區別在哪裡?
- HTTP 頭部欄位 Cache Control max-age = 0 和 no-cache 的區別HTTP
- Linux工具效能調優系列二:buffer和cacheLinux
- Linux如何手動釋放Swap、Buffer和CacheLinux
- Buffer Cache以及buffer busy waits/gc相關事件AIGC事件
- 【BUFFER】Oracle buffer cache之 latch 學習記錄Oracle
- Rxjs 裡 Subject 和 BehaviorSubject 的區別JS
- TypeScript 裡 interface 和 type 的區別TypeScript
- 什麼是數字化和數字化轉型?區別在哪裡?
- 調整緩衝區快取記憶體(Buffer Cache)的效能(轉)快取記憶體
- 和數傳媒:區塊鏈的未來在哪裡?區塊鏈
- PostgreSQL DBA(89) - Linux(Buffer vs Cache)SQLLinux
- Linux記憶體、Swap、Cache、BufferLinux記憶體