journalctl
のテストケースがあります ディスクからの読み取りに数秒かかります。しかし、テストケースの複数の実行をベンチマークしようとすると、最初の実行後は信じられないほど高速であることがわかります。キャッシュを削除しようとしても。なぜですか?
$ 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
興味深いことに、time
それでも、ページフォールト(inputs
)を介して多くのIOを実行していることを示しています )。 drop_caches
をスキップすると気づきます 実行の合間には、代わりに0が表示されます。
承認された回答:
drop_caches
カーネルファイルシステムキャッシュにのみ影響します。基盤となるハードウェアのキャッシュには影響しません。どうやらあなたのハードウェアには数百メガバイトのキャッシュ(94992 * 4096〜=400MB)があります。素晴らしい!
私の場合、カーネルがVMで実行されているためです。したがって、「基盤となるハードウェア」は単純なハードディスクではありません。これは、virt-manager
によって使用されるディスク設定を示しています 。
「キャッシュモード」に使用されるオプションは、書き込みフラッシュを尊重します(fsync()
を使用 )。ただし、それ以外の場合は、書き込みと読み取りの両方をホストカーネルのページキャッシュにキャッシュできます。 「基盤となるハードウェア」には、ホストのRAM内にディスクキャッシュが効果的に含まれており、数ギガバイトにまで拡大する可能性があります。
libvirt / KVMは、これを「ライトバック」キャッシングと呼びます。
また、これによりVMの再起動が高速化されることにも気づきました。