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 .
kutipan
Cong> Ini adalah draft patch implementasi drop cache per file.
Menarik. Jadi bisakah saya melakukan ini dari luar proses? Saya seorang SysAdmin, jadi POV saya mulai memperhatikan, menemukan, dan memperbaiki masalah kinerja ketika sistem berada di bawah tekanan.
Cong> It introduces a new fcntl command F_DROP_CACHES to drop
Cong> file caches of a specific file. The reason is that currently
Cong> we only have a system-wide drop caches interface, it could
Cong> cause system-wide performance down if we drop all page caches
Cong> when we actually want to drop the caches of some huge file.
Bagaimana saya bisa tahu berapa banyak cache yang digunakan oleh file? Dan apa dampak kinerja ini ketika dijalankan pada sistem yang sibuk? Dan apa patch ini membeli kita karena saya pikir VM seharusnya sudah menjatuhkan cache setelah sistem datang di bawah tekanan ...
Cong> Di bawah ini adalah test case kecil untuk patch ini:
Utas termasuk testcase dan tambalan aktual ke beberapa file dalam kernel Linux yang menambahkan fungsi tambahan untuk fs/drop_caches.c
dipanggil drop_pagecache_file(struct file *filp)
. Fungsi ini kemudian dapat diakses melalui alat frontend, fnctl.c
melalui perintah F_DROP_CACHES
. Kasing ini memanggil fungsi ini:
file_drop_caches(filp, arg);
Yang menangani menjatuhkan semua cache yang terkait dengan file yang diberikan. Dari file include/linux/mm.h
:
void file_drop_caches(struct file *filp, unsigned long which);
Jadi ini bisa digunakan?
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 dd
.
Berikut ini kutipan dari email itu
Ini adalah fungsi yang berguna. Padahal bukankah sudah disediakan
POSIX_FADV_DONTNEED
? Fungsionalitas ini ditambahkan ke GNU dd (8.11) setahun yang lalu .
Berikut adalah contoh dari tambalan itu:
Anjurkan untuk menjatuhkan cache untuk seluruh file
$ dd if=ifile iflag=nocache count=0
Pastikan drop cache untuk seluruh file
$ dd of=ofile oflag=nocache conv=notrunc,fdatasync count=0
Jatuhkan cache untuk sebagian file
$ dd if=ifile iflag=nocache skip=10 count=10 of=/dev/null
Alirkan data hanya dengan menggunakan cache baca-depan
$ dd if=ifile of=ofile iflag=nocache oflag=nocache
Mengujinya
Saya tidak 100% positif bagaimana menguji ini tetapi saya datang dengan pendekatan berikut.
buat file 100MB
$ dd if=/dev/urandom of=sample.txt bs=100M count=1
melacak akses file menggunakan fatrace
$ sudo fatrace | grep sample.txt
Jalankan top
sehingga kita dapat memantau penggunaan memori, jumlah catatan gratis.
$ top
buka file, catat jumlah memori bebas sekarang. Perhatikan fatrace
file tersebut sample.txt
.
$ cat sample.txt > /dev/null
jatuhkan file dari memori, catat jumlah memori bebas sekarang. Perhatikan output dari fatrace
.
$ sudo dd of=/home/saml/tst/162600/sample.txt \
oflag=nocache conv=notrunc,fdatasync count=0
Contoh
Di terminal # 1:
$ dd if=/dev/urandom of=sample.txt bs=100M count=1
1+0 records in
1+0 records out
104857600 bytes (105 MB) copied, 7.37996 s, 14.2 MB/s
$ ls -l sample.txt
-rw-rw-r--. 1 saml saml 104857600 Oct 17 22:54 sample.txt
Di terminal # 2:
$ top
...
KiB Mem: 7968336 total, 6900956 used, 1067380 free, 267080 buffers
...
Di terminal # 3:
$ sudo fatrace | grep sample.txt
Sekarang buka file sample.txt
,, dan perhatikan jumlah RAM. Di terminal # 1.
$ cat sample.txt > /dev/null
Di terminal # 2:
KiB Mem: 7968336 total, 7011896 used, 956440 free, 267336 buffers
Perhatikan output fatrace
di terminal # 3:
cat(25940): R /home/saml/tst/162600/sample.txt
cat(25940): R /home/saml/tst/162600/sample.txt
cat(25940): RC /home/saml/tst/162600/sample.txt
Sekarang hapus file dari RAM, di terminal # 4:
$ sudo dd of=/home/saml/tst/162600/sample.txt \
oflag=nocache conv=notrunc,fdatasync count=0
Perhatikan output fatrace
di terminal # 2:
dd(26229): O /home/saml/tst/162600/sample.txt
dd(26229): CW /home/saml/tst/162600/sample.txt
Perhatikan RAM di terminal # 3:
KiB Mem: 7968336 total, 6908364 used, 1059972 free, 267364 buffers
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 [pyadvise][4]
yang menyediakan antarmuka yang jauh lebih sederhana daripada dd
metode di atas . Script ini menggunakan posix_fadvise(2)
antarmuka yang sama .
Contoh
$ sudo pyadvise --help
Usage:
pyadvise [options] [FILE]..
Options:
-h, --help show this help message and exit
-w, --willneed The specified files will be accessed in the near future
-s, --sequential The application expects to access the specified files
sequentially (with lower offsets read before higher ones)
-d, --dontneed The specified files will not be accessed in the near
future
-r, --random The specified files will be accessed in random order
-o, --noreuse The specified files will be accessed only once. Under
Linux, this operation is a no-op; see contrib/copyfileobj-
fadvise.py in the python-fadvise source tree for an
example on how to achieve approximately the same effect
-n, --normal Indicates that the application has no advice to give about
its access pattern for the specified files. If no advice
is given for an open file, this is the default assumption
-v, --verbose Explain what is being done
Dan jika kita mengulangi tes di atas dan digunakan pyadvise
sebagai pengganti dd
:
$ pyadvise -d /home/saml/tst/162600/sample.txt
Saya perhatikan penurunan identik dalam RAM yang dikonsumsi seperti sebelumnya ketika saya gunakan dd
.