Linux: berapa banyak disk I / O yang diperlukan untuk membaca file? Bagaimana cara menguranginya? [duplikat]

10

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?

user9517
sumber
1
Bukan jawaban untuk pertanyaan, tetapi Anda selalu dapat menggunakan Varnish (Facebook menggunakannya) yang menjaga file dalam memori. Dengan cara ini jika satu gambar menjadi panas (banyak permintaan ke file yang sama), disk IO tidak akan digunakan sama sekali untuk menyajikannya
Darhazer - Varnish tidak akan membantu di sini karena cache file Linux (yang diandalkan Varnish) sudah menyimpan cache file panas di memori. Menempatkan Varnish di depan Nginx untuk melayani file statis tidak benar-benar menambahkan apa pun. Pertanyaan saya adalah kapan file terlalu besar / terlalu banyak untuk di-cache dalam memori. Saya masih ingin memastikan setidaknya data direktori & inode di-cache untuk mengurangi IO disk menjadi hanya 1 per baca.
Banyak filesystem menyimpan inode di dalam direktori, mengurangi jumlah permintaan per satu, dan secara signifikan meningkatkan peluang hit cache. Tapi ini bukan pertanyaan pemrograman.
Ben Voigt
Anda dapat mengubah ukuran blok sistem file saat membuatnya, misalnya dengan mke2fs -b 32768membuatnya menjadi 32k. Namun, ini hanya berguna jika Anda tidak memiliki file kecil di sistem file itu.

Jawaban:

5

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:

  • Pencarian direktori pada setiap tingkat direktori jalur file. Mungkin perlu membaca inode direktori dan satu atau lebih blok entri direktori
  • Inode file

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.

tuan
sumber
Dan tentu saja menggunakan sistem file yang tidak memiliki format direktori on-disk yang benar-benar kuno. Readdir tidak boleh lebih dari waktu linier, dan akses file langsung idealnya hanya waktu logaritmik.
jørgensen
Saya menambahkannya pada jawaban sebagai poin ke-4
tuan
@ tuan Hal-hal baik. +1
Magellan
@dister tautan Anda sudah mati.
Don Scott
1

Ini tergantung pada sistem file yang Anda rencanakan untuk digunakan. Sebelum membaca sistem data file:

  • Baca file direktori.
  • Baca inode dari file Anda
  • Baca sektor file Anda

Jika folder berisi sejumlah besar file, ini adalah preassure besar pada cache.


sumber
Jika Anda mendaftar akses I / O, mungkin lebih menarik untuk memisahkan yang dilakukan oleh open()yang dilakukan oleh read(). 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.)
adl
0

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

Samuel Edwin Ward
sumber