Bagaimana cara mengkonfigurasi Linux ke cache file metadata dalam preferensi ke konten?

14

Saya ingin mengatur sistem agar menggunakan sebagian besar RAM untuk caching metadata sistem file, tetapi hanya jumlah yang cukup kecil untuk membaca / menulis caching dan membuat prefetch file. Idealnya saya ingin dapat menelusuri sistem file (sebanyak yang sesuai dengan RAM) tanpa memutar disk sampai saya benar-benar membuka file.

Berikut detailnya:

Saya memiliki server file buatan sendiri. Ada lima disk dalam volume LVM sekitar 9TB, tetapi hanya 4GB RAM. Karena server tidak melakukan banyak hal selain melayani file, sebagian besar RAM digunakan untuk caching. ("Gratis" melaporkan 3,4G dari 3,9G yang digunakan untuk cache.)

Server tinggal di kamar saya, dan jika semua disk berputar itu membuat suara yang cukup mengganggu ketika itu tenang. (Maksud saya bukan mencari noise, hanya noise yang berputar. Disk-disk tersebut terdiri dari berbagai merek dan model, dan saya pikir sedikit perbedaan dalam kecepatan rotasi menyebabkan gangguan. Tidak ada disk yang berisik sendiri, tetapi jika beberapa dari mereka berputar bersama, ada sedikit kebisingan dengan periode sub-Hertz.) Jadi saya mengkonfigurasi server untuk menurunkan disk sebagian besar waktu.

Tentu saja, jika disk diputar ketika saya membuka folder di manajer file saya, ada penundaan sementara mana dari disk yang memiliki folder itu berputar. Hanya saja, itu bukan masalah besar. Tetapi tergantung di mana saya melihat, itu bisa terjadi beberapa kali berturut-turut, jika LVM kebetulan menyebarkan metadata untuk setiap subfolder pada disk yang berbeda.

Saya menduga bahwa sebagian besar Linux mengisi cache-nya dengan konten file, dan mungkin mengambil data sebelumnya. Tembolok tidak terlalu berguna di luar beberapa MB untuk memastikan pemutaran lancar; jika saya hanya menonton film, saya mungkin tidak akan melihatnya lagi dalam waktu dekat. Prefetching, jika itu terjadi, juga sama sekali tidak berguna dalam kasus saya , setelah lebih dari beberapa MB.

Tetapi orang akan berpikir bahwa 4GB harus banyak untuk dapat me-cache sebagian besar metadata sistem file, setidaknya bagian-bagian yang sudah dikunjungi, sehingga saya dapat menelusuri file tanpa perlu memutar disk jika ternyata mereka sedang tidur.

Masih akan ada penundaan saat membuka file, tapi tidak apa-apa. Bandingkan “klik; tunggu ; klik; tunggu ; klik; tunggu ; bermain; tonton ”dengan“ klik; klik; klik; bermain; tunggu ; menonton". Yang pertama sangat membuat frustrasi; yang terakhir hampir diharapkan.

