Saya tahu saya bisa menghapus semuanya dari cache sistem file Linux , tetapi apakah ada cara untuk menjatuhkan hanya satu file tertentu? Atau mencegah file di-cache? Atau katakan proses untuk tidak men-cache file yang ditulisnya?
Saya memiliki proses yang membaca banyak file kecil dan menulis file besar. Saya ingin menyimpan file-file kecil dalam cache untuk menghindari mencari disk, dan saya tidak peduli tentang caching file besar.
linux
files
filesystems
cache
Jay Hacker
sumber
sumber
Jawaban:
Metode Potensial # 1 - F_DROP_CACHES
Saya menemukan metode dari 2012 yang membahas tambalan yang diusulkan ke kernel Linux di utas surat ini berjudul: Re: [Patch RFC] fs: menerapkan cache penurunan per file .
kutipanUtas termasuk testcase dan tambalan aktual ke beberapa file dalam kernel Linux yang menambahkan fungsi tambahan untuk
fs/drop_caches.c
dipanggildrop_pagecache_file(struct file *filp)
. Fungsi ini kemudian dapat diakses melalui alat frontend,fnctl.c
melalui perintahF_DROP_CACHES
. Kasing ini memanggil fungsi ini:Yang menangani menjatuhkan semua cache yang terkait dengan file yang diberikan. Dari file
Jadi ini bisa digunakan?include/linux/mm.h
:Saya tidak menemukan bukti bahwa tambalan ini pernah masuk ke repositori kode kernel Linux utama, sehingga opsi ini tampaknya tersedia, hanya jika Anda bersedia mengkompilasi ulang kernel Linux sendiri.
Metode Potensial # 2 - Menggunakan dd
Di utas yang sama, pengguna lain menyebutkan metodologi yang sama sekali berbeda yang memanfaatkan
Berikut ini kutipan dari email itu Mengujinyadd
.Saya tidak 100% positif bagaimana menguji ini tetapi saya datang dengan pendekatan berikut.
buat file 100MB
melacak akses file menggunakan
fatrace
Jalankan
top
sehingga kita dapat memantau penggunaan memori, jumlah catatan gratis.buka file, catat jumlah memori bebas sekarang. Perhatikan
fatrace
file tersebutsample.txt
.jatuhkan file dari memori, catat jumlah memori bebas sekarang. Perhatikan output dari
fatrace
.Contoh
Di terminal # 1: Di terminal # 2: Di terminal # 3: Sekarang buka filesample.txt
,, dan perhatikan jumlah RAM. Di terminal # 1. Di terminal # 2: Perhatikan outputfatrace
di terminal # 3: Sekarang hapus file dari RAM, di terminal # 4: Perhatikan outputfatrace
di terminal # 2: Perhatikan RAM di terminal # 3:Jadi sepertinya semua yang dikonsumsi oleh file dalam RAM dibebaskan.
Metode Potensial # 3 - python-fadvise
Berkat komentar oleh @frostchutz, ada alat lain, skrip Python, bernama
Contoh[pyadvise][4]
yang menyediakan antarmuka yang jauh lebih sederhana daripadadd
metode di atas . Script ini menggunakanposix_fadvise(2)
antarmuka yang sama .Dan jika kita mengulangi tes di atas dan digunakan
pyadvise
sebagai penggantidd
:Saya perhatikan penurunan identik dalam RAM yang dikonsumsi seperti sebelumnya ketika saya gunakan
dd
.sumber
dd
bekerja untukku. Saya berakhir dengan chris-lamb.co.uk/projects/python-fadvise sendiri yang merupakan hal yang sama dalam perintah yang lebih jelas.python-fadvise
jauh lebih mudah, saya telah menambahkan contoh yang menunjukkandd
.os.posix_fadvise()
dalam libray standar Python sekarang.Memperluas jawaban geekosaur, Anda dapat memaksakan penggunaan
O_DIRECT
dengan menggunakan LD_PRELOAD dan programnya di sini: http://arighi.blogspot.com/2007/04/how-to-bypass-buffer-cache-in-linux.htmlKode itu memaksa
O_DIRECT
semua file. Namun, cukup menambahkan beberapa logika strncmp di__do_wrap_open
Anda dapat menerapkan O_DIRECT secara selektif.Penafian: Saya belum menguji ini.
sumber
Anda dapat membuka file individual dengan
O_DIRECT
flag (lihatman 2 open
) - baca bagian CATATAN dari halaman manual itu dengan hati-hati, dan pertimbangkan apakah Anda juga menginginkan / membutuhkanO_SYNC
.sumber
cat
, dan saya lebih suka tidak menulis ulang. :) Saya berharap untuk alat baris perintah atau/proc/sys
tombol.open
bendera; Anda memang perlu menulis sebuah program untuk melakukannya. (cat -u
hanya menonaktifkanstdio
buffering, bukan buffering OS.)Jika Anda ingin memaksa file untuk selalu menggunakan O_SYNC, Anda dapat menandainya sebagai atribut tambahan dengan
chattr +S $file
:man chattr:
O_SYNC memaksa data + metadata untuk ditulis ke buffer disk, tetapi masih melewati cache halaman. O_DIRECT mem-bypass cache halaman.
Namun ketahuilah bahwa membukanya dengan O_DIRECT akan merusak kinerja, jika file besar itu hanya ditambahkan, perbedaannya mungkin kecil. Tetapi jika file besar itu telah ditulis ulang di tempat-tempat acak O_DIRECT akan menjadi hit besar pada kinerja, bahkan dengan mempertimbangkan bahwa itu dalam cache mungkin dapat mengusir dari cache beberapa file kecil yang dibaca.
Jika Anda memiliki ram untuk menyimpan semua file kecil di sana, Anda bisa mendekati masalahnya dengan cara lain. Pastikan file kecil selalu di ram, maka saya sarankan untuk menyalinnya ke tmpfs :
sumber
chattr +S
bukan hal yang sama denganO_DIRECT
, itu adalah hal yang sama denganO_SYNC
.O_DIRECT
menyebabkan membaca tidak akan di-cache (yang adalah tentang pertanyaan ini), dan menulis untuk tidak di-buffer, tanpa jaminan.O_SYNC
hanya menyebabkan menulis tidak buffered.O_DIRECT
keO_SYNC
akan membuat jawaban Anda konsisten secara internal, tetapi masih salah mempertimbangkan pertanyaan itu.