Linux-Kernel

為什麼 sync + drop_caches 不刪除記憶體?

  • January 28, 2018

我有一個測試案例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 中的磁碟記憶體,可能會增長到數 GB。

libvirt / KVM 將此稱為“寫回”記憶體。

我還注意到這加快了重新啟動 VM 的速度。

引用自:https://unix.stackexchange.com/questions/420299