file maks per direktori dalam ext4

16

Saya mengelola aplikasi yang berisi filestore di mana semua file disimpan dengan nama file yang sama dengan jumlah md5 mereka. Semua file disimpan dalam satu direktori. Saat ini ada ribuan, tetapi segera mereka akan menjadi jutaan file di server. Server saat ini menjalankan Ubuntu 11.10 pada sistem file ext4.

Seseorang mengatakan kepada saya bahwa tidak bijaksana untuk meletakkan banyak file dalam direktori, karena ini akan menciptakan peningkatan waktu dan keandalan pencarian yang signifikan (dia punya cerita tentang file maks yang bisa ditunjukkan oleh satu dir, menghasilkan daftar yang ditautkan besar). Sebagai gantinya ia menyarankan untuk membuat sub direktori dengan misalnya substring dari nama file. Namun, ini akan membuat beberapa hal dalam aplikasi saya jauh lebih rumit.

Apakah ini masih benar, atau apakah sistem file modern (misalnya ext4) memiliki cara yang lebih efisien untuk menangani ini dan skala secara alami? Wikipedia memiliki beberapa perincian tentang sistem file, tetapi tidak benar-benar mengatakan apa-apa tentang file maks per direktori, atau waktu pencarian.

Jeroen
sumber

Jawaban:

8

Sistem ext3file dan yang lebih baru mendukung pengindeksan direktori B-tree hash . Ini berskala sangat baik selama satu-satunya operasi yang Anda lakukan adalah menambah, menghapus, dan mengakses berdasarkan nama. Namun, saya tetap merekomendasikan untuk memecah direktori. Jika tidak, Anda membuat ranjau berbahaya bagi alat ( updatedb, ls, du, dan sebagainya) yang melakukan operasi lain pada direktori yang dapat meledakkan jika direktori memiliki terlalu banyak entri.

David Schwartz
sumber
8

Inti dari masalah ini adalah menggali melalui inode direktori untuk satu file yang Anda inginkan. Beberapa sistem file melakukan ini lebih baik daripada yang lain. Beberapa skala dekat dengan miliaran, tetapi jika Anda hanya memiliki ... 20 ribu file untuk mendapatkan file-file itu sangat cepat. Juga, jumlah file yang besar menciptakan masalah untuk alat-alat tertentu dan mungkin membuat cadangan / mengembalikan masalah yang jauh lebih sulit sebagai hasilnya.

Ketika itu terjadi, saya mengalami masalah yang sama persis dalam pengembangan kami sendiri (md5sum sebagai nama file, penskalaannya). Apa yang saya rekomendasikan kepada pengembang kami adalah memotong string menjadi beberapa bagian. Mereka pergi dengan kelompok 4, tetapi pada sistem file kami pada saat itu bahkan banyak yang terbukti bermasalah dari perspektif kinerja, jadi mereka akhirnya berpisah pada grup-of-3 untuk 6 triplet pertama dan meninggalkan sisanya sebagai nama file di direktori terminal.

Kelompok 4: 4976/d70b/180c/6142/c617/d0c8/9d0b/bd2b.txt
Kelompok 3:497/6d7/0b1/80c/614/2c6/17d0c89d0bbd2b.txt

Ini memiliki keuntungan menjaga ukuran direktori kecil, dan karena MD5sum cukup acak, itu akan membuat pohon direktori seimbang. Direktori terakhir itu tidak mungkin mendapatkan lebih dari beberapa file. Dan bukankah itu sulit untuk mengerjakan kode kita. Kami bekerja dengan multi-juta proyek file, jadi penskalaan sangat penting bagi kami.

sysadmin1138
sumber
4
Berhati-hatilah bahwa jika penyerang memiliki sumber daya komputasi, ia dapat dengan sengaja membuat data jahat yang akan mendarat di direktori yang sama. Seorang penyerang dengan sumber daya yang layak dan teknologi saat ini dapat menghasilkan hash yang memiliki 9 digit hex pertama yang sama (dan dengan demikian bertabrakan dalam tiga level direktori pertama) dengan laju sekitar satu setiap sepuluh menit. Dan, tentu saja, hash MD5 penuh dapat dihasilkan hari ini.
David Schwartz
5

Sistem file modern menangani direktori yang sangat besar dengan sangat baik, bahkan hingga jutaan file. Tetapi alat konvensional tidak. Misalnya mendaftarkan direktori besar dengan "ls" akan memakan waktu yang cukup lama karena biasanya membaca seluruh direktori dan mengurutkannya (walaupun Anda dapat menggunakan ls -f untuk menghindari pengurutan). Itu tidak akan mulai menampilkan file sampai semua dibaca. Membagi nama membantu dalam beberapa kasus, tetapi tidak sama sekali (misalnya replikasi rsync masih perlu mengumpulkan seluruh pohon nama).

Skaperen
sumber
-1

Bisakah saya menyarankan menggunakan database SQL saja? Ini kemungkinan akan mengubah kelemahan yang dirasakan ini dalam aplikasi Anda menjadi suatu kekuatan.

RedScourge
sumber