為什麼有些記憶體不可刪除?
這是輸出
free -m
:total used free shared buff/cache available Mem: 421 158 153 39 109 195 Swap: 0 0 0
我執行
echo 3 > /proc/sys/vm/drop_caches
刪除所有可能的記憶體,但buff/cache
值仍保持在 109MB。是什麼保存了這些記憶體?我可以以某種方式丟棄它們嗎?使用的系統是 XUbuntu 16.04。
其中一些記憶體(43mb)可能被 tmpfs 使用:
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=43188k,mode=700,uid=1000,gid=1000)
這留下了更多的空間來解釋。
輸出
df -mt tmpfs
:Filesystem 1M-blocks Used Available Use% Mounted on tmpfs 43 3 40 7% /run tmpfs 211 1 211 1% /dev/shm tmpfs 5 1 5 1% /run/lock tmpfs 211 0 211 0% /sys/fs/cgroup tmpfs 43 1 43 1% /run/user/1000
如果您填充它,tmpfs 只會使用 43MB。它不會提前保留記憶體。然而:
信不信由你,39M“共享”的數字不能掉,都算作“buff/cache”。它包括您所有的 tmpfs 文件。它還包括從秘密核心 tmpfs 分配的“共享”記憶體 :-)。這包括“系統 V 共享記憶體”,以及某些類型的圖形緩衝區。
無論如何,這兩個錯誤大致抵消了。那麼剩下的記憶體呢?
在 Linux 中刪除記憶體時,它會選擇不刪除目前正在執行的程序映射的任何記憶體。 許多這些映射將是程序/庫程式碼文件。
一些數據文件也可能被映射。例如,當您執行
journalctl
以瀏覽日誌時,它使用(而不是)systemd
訪問日誌文件。mmap()``read()
您可以檢查剩餘的記憶體是什麼
sudo smem -t -m
。我預計他們將主要是目前正在執行的程序,以及他們使用的庫。證明
如果您想驗證這一點,這裡是核心程式碼的連結:
drop_caches通過為每個記憶體的“inode”(文件)呼叫 invalidate_mapping_pages() 來工作。
invalidate_mapping_pages() - 使一個 inode 的所有未鎖定頁面無效
$$ … $$ invalidate_mapping_pages() 不會阻塞 IO 活動。它不會使臟頁、鎖定頁、寫回頁或映射到頁表中的頁無效。
如果您有任何“臟”頁面 - 記憶體寫入 - 或正在進行的寫入,這些也不會被刪除或等待。Documentation/sysctl/vm.txt中也提到了這一點。
在臟/寫回頁面的情況下, invalidate_mapping_pages() "
$$ tries $$通過呼叫 deactivate_file_page() 來加速其回收”。我沒有確切檢查這意味著什麼:-)。