1 預(yù)讀需求的產(chǎn)生
磁盤的機械臂+旋轉(zhuǎn)盤片的數(shù)據(jù)定位與讀取方式寿谴,決定了它最突出的性能特點:擅長順序讀寫匣距,不善于隨機I/O,I/O延遲非常大上荡。由此而產(chǎn)生了兩個方面的預(yù)讀需求谐岁。
2 來自磁盤的需求
簡單的說,磁盤的一個典型I/O操作由兩個階段組成:
1.數(shù)據(jù)定位
平均定位時間主要由兩部分組成:平均尋道時間和平均轉(zhuǎn)動延遲榛臼。尋道時間的典型值是4.6ms。轉(zhuǎn)動延遲則取決于磁盤的轉(zhuǎn)速:普通7200RPM桌面硬盤的轉(zhuǎn)動延遲是4.2ms窜司,而高端10000RPM的是3ms沛善。這些數(shù)字多年來一直徘徊不前,大概今后也無法有大的改善了塞祈。在下文中金刁,我們不妨使用 8ms作為典型定位時間。
2.數(shù)據(jù)傳輸
持續(xù)傳輸率主要取決于盤片的轉(zhuǎn)速(線速度)和存儲密度,最新的典型值為80MB/s尤蛮。雖然磁盤轉(zhuǎn)速難以提高媳友,但是存儲密度卻在逐年改善。巨磁阻产捞、垂直磁記錄等一系列新技術(shù)的采用醇锚,不但大大提高了磁盤容量,也同時帶來了更高的持續(xù)傳輸率坯临。
顯然焊唬,I/O的粒度越大,傳輸時間在總時間中的比重就會越大看靠,因而磁盤利用率和吞吐量就會越大赶促。簡單的估算結(jié)果如表1所示。如果進行大量4KB的隨機I/O挟炬,那么磁盤在99%以上的時間內(nèi)都在忙著定位鸥滨,單個磁盤的吞吐量不到500KB/s。但是當(dāng)I/O大小達到1MB的時候谤祖,吞吐量可接近50MB /s婿滓。由此可見,采用更大的I/O粒度泊脐,可以把磁盤的利用效率和吞吐量提高整整100倍空幻。因而必須盡一切可能避免小尺寸I/O,這正是預(yù)讀算法所要做的容客。
表1隨機讀大小與磁盤性能的關(guān)系
3 來自程序的需求
應(yīng)用程序處理數(shù)據(jù)的一個典型流程是這樣的:while(!done) { read(); compute(); }秕铛。假設(shè)這個循環(huán)要重復(fù)5次,總共處理5批數(shù)據(jù)缩挑,則程序運行的時序圖可能如圖1所示但两。
圖1典型的I/O時序圖
不難看出,磁盤和CPU是在交替忙碌:當(dāng)進行磁盤I/O的時候供置,CPU在等待;當(dāng)CPU在計算和處理數(shù)據(jù)時谨湘,磁盤是空閑的。那么是不是可以讓兩者流水線作業(yè)芥丧,以便加快程序的執(zhí)行速度?預(yù)讀可以幫助達成這一目標(biāo)紧阔。基本的方法是续担,當(dāng)CPU開始處理第1批數(shù)據(jù)的時候擅耽,由內(nèi)核的預(yù)讀機制預(yù)加載下一批數(shù)據(jù)。這時候的預(yù)讀是在后臺異步進行的物遇,如圖2所示乖仇。
圖2預(yù)讀的流水線作業(yè)
注意憾儒,在這里我們并沒有改變應(yīng)用程序的行為:程序的下一個讀請求仍然是在處理完當(dāng)前的數(shù)據(jù)之后才發(fā)出的。只是這時候的被請求的數(shù)據(jù)可能已經(jīng)在內(nèi)核緩存中了乃沙,無須等待起趾,直接就能復(fù)制過來用。在這里警儒,異步預(yù)讀的功能是對上層應(yīng)用程序“隱藏”磁盤I/O的大延遲训裆。雖然延遲事實上仍然存在,但是應(yīng)用程序看不到了冷蚂,因而運行的更流暢缭保。