題 寫入子文件夾比寫入父文件夾更快


我使用dd來測量寫入性能並觀察到一些奇怪的事情: 寫入/ data / emzed2比寫入/ data更快。這是我衡量的方式 表現:

$ dd if = / dev / zero 的= /數據/ emzed2 / testfile的 BS = 32

^ C4921834 + 0記錄

4921834 + 0條記錄輸出157498688字節(157 MB),2,87329 s, 54 MB / s

$ dd if = / dev / zero 的= /數據/ testfile的 BS = 32

^ C2487991 + 0記錄

2487991 + 0條記錄輸出79615712字節(80 MB)複製,2,6501 s, 30,0 MB / s

兩個文件夾都位於SSD驅動器上的同一分區上。我使用Ubuntu 14.04並重複實驗幾次,結果相似。

有什麼想法嗎?


6
2017-07-03 08:18


起源


我在13.10上有類似的測量值。速度大約提高了50%。 - Captain Giraffe
我猜這屬於SU。你沒有提到文件系統,它可能是ext4。我的猜測是/ data是一個分區,並且該分區根目錄的傳輸速度更快,因為它受益於ext4優化,包括“第四個技巧是目錄中的所有inode都放在同一個塊組中作為目錄,在可行的情況下。“ (ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout) - Paul Guyot
它是ext4和/ data是一個分區,這種效果只發生在分區根目錄中!你能寫一個常規答案,以便我接受嗎? - rocksportrocker


答案:


看來你受到ext4優化的打擊。其中一些描述於 Ext4磁盤佈局 文檔。

每次增長文件時,例如使用dd,都會為新數據分配一些位置。最終,文件可能被分段,即數據可以通過磁盤分散在幾個塊中。碎片是眾所周知的緩慢(讀取和寫入時)的來源,因此文件系統實現通常會試圖避免它。與使用SSD相比,使用旋轉磁盤(磁頭需要傳輸到連續塊)的碎片更昂貴,但大多數文件系統實現都使用帶有SSD的旋轉磁盤優化策略。

上述文檔中描述的第三,第四和第五“技巧”的組合 威力 解釋為什麼在你的情況下寫入子目錄更快。

第五個技巧是磁盤捲被切割成128MB塊組。 [...]在根目錄中創建目錄時,inode分配器會掃描塊組並將該目錄放入它可以找到的負載最小的塊組中。

結果是, emzed2 可能是在一個128MB的空塊中創建的。

第四個技巧是,在可行的情況下,目錄中的所有inode都與目錄放在同一個塊組中。

所以, /data/testfile 是在(可能是重載)根塊組中創建的 /data/emzed2/testfile 創建於(可能為空) emzed2 塊組。

第三個技巧是它試圖將文件的數據塊保存在與其inode相同的塊組中。

對於 /data/emzed2/testfile,文件系統將首先分配所有數據塊 emzed2 塊組。如果這個塊最初為空,對於前128MB,這意味著根本沒有碎片。對於 /data/testfile,文件系統將首先填充根塊組(如果尚未填充),然後查找其他存儲數據的位置。

此外,您一次增加32個字節的文件。幸運的是,諸如ext4之類的文件系統分配的數據多於您請求的數據(在ext4的情況下為8kb),並嘗試延遲分配。你可能會看到類似的模式 bs=8196,但速度差異可能會隨著塊尺寸的增大而減小。


4
2017-07-12 08:29