Linux-Kernel為什麼
為什麼 sync + drop_caches
不刪除記憶體?
我有一個測試案例
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 的速度。