自編教材分享:第八章—訪存優(yōu)化(五)



磁盤優(yōu)化
磁盤是由大小相同且同軸的圓形盤片組成,如下圖所示。由于存儲介質(zhì)的特性,內(nèi)存比磁盤的讀寫速度要快很多,但內(nèi)存容量要遠小于磁盤,程序的執(zhí)行要調(diào)入內(nèi)存后才能執(zhí)行,所以內(nèi)存和磁盤要經(jīng)常進行I/O操作,而磁盤的I/O涉及機械操作,因此為了提高程序效率,要盡量減少磁盤的輸入輸出I/O。本節(jié)主要介紹針對磁盤的常用優(yōu)化方法。

多線程操作
線程隨機讀的處理速度可以達到單線程隨機讀的10倍以上,但同時會導致響應時間增大。結(jié)論表明增加線程數(shù),可以有效的提升程序整體的I/O處理速度。但同時,也使得每個I/O請求的響應時間隨之上升。下表中統(tǒng)計了隨著線程數(shù)增加多次讀數(shù)據(jù)平均耗時的變化。

避免隨機寫
磁盤讀取數(shù)據(jù)花費的讀取時間,是由讀取數(shù)據(jù)大小和磁盤密度、磁盤轉(zhuǎn)速決定的固定值共同決定。若磁盤為順序訪問,即相鄰兩次I/O操作的邏輯塊起始地址也是相鄰的,此時磁頭幾乎不用換道,或者換道的時間很短,反之若為隨機寫會導致磁頭不停地換道,造成效率的極大降低,如圖所示。

要想改進這種單線程隨機寫慢的問題,可以通過改變對磁盤的訪問模式來減尋道時間和潛伏時間,即將完全隨機寫變成有序的跳躍隨機寫。具體操作是通過將數(shù)據(jù)在內(nèi)存中緩存并進行排序,使得在寫盤的時候不是完全隨機的,而是使得磁盤磁頭的移動只向一個方向,縮短磁盤的尋址時間。
磁盤預讀
為減少磁盤的讀入寫出,磁盤可以采用數(shù)據(jù)預讀的方式將所需的部分數(shù)據(jù)放入內(nèi)存。當確定了要進行順序預讀時,需要決定合適的預讀大小。為此,Linux采用了一個快速的窗口擴張過程,首次預讀設(shè)置readahead_size = read_size * 2,即預讀窗口的初始值是讀大小的二倍,后續(xù)的預讀窗口將逐次倍增,直到達到系統(tǒng)設(shè)定的最大預讀大小。當然,預讀大小不是越大越好,在很多情況下也需要同時考慮I/O延遲問題。 在進行預讀時,可以使用Linux平臺上的current窗口和ahead窗口來跟蹤當前順序流預讀狀態(tài)。
