Systemd

為什麼 machine.slice 在不包含任何程序時顯示為使用記憶體?

  • October 25, 2018
$ systemctl status machine.slice
● machine.slice - Virtual Machine and Container Slice
  Loaded: loaded (/usr/lib/systemd/system/machine.slice; static; vendor preset: disabled)
  Active: active since Wed 2018-06-13 08:45:07 BST; 1 day 15h ago
    Docs: man:systemd.special(7)
   Tasks: 0
  Memory: 717.0M
  CGroup: /machine.slice

$ cd /sys/fs/cgroup/memory/machine.slice
$ cat memory.usage_in_bytes 
751915008
$ cat tasks
$ cat cgroup.procs
$

cgroup 使用 717MB意味著什麼machine.slice,即使它沒有程序/執行緒?它是核心錯誤嗎?

我可以通過使用 virt-manager 啟動一個 VM,然後停止它來重現這一點。如果我重複這個循環,結果大致相同 - 即係統似乎沒有洩漏這數百兆字節。

軟體版本

$ uname -r
4.16.14-300.fc28.x86_64

$ rpm -q systemd libvirt-daemon
systemd-238-8.git0e0aa59.fc28.x86_64
libvirt-daemon-4.1.0-2.fc28.x86_64

這不是錯誤。顯然,cgroup 記憶體的計算包括程序使用的磁碟記憶體頁面。如果需要,您可以使用 請求丟棄屬於 cgroup 的記憶體頁面force_empty

您可能想知道多個 cgroup 使用的記憶體頁面。 cgroup-v2.rst(我正在使用的版本的後續版本)告訴我們:

一個記憶體區域被實例化它的 cgroup 負責,並一直由 cgroup 負責,直到該區域被釋放。將程序遷移到不同的 cgroup 不會將它在前一個 cgroup 中實例化的記憶體使用量移動到新的 cgroup。

屬於不同 cgroup 的程序可以使用記憶體區域。該區域將向哪個 cgroup 收費是不確定的;然而,隨著時間的推移,記憶體區域很可能最終會出現在一個有足夠記憶體餘量以避免高回收壓力的 cgroup 中。

cgroup-v1/memory.txt還說“頁面僅連結到 per-memcg LRU”,因此它可能也類似於上述描述。這份文件更難依賴,因為它以“無可救藥地過時並且要求完全重寫”的免責聲明開頭。

force_empty要求立即刪除所有這些頁面。如果有另一個 cgroup 也想使用它們,則必須再次從磁碟讀取它們。

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