Saya memiliki kasus uji untuk journalctl
di mana ia menghabiskan beberapa detik membaca dari disk. Tetapi jika saya mencoba untuk membandingkan beberapa percobaan dari kasus uji, saya menemukan bahwa itu tidak mungkin cepat setelah percobaan pertama. Bahkan jika saya mencoba untuk menjatuhkan cache. Mengapa?
$ sync && echo 1 | sudo tee /proc/sys/vm/drop_caches && /usr/bin/time journalctl -b -u dev-shm.mount
1
0.01user 0.03system 0:04.50elapsed 1%CPU (0avgtext+0avgdata 30956maxresident)k
95424inputs+0outputs (424major+665minor)pagefaults 0swaps
$ sync && echo 1 | sudo tee /proc/sys/vm/drop_caches && /usr/bin/time journalctl -b -u dev-shm.mount >/dev/null
1
0.00user 0.01system 0:00.08elapsed 26%CPU (0avgtext+0avgdata 31832maxresident)k
94992inputs+0outputs (422major+445minor)pagefaults 0swaps
Menariknya time
masih menunjukkannya melakukan banyak IO melalui kesalahan halaman (inputs
). Saya perhatikan bahwa jika saya melewatkan drop_caches
antara berjalan, itu menunjukkan 0 sebagai gantinya.
Jawaban yang Diterima:
drop_caches
hanya mempengaruhi cache sistem file kernel. Itu tidak memengaruhi cache di perangkat keras yang mendasarinya. Rupanya perangkat keras Anda memiliki ratusan megabyte cache (94992 * 4096 ~=400MB). Luar biasa!
Dalam kasus saya, itu karena kernel berjalan di VM. Jadi "perangkat keras yang mendasarinya" bukanlah hard disk sederhana. Ini menggambarkan pengaturan disk yang digunakan oleh virt-manager
.
Opsi yang digunakan untuk "mode caching" mengacu pada penulisan flush (menggunakan fsync()
), tetapi sebaliknya memungkinkan caching menulis dan membaca di cache halaman kernel host. “Perangkat keras yang mendasarinya” secara efektif mencakup cache disk di dalam RAM host, yang berpotensi tumbuh hingga beberapa gigabyte.
libvirt / KVM menyebut ini sebagai cache "writeback".
Saya juga memperhatikan bahwa ini mempercepat boot ulang VM.