1. 操作系統緩存
在linux世界里,一切可讀寫設備都可看作是文件。文件cache設計的好壞直接影響着文件系統和磁盤的性能。最直觀的是使用free命令看到的cached列。

這里面的cached列就是操作系統緩存,操作系統會把空閑的內存拿來做緩存,提高系統性能。當然這里的cached不僅僅緩存文件的數據。操作系統的cache是通過page的方式管理的,內從管理系統分配和回收cache的最小單位是page。這個cache由多個page cache組成,每個page cache又包含多個buffer cache。VF(虛擬文件系統)和內從管理系統只與page cache交互,具體的文件系統和buffer cache交互。
2. 操作系統緩存讀寫方式
操作系統默認的讀寫都是有緩存的,如果想使用直接io,需要設置direct_io為true。緩存可以提高系統的讀取速度,當第一次讀取一個文件的時候,操作系統會把文件內從讀入cache中,然后返回給用戶;第二次讀取的時候首先會從cache中檢查,命中后返回給用戶。
操作系統IO有通寫和回寫兩種寫方式:
write through (通寫)
可以理解IO通過的地方都寫入。這種方式在寫數據時,先寫cache再寫磁盤,寫磁盤成功后通知磁盤控制器返告知操作系統本次IO成功,操作系統再通知上層應用IO成功。
write back (回寫)
操作系統把數據寫入cache后便告知上層應用IO成功,其實此時並沒有把數據持久化到磁盤介質。何時把cache刷入磁盤由操作系統的實現策略:比如cache空間滿、調用sync顯示的把cache刷入磁盤等。
注意:回寫和異步寫不同,異步寫在寫成功后會通知調用層,而回寫在寫入磁盤后不會通知調用層。所以回寫成功只意味着寫入操作系統緩存成功了,在返回io返回成功的情況下依然可能丟數據;而異步寫告訴調用層io成功意味着數據已經被持久化到存儲介質中了。
通寫和回寫優缺點:
write through
優點:無丟數據風險:由於返回IO成功即表示持久化成功,那么掉電也不會丟失任何數據,
缺點:寫入速度慢:要寫內存和磁盤兩份數據
write back
優點:寫入速度快:只要寫入cache成功即可返回
缺點:有丟數據風險:如果cache中的數據沒有刷入磁盤時斷電,cache中的數據會丟失。
兩種方式應用場景:
write through 一般應用在數據一致性要求高的場合
write back 寫方式一般應用在對一致性要求不高且需要很好讀寫性能場景
下面以cp命令做個例子


a. 初始時系統cache為60M
b. 使用dd命令生成一個10M的塊設備,此時iotest.dat數據被緩存到cache中,cache變為70M
c. cp iotest.dat iotest.dat.1 會直接從內存中讀取iotest.dat文件,然后寫入到cache中。
難道cache此時緩存了兩份iotest.dat的數據?
d. 繼續調用cp iotest.dat iotest.dat.2,cache變為了90M。可見cache中寫時緩存不會對內容去重,緩存了3分相同內容的文件(iotest.dat iotest.dat.1 iotest.dat.2)。
e. 繼續調用cp iotest.dat iotest.dat.1,由於在cache中iotest.dat 和iotest.dat.1都已被緩存,所以此處cache不在發生變化。(此處猜測cache支持文件級別去重,不支持內容去重)