Mám testovací případ pro journalctl
kde stráví několik sekund čtením z disku. Ale když se pokusím srovnat několik běhů testovacího případu, zjistím, že je to po prvním spuštění neuvěřitelně rychlé. I když se pokusím zahodit kešky. Proč?
$ 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
Zajímavé je time
stále ukazuje, že dělá spoustu IO přes chyby stránky (inputs
). Všiml jsem si, že když přeskočím drop_caches
mezi běhy místo toho ukazuje 0.
Přijatá odpověď:
drop_caches
ovlivňuje pouze mezipaměť souborového systému jádra. Nemá vliv na mezipaměti v základním hardwaru. Váš hardware má zřejmě stovky megabajtů mezipaměti (94992 * 4096 ~=400 MB). Skvělé!
V mém případě je to proto, že jádro běží na virtuálním počítači. Takže „základní hardware“ není jednoduchý pevný disk. Toto ilustruje nastavení disku používaná virt-manager
.
Možnost použitá pro „režim mezipaměti“ respektuje vyprázdnění zápisu (pomocí fsync()
), ale jinak umožňuje ukládání do mezipaměti zápisů i čtení v mezipaměti stránek hostitelského jádra. „Základní hardware“ efektivně zahrnuje diskovou mezipaměť v paměti RAM hostitele, která se potenciálně rozroste na několik gigabajtů.
libvirt / KVM nazývá toto ukládání do mezipaměti „zpětného zápisu“.
Také jsem si všiml, že to urychluje restart VM.