プロセスがないのにmachine.sliceがメモリを使用しているように見えるのはなぜですか?

プロセスがないのにmachine.sliceがメモリを使用しているように見えるのはなぜですか?
$ 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
$

machine.slicecgroupにプロセス/スレッドがないにもかかわらず、717MBが使用されるということはどういう意味ですか?これはカーネルのバグですか?

virt-managerを使用して仮想マシンを起動して停止すると、それを再現できます。このループを繰り返すと、結果はほぼ同じです。つまり、システムから数百メガバイトが漏れないようです。

ソフトウェアバージョン

$ 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

ベストアンサー1

これは間違いではありません。明らかに、cgroupメモリ統計には、プロセスで使用されるディスクキャッシュページが含まれます。必要に応じて、要求を使用してcgroupに属するキャッシュされたページを削除できますforce_empty

複数のcgroupで使用されているキャッシュされたページを知りたい場合があります。 cgroup-v2.rst(私が使用するバージョンの後続バージョン)は、次のように言います。

メモリ領域は、それをインスタンス化したcgroupによって占有され、その領域が解放されるまでcgroupによって占有されたままになります。プロセスを別のcgroupに移行しても、以前のcgroupからインスタンス化されても、メモリ使用量は新しいcgroupに移動されません。

メモリ領域は、他のcgroupに属するプロセスで使用できます。この領域がどのcgroupに含まれるかは定義されていません。ただし、時間が経つにつれて、メモリ領域は、高い回収圧力を回避するのに十分なメモリ空間を持つcgroupに含まれる可能性が高くなります。

cgroup-v1/memory.txtまた、「ページはmemcgごとにLRUに具体的にリンクされています」と表示されるため、上記の説明と同様に機能できます。この文書は「古いものであり、完全な書き換えが必要である」という免責事項から始まるので、信頼することはより困難です。

つまり、force_emptyこれらすべてのページをすぐに削除するように求めることです。他のcgroupがそれを使用するには、ディスクから再度読み取る必要があります。

おすすめ記事