Catatan:

  1. Jika itu penting, kernelnya adalah 3.2, OS adalah Debian, volumenya adalah lvm2, dan FS adalah ext4.

  2. Satu-satunya alasan spin-down adalah kebisingan di malam hari; server jika tidak berjalan terus menerus. (Saya membuatnya sebagai daya rendah sebagai masuk akal.) Penundaan spin-down bervariasi tergantung pada waktu hari.

  3. Hard disk hanya untuk media. OS berada pada flash drive terpisah (kecil). (Yang berarti keterlambatan spin-up datang dari data, bukan hanya karena diperlukan sesuatu /usratau apa pun. Saya dapat menyimpan beberapa GB di dalamnya jika itu akan membantu masalah saya entah bagaimana.

  4. Dampak yang wajar pada kinerja bukanlah masalah besar. Disknya lebih cepat dari jaringan saya.

bogdanb
sumber

Jawaban:

10

Untuk mengontrol bagaimana Linux melakukan cache, lihat https://www.kernel.org/doc/Documentation/sysctl/vm.txt ini

Khususnya pada vfs_cache_pressure, Anda mungkin ingin nilai yang sangat rendah atau bahkan nol (1 terdengar agak lebih aman bagi saya):

vfs_cache_pressure
------------------

Controls the tendency of the kernel to reclaim the memory which is used for
caching of directory and inode objects.

At the default value of vfs_cache_pressure=100 the kernel will attempt to
reclaim dentries and inodes at a "fair" rate with respect to pagecache and
swapcache reclaim.  Decreasing vfs_cache_pressure causes the kernel to prefer
to retain dentry and inode caches. When vfs_cache_pressure=0, the kernel will
never reclaim dentries and inodes due to memory pressure and this can easily
lead to out-of-memory conditions. Increasing vfs_cache_pressure beyond 100
causes the kernel to prefer to reclaim dentries and inodes.

Anda juga mungkin ingin memodifikasi swappinesssehingga Anda tidak pernah menukar data atau membuatnya sehingga hanya terjadi dalam kasus yang ekstrim.

The drop_cachespilihan mungkin berguna untuk secara eksplisit menjatuhkan data Anda tidak ingin cache lagi.

Saya yakin mungkin ada opsi lain yang dapat membantu, jadi tinjau dokumentasi kernel.

Untuk menerapkannya, saya akan meletakkan pengaturan yang ingin Anda ubah /etc/sysctl.confatau apa pun OS Anda untuk mengembalikannya saat boot.

Kyle
sumber
3
Pos yang bagus, tetapi Anda ingin bertukar sebanyak mungkin dengan mengingat sasaran OP. Swapping hanya mengenai memori pengguna sehingga meningkatkan kecenderungan untuk beralih ke disk kemudian meninggalkan lebih banyak memori fisik untuk diambil oleh cache. Meningkatkan swappiness membebaskan memori tetapi dapat memperlambat aplikasi jika itu meningkat terlalu jauh (menentukan sweet spot pada dasarnya adalah
guesteration
Hai Kyle, terima kasih atas idenya. vfs_cache_pressure semacam bekerja, tapi itu tidak cukup. Inilah yang saya lakukan:
bogdanb
Ketika saya mengatur vcp ke 0, jika saya melakukan find / -ls > /dev/null, kemudian putar disk, lalu findsemua file lagi, disk tidak berputar. freemenunjukkan buffer naik hingga sekitar 202MB saat melakukan ini. Tapi, jika saya melakukan find, kemudian cat /file/bigger/than/ram > /dev/null, kemudian freemenunjukkan cachednaik untuk mengisi ruang kosong, dan untuk beberapa alasan buffersturun menjadi sekitar 195MB. Kemudian jika saya memutar disc dan melakukan findlagi disk masih berputar :-(
bogdanb
Tentang swappiness: Diatur ke default 60, tetapi mesin tidak memiliki partisi swap, jadi saya tidak yakin apakah itu banyak. Saya kira saya bisa meletakkan file swap di flash drive, tapi saya tidak tahu bagaimana ini akan membantu, atau bagaimana cara mengukurnya.
bogdanb
1
Linux berusaha menjadi pintar tentang caching. Saya tidak yakin bahwa pengaturan vfs = 0 akan bekerja seperti yang Anda harapkan. Saya pikir itu akan mencoba untuk mendapatkan kembali entri-entri lain ketika tekanan dari aplikasi (yaitu malloc ()) meminta lebih banyak memori. Adapun cara untuk memberitahu linux untuk tidak menggunakan lebih dari 2GB untuk cache, saya tidak mengetahui hal itu. Ini akan membuang-buang RAM dalam banyak kasus. Satu hal lain yang mungkin ingin Anda lihat adalah "mode laptop" yang mencoba melakukan hal-hal secara berbeda untuk menjaga disk berputar untuk laptop. Saya belum menggunakannya, jadi saya tidak tahu banyak tentang itu.
Kyle