Menulis ke subfolder lebih cepat daripada menulis ke induknya

6

Saya menggunakan dd untuk mengukur kinerja penulisan dan mengamati sesuatu yang aneh: menulis ke / data / emzed 2 lebih cepat daripada menulis ke / data. Ini adalah cara saya mengukur penampilan:

$ dd if = / dev / zero dari = / data / emzed2 / testfile bs = 32

^ C4921834 + 0 catatan dalam

4921834 + 0 mencatat 157498688 byte (157 MB) disalin, 2,87329 s, 54,8 MB / s

$ dd if = / dev / zero dari = / data / testfile bs = 32

^ C2487991 + 0 catatan dalam

2487991 + 0 mencatat 79615712 byte (80 MB) disalin, 2.650 s, 30,0 MB / s

kedua folder berada di partisi yang sama pada drive SSD. Saya menggunakan Ubuntu 14.04 dan mengulangi percobaan beberapa kali dengan hasil yang sama.

Ada yang tahu apa yang terjadi?

rocksportrocker
sumber
1
Saya memiliki pengukuran serupa pada 13.10. Sekitar 50% peningkatan kecepatan.
Captain Giraffe
1
Saya kira ini milik SU. Anda tidak menyebutkan sistem file, mungkin ext4. Dugaan saya adalah bahwa / data adalah partisi, dan bahwa transfer pada akar partisi ini lebih cepat karena manfaat dari optimasi ext4, termasuk "Trik keempat adalah bahwa semua inode dalam direktori ditempatkan di grup blok yang sama sebagai direktori, jika layak. " ( ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout )
Paul Guyot
Itu adalah ext4 dan / data adalah partisi dan efek ini hanya terjadi di root partisi! Bisakah Anda menulis jawaban teratur sehingga saya bisa menerimanya?
rocksportrocker

Jawaban:

4

Tampaknya Anda dilanda optimisasi ext4 . Beberapa di antaranya dijelaskan dalam Tata Letak Disk Ext4 dokumentasi.

Setiap kali Anda membuat file, misalnya dengan dd, beberapa tempat dialokasikan untuk data baru. Akhirnya, file tersebut dapat terfragmentasi, yaitu data dapat tersebar dalam beberapa potongan melalui disk. Fragmentasi adalah sumber kelambatan yang terkenal (ketika membaca dan menulis) dan karena itu implementasi sistem file sering mencoba menghindarinya. Fragmentasi jauh lebih mahal dengan disk berputar (kepala perlu melakukan perjalanan ke potongan berturut-turut) daripada dengan SSD, namun sebagian besar implementasi sistem file menggunakan strategi disk-disk yang dioptimalkan dengan SSD.

Kombinasi "trik" ketiga, keempat dan kelima yang dijelaskan dalam dokumentasi yang disebutkan di atas mungkin jelaskan mengapa menulis ke subdirektori lebih cepat dalam kasus Anda.

Trik kelima adalah bahwa volume disk dipotong menjadi grup blok 128MB. […] Ketika sebuah direktori dibuat di direktori root, pengalokasi inode memindai grup blok dan menempatkan direktori itu ke dalam grup blok paling sedikit dimuat yang dapat ditemukan.

Hasil dari, emzed2 mungkin dibuat di blok kosong 128MB.

Trik keempat adalah bahwa semua inode dalam direktori ditempatkan di grup blok yang sama dengan direktori, jika memungkinkan.

Karena itu, /data/testfile dibuat dalam grup (mungkin sangat dimuat) root block, sementara /data/emzed2/testfile dibuat dalam (mungkin kosong) emzed2 blokir grup.

Trik ketiga [...] adalah mencoba menyimpan blok data file dalam grup blok yang sama dengan inode-nya.

Untuk /data/emzed2/testfile, sistem file akan terlebih dahulu mengalokasikan semua blok data di emzed2 blokir grup. Jika blok ini awalnya kosong, untuk 128MB pertama, ini berarti tidak ada fragmentasi sama sekali. Untuk /data/testfile, sistem file akan terlebih dahulu mengisi grup blok akar jika belum diisi, dan kemudian mencari tempat lain untuk menyimpan data.

Anda juga menumbuhkan file 32 byte sekaligus. Untungnya, sistem file seperti ext4 mengalokasikan lebih banyak data daripada yang Anda minta (dengan potongan 8kb dalam kasus ext4) dan mencoba menunda alokasi. Anda mungkin akan melihat pola yang sama dengannya bs=8196, tetapi perbedaan kecepatan mungkin berkurang dengan ukuran blok yang lebih besar.

Paul Guyot
sumber