Menurut makalah ini di Haystack Facebook:
" Karena cara peranti NAS mengelola metadata direktori, menempatkan ribuan file dalam direktori sangat tidak efisien karena blockmap direktori terlalu besar untuk di-cache secara efektif oleh alat. Akibatnya, biasanya lebih dari 10 operasi disk dilakukan untuk mengambil gambar tunggal Setelah mengurangi ukuran direktori hingga ratusan gambar per direktori, sistem yang dihasilkan masih akan secara umum mengeluarkan 3 operasi disk untuk mengambil gambar: satu untuk membaca metadata direktori ke dalam memori, yang kedua untuk memuat inode ke dalam memori, dan yang ketiga untuk membaca isi file. "
Saya berasumsi metadata direktori sistem file & inode akan selalu di-cache dalam RAM oleh OS dan membaca file biasanya hanya membutuhkan 1 disk IO.
Apakah ini "masalah multi-disk IO untuk membaca satu file" diuraikan dalam kertas yang unik untuk peralatan NAS, atau apakah Linux memiliki masalah yang sama juga?
Saya berencana untuk menjalankan server Linux untuk menyajikan gambar. Bagaimana saya dapat meminimalkan jumlah disk IO - idealnya memastikan OS cache semua direktori & data inode dalam RAM dan setiap file yang dibaca hanya akan memerlukan tidak lebih dari 1 disk IO?
sumber
mke2fs -b 32768
membuatnya menjadi 32k. Namun, ini hanya berguna jika Anda tidak memiliki file kecil di sistem file itu.Jawaban:
Linux memiliki "masalah" yang sama. Berikut ini makalah yang diterbitkan oleh mahasiswa saya dua tahun lalu, di mana efeknya ditampilkan di Linux. Beberapa IO dapat berasal dari beberapa sumber:
Dalam pola IO normal, caching sangat efektif dan inode, direktori, dan blok data dialokasikan dengan cara yang mengurangi pencarian. Namun, metode pencarian normal, yang sebenarnya dibagikan oleh semua sistem file, buruk untuk lalu lintas yang sangat acak.
Berikut ini beberapa ide:
1) Cache yang berhubungan dengan filesystem membantu. Tembolok besar akan menyerap sebagian besar bacaan. Namun, jika Anda ingin meletakkan beberapa disk di mesin, rasio Disk-to-RAM membatasi berapa banyak yang di-cache.
2) Jangan gunakan jutaan file kecil. Gabungkan mereka ke file yang lebih besar dan simpan nama file dan offset di dalam file.
3) Tempatkan atau cache metadata pada SSD.
4) Dan tentu saja menggunakan sistem file yang tidak memiliki format direktori on-disk yang sepenuhnya anarkis. Readdir tidak boleh lebih dari waktu linier, dan akses file langsung idealnya hanya waktu logaritmik.
Menjaga direktori tetap kecil (kurang dari 1000 atau lebih) tidak akan banyak membantu karena Anda perlu lebih banyak direktori yang perlu di-cache.
sumber
Ini tergantung pada sistem file yang Anda rencanakan untuk digunakan. Sebelum membaca sistem data file:
Jika folder berisi sejumlah besar file, ini adalah preassure besar pada cache.
sumber
open()
yang dilakukan olehread()
. Halaman win.tue.nl/~aeb/linux/vfs/trail.html memperlihatkan langkah-langkah bagus dari berbagai konsep Kernel yang terlibat. (Mungkin sudah ketinggalan zaman? Saya tidak akan tahu.)Anda mungkin tidak akan dapat menyimpan semua data direktori dan inode dalam RAM, karena Anda mungkin memiliki lebih banyak direktori dan data inode daripada RAM. Anda juga mungkin tidak mau, karena RAM itu mungkin lebih baik digunakan untuk keperluan lain; dalam contoh gambar Anda, tidakkah Anda lebih suka memiliki data gambar yang sering diakses di-cache dalam RAM daripada entri direktori untuk gambar yang jarang diakses?
Yang mengatakan, saya pikir tombol vfs_cache_pressure digunakan untuk mengontrol ini. "Ketika vfs_cache_pressure = 0, kernel tidak akan pernah mendapatkan kembali gigi palsu dan inode karena tekanan memori dan ini dapat dengan mudah menyebabkan kondisi kehabisan memori."
sumber