為什麼機械硬碟隨機讀取性能和連續讀寫性能差那麼多?
5400轉的機械盤連續讀寫能飈到100+M,但是存取大量小文件的時候就會掉到400多k,請問這是為什麼呢?
磁碟結構介紹
磁碟結構簡介
再來看下訪問時間,主要有三個部分:
1. 尋道時間,為讀取某個目標扇區的內容,傳動臂首先將磁頭定位到包含目標扇區的磁軌上,這個過程花費的時間即為尋道時間。平均值 3 ~ 9 ms,最大可至 20 ms。2. 旋轉延遲,磁頭定位到目標磁軌後,驅動器等待目標扇區的第一個位旋轉到磁頭下,這個過程如果是 5400 轉的磁碟,平均大概為 5 ms。3. 傳送時間,當目標扇區的第一個位位於磁頭下,到訪問完所有數據花費的時間,如果數據量為一個扇區的容量,這個時間取決於旋轉速度和每個磁軌的扇區數目(密度),假定每個磁軌平均扇區數目為 400,那麼這個時間大概為 0.03 ms。綜上,如果讀取一個扇區的數據,那麼平均用時大概為 9 + 5 + 0.03 = 14.03 ms。主要時間是 尋道時間 和 旋轉延遲,而實際訪問幾乎不用時間。
這也是為什麼連續讀取速度很快,就是因為這個『連續』,這一次讀取過程中,可以簡單的理解為尋道和旋轉延遲只有一次(不嚴謹),大部分時間都花費在實際傳送上。簡單計算下,如果只有傳送時間,5400 轉,每扇區 512 位元組,每個磁軌 400 個扇區,那麼每秒可以傳送 5400 RPM / 60 sec * 400 * 512 = 18,432,000 B / s = 17 MB / s。現在的磁碟,實際的實現複雜,比如每個磁軌擁有的扇區數目不一致,不過一般而言,可以簡單認為各個參數比上述的值要高很多(比如扇區數目 / 比如扇區容量),達到 100 + MB 也是可以的。不過整體原理沒變,尋道時間和旋轉延遲總是存在的,當大量的讀取小文件的時候,也就是不是『順序』讀取,每次讀取尋道時間和旋轉延遲都要再來一遍,假設每個小文件每個 1 K,平均也就能到 1000 ms / 14 ms * 1 K = 70 KB / s(按上述 100 / 17 的倍數,也就是 420 KB / s,和你測試值相近),文件再小一點,速度還可以進一步下降。
推薦閱讀深入理解計算機系統(原書第2版) (豆瓣) 第六章 存儲器層次結構襪子提到了磁碟尋道,這裡再補充兩個原因。
硬碟讀取連續數據的時候會預讀,也就是前面的數據還在路上,後面的數據就開始讀了。但隨機讀取會浪費預讀。
另一個原因是文件系統的overhead。讀寫一個文件之前,得一層層目錄找到這個文件,以及做一堆屬性、許可權之類的檢查。寫新文件時還要加上尋找磁碟可用空間的耗時。對於小文件,這些時間消耗的佔比就非常大了。隨機讀寫的時候磁頭要多次尋道,消耗很長時間。
推薦閱讀:
※C 語言之美(一)
※計算機病毒能夠以毒攻毒嗎?
※深入PCI與PCIe之二:軟體篇
※什麼樣的技術 Leader 是稱職的?