Saya punya drive yang diformat EXT3 di server Linux CentOS. Ini adalah drive data aplikasi web dan berisi direktori untuk setiap akun pengguna (ada 25.000 pengguna). Setiap folder berisi file yang diunggah pengguna. Secara keseluruhan, drive ini memiliki sekitar 250GB data di dalamnya.
Apakah penataan drive dengan semua direktori ini memengaruhi kinerja baca / tulis drive? Apakah itu memengaruhi beberapa aspek kinerja lain yang tidak saya sadari?
Adakah sesuatu yang secara inheren salah atau buruk dengan menyusun hal-hal seperti ini? Mungkin pilihan filesystem yang salah?
Saya baru-baru ini mencoba menggabungkan dua drive data dan menyadari bahwa EXT3 terbatas pada 32.000 subdirektori. Ini membuat saya bertanya-tanya mengapa. Tampaknya konyol bahwa saya membangunnya dengan cara ini, mengingat setiap file memiliki id unik yang sesuai dengan id dalam database. Sayang ...
sumber
homes/u/username, homes/j/joeblow,homes/s/somebody,...
?Jawaban:
Ini mudah untuk menguji opsi untuk diri sendiri, di lingkungan Anda dan membandingkan hasilnya. Ya, ada dampak negatif pada kinerja karena jumlah direktori meningkat. Ya, sistem file lain dapat membantu mengatasi hambatan itu atau mengurangi dampaknya.
Sistem file XFS lebih baik untuk jenis struktur direktori ini. ext4 mungkin baik-baik saja saat ini. Akses dan operasi pada direktori hanya akan melambat ketika jumlah subdirektori dan file bertambah. Ini sangat jelas di bawah ext3 dan tidak begitu banyak pada XFS.
sumber
Jawabannya tidak sesederhana pilihan sistem file. Sistem file yang waras berhenti menggunakan daftar linear untuk direktori sejak lama, yang berarti bahwa jumlah entri dalam direktori tidak memengaruhi waktu akses file ....
kecuali ketika itu terjadi.
Faktanya, setiap operasi tetap cepat dan efisien tidak peduli jumlah entri, tetapi beberapa tugas melibatkan semakin banyak operasi. Tentunya, melakukan hal yang sederhana
ls
membutuhkan waktu yang lama, dan Anda tidak melihat apa-apa sampai semua inode telah dibaca dan disortir. Melakukanls -U
(tidak diurutkan) sedikit membantu karena Anda dapat melihat itu tidak mati, tetapi tidak mengurangi waktu secara perseptif. Yang kurang jelas adalah bahwa setiap ekspansi wildcard harus memeriksa setiap dan setiap nama file, dan tampaknya dalam kebanyakan kasus seluruh inode harus dibaca juga.Singkatnya: jika Anda dapat yakin bahwa tidak ada aplikasi (termasuk akses shell) yang akan menggunakan wildard, maka Anda bisa mendapatkan direktori besar tanpa penyesalan. Tetapi jika mungkin ada beberapa wildcard yang bersembunyi di dalam kode, lebih baik simpan direktori di bawah seribu entri masing-masing.
edit :
Semua sistem file modern menggunakan struktur data yang baik untuk direktori besar, sehingga satu operasi yang harus menemukan inode dari file tertentu akan cukup cepat bahkan pada direktori besar.
Tetapi, sebagian besar aplikasi tidak hanya melakukan operasi tunggal. Sebagian besar dari mereka akan melakukan direktori lengkap atau pencocokan wildcard. Itu lambat, tidak peduli apa, karena melibatkan membaca semua entri.
Misalnya: katakanlah Anda memiliki direktori dengan sejuta file yang disebut 'foo-000000.txt' hingga 'foo-999999.txt' dan satu 'natalieportman.jpeg'. Ini akan cepat:
ls -l foo-123456.txt
open "foo-123456.txt"
delete "foo-123456.txt"
create "bar-000000.txt"
open "natalieportman.jpeg"
create "big_report.pdf"
ini akan gagal, tetapi gagal juga:
ls -l bar-654321.txt
open bar-654321.txt
delete bar-654321.txt
ini akan lambat, meskipun hasilnya sangat sedikit; bahkan yang gagal, gagal setelah memindai semua entri:
ls
ls foo-1234*.txt
delete *.jpeg
move natalie* /home/emptydir/
move *.tiff /home/seriousphotos/
sumber
Pertama, pastikan partisi ext3 memiliki
dir_index
flag yang ditetapkan.Jika tidak ada, Anda dapat mengaktifkannya. Anda perlu meng-unmount sistem file, kemudian jalankan:
Kemudian pasang sistem file.
sumber
Tidak ada bedanya sampai Anda menekan ext3 32.000 nama per batas direktori. Upgrade ke ext4 dapat mengatasi hal itu, serta manfaat lain yang dimiliki ext4.
sumber
Semakin banyak entri (file, dan dir) yang Anda miliki di dalam satu direktori, semakin lambat aksesnya. Ini berlaku untuk setiap sistem file, meskipun beberapa lebih buruk daripada yang lain.
Solusi yang lebih baik adalah membuat hierarki direktori, seperti ini:
Dan jika Anda masih membutuhkan kinerja yang lebih baik, Anda dapat memperluas beberapa level:
Sebagian besar sistem email menggunakan trik ini dengan file antrian emailnya.
Juga, saya telah menemukan bahwa dengan beberapa sistem file, hanya dengan memiliki banyak entri sebelumnya dalam direktori akan membuat akses direktori menjadi lambat. Lakukan
ls -ld
pada direktori untuk melihat ukuran entri direktori itu sendiri. Jika beberapa MB atau lebih dan direktori relatif kosong, maka kinerja Anda mungkin buruk. Ganti nama direktori, buat yang baru dengan nama dan izin dan kepemilikan yang sama, lalu pindahkan konten direktori lama Anda ke yang baru. Saya telah menggunakan trik ini berkali-kali untuk secara signifikan mempercepat server mail yang telah diperlambat oleh sistem file.sumber
Saya mengembangkan server penyimpanan baru-baru ini yang diperlukan untuk membuat puluhan juta file dan ratusan ribu direktori. Saya membandingkan XFS dengan ext4 dan reiserfs. Saya menemukan bahwa dalam kasus saya, ext4 sedikit lebih cepat daripada XFS. Reiser menarik tetapi memiliki keterbatasan sehingga dijatuhkan. Saya juga menemukan ext4 secara signifikan lebih cepat daripada ext3.
Ketika Anda mendapatkan banyak file per direktori, waktu buka file mulai berkurang. File I / O tidak. Waktu penghapusan file juga menderita. Namun, ini tidak terlalu lambat pada ext4. Ini cukup terlihat di bawah ext3. XFS dan ext4 cukup cepat dalam hal ini.
Ketika saya terakhir melihat XFS dan mempertimbangkan kelebihan dan kekurangan menggunakan XFS over ext4, saya menemukan laporan kehilangan data dengan XFS. Saya tidak yakin ini masih menjadi masalah atau apakah memang pernah ada, tetapi itu membuat saya cukup gugup untuk menghindari. Karena ext4 adalah fs default di Ubuntu, ia menang dengan mudah melalui XFS.
Jadi, selain saran tylerl yang akan membantu dari perspektif manajemen, saya sarankan Anda dapat meningkatkan ke ext4. Batas per direktori adalah 64000 entri dengan ext4
Manfaat lain adalah waktu fsck jauh lebih cepat. Saya tidak pernah memiliki masalah dengan korupsi.
Yang menyenangkan tentang ext4 adalah Anda dapat memasang volume ext3 ke ext4 untuk dicoba. Lihat: Memigrasi sistem langsung dari sistem file ext3 ke ext4
Kutipan dari tautan itu:
Jadi, silakan dan coba saja. Sarankan Anda membuat cadangan terlebih dahulu.
sumber
PASTI akan ada beberapa konsekuensi dari melakukan ini. Yang utama adalah IO baca / tulis. Di luar itu, itu hanya cara yang sangat menakutkan untuk berurusan dengan jenis data (pada skala itu).
sumber
Di masa lalu saya telah menggunakan XFS untuk melewati batas Ext3 dengan sukses.
Daftar pertama isi sistem file akan memakan waktu cukup lama hingga sistem membaca semua informasi direktori / file. Operasi tambahan akan lebih cepat karena kernel sekarang memiliki informasi yang di-cache.
Saya telah melihat admin menjalankan 'find / somepath 2> & 1> / dev / null' di cron secara teratur untuk menjaga cache tetap aktif, menghasilkan kinerja yang lebih baik.
sumber
Saya memiliki beberapa pertanyaan dan beberapa kemungkinan temuan kemacetan.
Pertama, apakah ini sistem CentOS 5 atau 6? Karena pada 6, kami memiliki alat luar biasa yang disebut blktrace yang ideal untuk mengukur dampak dalam situasi seperti ini.
Kita kemudian dapat mem-parsing output dengan Btt dan mendapatkan tempat kemacetan, aplikasi, sistem file, penjadwal, penyimpanan - di mana komponen IO menghabiskan sebagian besar waktu.
Sekarang, secara teoritis sampai pada pertanyaan Anda, itu jelas akan meningkatkan jumlah inode dan ketika Anda terus membuat atau mengakses file atau direktori baru atau yang ada di dalam direktori, waktu akses akan meningkat. Kernel harus melewati hierarki sistem file yang lebih luas dan karenanya tanpa diragukan lagi merupakan overhead.
Hal lain yang perlu diperhatikan adalah bahwa ketika Anda meningkatkan jumlah direktori, penggunaan cache inode dan dentry akan naik berarti konsumsi lebih banyak RAM. Ini ada di bawah memori slab, jadi jika server Anda kehabisan memori, itu adalah titik pemikiran lain.
Berbicara tentang contoh dunia nyata, saya baru-baru ini melihat bahwa pada ext3 fs yang sangat bersarang, membuat subdir untuk pertama kali membutuhkan waktu sekitar 20 detik sedangkan pada ext4 membutuhkan sekitar 4 detik. Itu karena bagaimana alokasi blok disusun dalam sistem file yang berbeda. Jika Anda menggunakan XFS atau ext4 tidak perlu dikatakan bahwa Anda akan mendapatkan beberapa peningkatan kinerja, namun minimal itu mungkin.
Jadi, jika Anda hanya bertanya apa pilihan filesystem yang tepat, ext3 agak ketinggalan jaman. Hanya itu yang bisa saya tawarkan tanpa data dan benchmark lebih lanjut.
sumber
Ini bukan opsi pada CentOS 5, dan tidak yakin berapa banyak itu pilihan pada CentOS 6, tapi saya punya firasat bahwa solusi berbasis B tree atau B * tree yaitu BTRFS akan memberikan kinerja yang konsisten, jika tidak secara signifikan lebih baik pada khususnya Skenario, jika hanya satu yang bisa mempercayakannya dengan data berharga seseorang dengan hati nurani yang jelas (saya masih tidak akan).
Tetapi jika Anda mampu, Anda bisa mengujinya.
sumber