Linux

為什麼有些記憶體不可刪除?

  • June 28, 2019

這是輸出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() 來加速其回收”。我沒有確切檢查這意味著什麼:-)。

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