Bagaimana jumlah subdirektori memengaruhi kinerja baca / tulis di Linux?

11

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 ...

T. Brian Jones
sumber
4
Ada alasan mengapa Anda tidak bisa melakukan sesuatu seperti homes/u/username, homes/j/joeblow,homes/s/somebody,...?
Zoredache
1
Metode pengelompokan yang didaftar oleh @Zoredache adalah cara yang selalu kami lakukan sejak dulu (pada mesin yang jauh lebih kecil dengan jumlah pengguna yang besar).
Brian Knoblauch
@Zoredache Ini sepertinya orang miskin b-tree hashing. Tetapi ini lebih lambat karena tidak berjalan dalam ruang kernel, dan membutuhkan lebih banyak disk membaca dan mungkin tidak seimbang. Htree dari ext3 dan ext4 lebih baik. Lihat juga: ext2.sourceforge.net/2005-ols/paper-html/node3.html
Mircea Vutcovici
Anda harus menandai jawaban ...
ewwhite

Jawaban:

7

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.

putih
sumber
XFS jelas merupakan sistem file yang digunakan untuk struktur ini karena mendukung jutaan subdirektori dan kinerja tampaknya tidak terpengaruh seperti EXT3 di mana dampaknya signifikan ... berdasarkan grafik yang saya lihat tidak dapat saya temukan sekarang.
T. Brian Jones
6

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 lsmembutuhkan waktu yang lama, dan Anda tidak melihat apa-apa sampai semua inode telah dibaca dan disortir. Melakukan ls -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/
Javier
sumber
5

Pertama, pastikan partisi ext3 memiliki dir_indexflag yang ditetapkan.

sudo dumpe2fs /dev/sdaX |grep --color dir_index

Jika tidak ada, Anda dapat mengaktifkannya. Anda perlu meng-unmount sistem file, kemudian jalankan:

sudo tune2fs -O dir_index /dev/sdaX
sudo e2fsck -Df /dev/sdaX

Kemudian pasang sistem file.

Mircea Vutcovici
sumber
2

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.

psusi
sumber
2

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:

/users/a/aaron/
/users/a/andrew/
/users/b/betty/
/users/b/brian/

Dan jika Anda masih membutuhkan kinerja yang lebih baik, Anda dapat memperluas beberapa level:

/users/a/a/aaron
/users/a/n/anna
/users/a/n/andrew

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 -ldpada 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.

tylerl
sumber
2

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:

Jika Anda tidak terpengaruh oleh batasan ext3, dan tidak mau mengambil risiko, itu mungkin tidak sepadan. Di sisi lain, setelah berhasil menyelesaikan prosedur migrasi, sistem Anda dapat melakukan lebih cepat, mengalami pemeriksaan sistem file yang diperpendek, dan telah meningkatkan keandalan tanpa efek buruk.

Jadi, silakan dan coba saja. Sarankan Anda membuat cadangan terlebih dahulu.

Mat
sumber
1

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).

Publiccert
sumber
Apakah cara yang lebih tidak menakutkan adalah dengan meletakkan semua file di direktori yang sama?
T. Brian Jones
Saya kira itu tergantung pada definisi menakutkan Anda. Fakta bahwa Anda menggunakan DB untuk mengoordinasikan semua ini tampaknya kurang menakutkan. Saya pasti akan mencoba dan setidaknya mengurangi struktur direktori menjadi beberapa alternatif? Yaitu, berdasarkan tanggal, pengelompokan mereka, dll.
Publiccert
mereka dikelompokkan berdasarkan pengguna. Adakah contoh cara lain Anda telah melihat sistem file besar seperti ini disusun untuk aplikasi web?
T. Brian Jones
Sayangnya, sebagian besar sistem yang saya temui tidak menggunakan EXT3. Saya pikir itu mungkin rintangan pertama Anda.
Publiccert
Salah. Setelah file dibuka dan pegangan terbuka diperoleh I / O untuk file tidak terpengaruh. Namun, waktu buka file terpengaruh.
Matt
1

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.

David
sumber
1

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.

https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/ch06s03.html

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.

Soham Chakraborty
sumber
0

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.

Bojan Markovic
sumber