【分享】盤IO在隨機寫與順序寫的差異

作者:Qilan Yuan
鏈接:https://www.zhihu.com/question/26028619/answer/32932317
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
 

這個問題要分情況討論:在機械硬盤上寫還是在固態硬盤上寫。儘管結論都是順序寫比隨機寫快,但是原因卻是不一樣的。

首先說機械硬盤,我先介紹一下它的存儲原理。機械硬盤的結構你可以想象成一個唱片機,它有一個旋轉的盤片和一個能沿半徑方向移動的磁頭。處理讀取和寫入請求時,首先可以根據請求的開始地址算出要處理的數據在磁盤上的位置,之後要進行以下幾步工作:
1、磁頭沿半徑方向移動,直至移動到數據所在的柱面(相同半徑的磁道組成的環面)
2、盤片高速旋轉,使磁頭到達數據的起始位置
3、磁頭沿磁道從磁盤讀取或寫入數據
當一次讀取的數據量很少的時候,1、2步驟帶來的開銷是無法忽略的,這使得隨機寫相對於順序寫會有巨大的性能劣勢。因爲在順序寫的時候,1、2步驟只需要執行一次,剩下的全是數據傳輸所需要的固有開銷;而每次隨機寫的時候,前兩個步驟都需要執行,帶來了極大的額外開銷。

其次說固態硬盤。理論上來說,它不應該存在明顯的隨機寫與順序寫的速度差異,因爲它就是一塊支持隨機尋址的存儲芯片,沒有尋道和旋轉盤片的開銷,但是隨機寫實際上還是比順序寫要慢。這是由於其存儲介質閃存的一些特性導致的,簡單來說:
1、閃存不支持in-place update:你更新一個數據,不可以直接在原有數據上改,而要寫到新的空白的地方,並把原有數據標記爲失效。
2、標記失效的數據不是浪費空間麼?可以將其清除。但是閃存上清除操作的最小單位是一個大塊,大約128K-256K的大小。一次清除會影響到還未標記失效的有用的數據,要先把它們移走。
這種感覺就如同你在網格紙上寫一篇文章,一格一格往下寫,只能寫在空白的格子裏;但是你若要清除之前寫的內容,只能整行擦除。非常難受而且浪費空間對吧?所以固態硬盤裏實現了垃圾回收算法,用來更好地利用存儲空間,同時減少數據遷移,保護閃存壽命。
那麼隨機寫顯然比順序寫帶來更大的碎片化,從而帶來更多的垃圾回收開銷、數據遷移開銷,自然就比順序寫要慢了。

附:張冬(冬瓜哥)

PMC公司數據中心存儲架構師

2 人贊同了該回答

隨機寫同樣比順序寫慢,如果沒有Cache,那後果是很嚴重的。有了Cache,能大大提升隨機寫的速度,但是仍然比連續寫要慢一些。
即便有了Cache,還要看Cache策略,是write back模式還是write through模式,write through模式的話,隨機寫雖然比沒有Cache情況下要快一些,但是依然很慢。write back模式下,只要Cache足夠大,控制器將Data收進來並作妥善安置後便會對主機返回ack,IO完成,然後控制器會對這些隨機的IO進行重新優化寫盤。

ps:ssd的原理,http://oserror.com/backend/ssd-principle/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章