Jumlah maksimum file dalam satu direktori ext3 sambil tetap mendapatkan kinerja yang dapat diterima?

25

Saya memiliki aplikasi yang menulis ke direktori ext3 yang seiring waktu telah berkembang menjadi sekitar tiga juta file. Tak perlu dikatakan, membaca daftar file direktori ini lambat sekali.

Saya tidak menyalahkan ext3. Solusi yang tepat adalah membiarkan kode aplikasi menulis ke sub-direktori seperti ./a/b/c/abc.extdaripada hanya menggunakan ./abc.ext.

Saya mengubah struktur sub-direktori seperti itu dan pertanyaan saya sederhana: kira-kira berapa banyak file yang harus saya simpan di satu direktori ext3 sambil tetap mendapatkan kinerja yang dapat diterima? Apa pengalaman anda

Atau dengan kata lain; dengan asumsi bahwa saya perlu menyimpan tiga juta file dalam struktur, berapa banyak level ./a/b/c/abc.extstruktur seharusnya?

Jelas ini adalah pertanyaan yang tidak bisa dijawab dengan tepat, tapi saya mencari perkiraan ball park.

Knorv
sumber

Jawaban:

12

Asalkan Anda memiliki distro yang mendukung dir_indexkemampuan maka Anda dapat dengan mudah memiliki 200.000 file dalam satu direktori. Saya akan menyimpannya sekitar 25.000, hanya agar aman. Tanpa dir_index, cobalah untuk tetap di 5.000.

Ignacio Vazquez-Abrams
sumber
10

Jadilah SANGAT hati bagaimana Anda memilih direktori split. "a / b / c" terdengar seperti resep untuk bencana bagiku ...

Jangan hanya membabi buta membuat struktur direktori dalam beberapa, katakanlah 100 entri di tingkat pertama, 100 entri di tingkat kedua, 100 entri di tingkat ketiga. Saya pernah ke sana, melakukan itu, mengambil jaket dan harus merestrukturisasi ketika kinerja masuk ke crapper dengan beberapa juta file. :-)

Kami memiliki klien yang melakukan tata letak "beberapa direktori", dan akhirnya menempatkan hanya satu hingga lima file per direktori, dan ini membunuh mereka. 3 hingga 6 jam untuk melakukan "du" dalam struktur direktori ini. Penyelamat di sini adalah SSD, mereka tidak mau menulis ulang bagian dari aplikasi mereka, dan SSD mengambil waktu ini dari jam ke menit.

Masalahnya adalah bahwa setiap tingkat pencarian direktori membutuhkan pencarian, dan pencarian sangat mahal. Ukuran direktori juga merupakan faktor, jadi memiliki lebih kecil daripada lebih besar adalah kemenangan besar.

Untuk menjawab pertanyaan Anda tentang berapa banyak file per direktori, 1.000 yang saya dengar disebut sebagai "optimal" tetapi kinerja pada 10.000 tampaknya baik-baik saja.

Jadi, apa yang saya sarankan adalah satu tingkat direktori, masing-masing tingkat menjadi direktori 2 karakter, terdiri dari huruf besar dan kecil dan digit, untuk sekitar 3800 direktori di tingkat atas. Anda kemudian dapat menyimpan 14 juta file dengan sub-direktori yang berisi 3800 file, atau sekitar 1.000 file per sub-direktori untuk file 3M.

Saya telah melakukan perubahan seperti ini untuk klien lain, dan itu membuat perbedaan besar.

Sean Reifschneider
sumber
6

Saya sarankan Anda mencoba menguji berbagai ukuran direktori dengan alat pembandingan seperti cap pos , karena ada banyak variabel seperti ukuran cache (baik di OS dan di subsistem disk) yang bergantung pada lingkungan Anda.

Aturan praktis saya adalah bertujuan untuk ukuran direktori dari file <= 20k, meskipun saya telah melihat kinerja yang relatif baik dengan hingga 100k file / direktori.

David Gelhar
sumber
3

Saya memiliki semua file folder seperti:

mengunggah / [tanggal] / [jam] /yo.png

dan tidak memiliki masalah kinerja.

Amy B
sumber
4
Dan berapa banyak file yang Anda dapatkan per jam?
Cascabel
2

Saya dapat mengkonfirmasi pada server yang cukup kuat dengan banyak memori di bawah beban yang layak bahwa 70.000 file dapat menyebabkan semua jenis kekacauan. Saya pergi untuk menghapus folder cache dengan 70k file di dalamnya dan itu menyebabkan apache untuk mulai memunculkan instance baru sampai maxed out pada 255 dan sistem menggunakan semua memori bebas (16gb meskipun virtual instance mungkin lebih rendah). Bagaimanapun, mempertahankannya di bawah 25.000 mungkin merupakan langkah yang sangat bijaksana

jriskin
sumber
1

Dalam pengalaman saya, pendekatan terbaik adalah tidak terlalu-insinyur struktur file di muka. Seperti disebutkan dalam setidaknya satu jawaban lain, ada ekstensi filesystem yang berhubungan dengan akhir masalah kinerja.

Masalah yang lebih sering saya temui adalah kegunaan pada bagian administrasi. Jumlah pekerjaan paling sedikit yang dapat Anda lakukan untuk mengurangi jumlah file dalam direktori mungkin adalah pendekatan yang Anda butuhkan saat ini.

sqrt (3_000_000) == 1732

Beberapa ribu file dalam satu direktori terdengar masuk akal bagi saya. Jadilah hakim sendiri untuk situasi Anda sendiri. Untuk mencapai ini, coba pisahkan file menjadi satu tingkat direktori hash sehingga jumlah rata-rata file per direktori hampir sama dengan jumlah direktori.

Mengingat contoh Anda ini akan menjadi ./a/abc.ext, ./ab/abc.ext, ./abc/abc.ext, ....

Penyebaran file akan sangat bergantung pada nama file yang sebenarnya. Bayangkan menerapkan teknik ini ke direktori sejuta file yang masing-masing dinamai foobar???.txt. Ada beberapa cara untuk mencapai penyebaran yang lebih merata, seperti hashing berdasarkan nilai sejumlah bit tertentu dari jumlah MD5 dari setiap nama file, tetapi saya akan berani menebak bahwa itu akan berlebihan untuk apa yang ingin Anda capai.

Sam Rodgers
sumber
1

Hmm, saya membaca artikel ini baru-baru ini . Pada dasarnya Anda memanfaatkan distribusi algoritma hashing favorit Anda. Saya mulai bermain dengan angka-angka, INT MySQL yang ditandatangani memiliki nilai maksimum 2147483647. Anda juga dapat memvariasikan jumlah file yang diinginkan per direktori dan jumlah subdirektori untuk menyelesaikan jumlah akhir dari sub-direktori / file- perpecahan per-direktori untuk kumpulan data yang diberikan, tetapi sulit untuk menemukan bukti empiris pada direktori / file organisasi yang optimal. Artikel ini memang memberikan beberapa wawasan tentang perbedaan kinerja di seluruh sistem file (beberapa metrik yang menarik), tetapi tidak ada tentang organisasi yang optimal.

quickshiftin
sumber
0

Saya pikir Anda terlalu memikirkan ini. Jika Anda bahkan memilih satu tingkat direktori tambahan dan dapat menyeimbangkan semuanya secara merata, Anda akan memiliki 1732 * direktori dan 1732 file per direktori.

Kecuali Anda berencana membutuhkan puluhan miliar file, Anda dapat memilih angka antara 1000 dan 100.000 dan mendapatkan hasil yang baik.

* akar kuadrat dari 3 juta.

Eric Seppanen
sumber