프로세스가 없는데 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이 이를 사용하려면 디스크에서 다시 읽어야 합니다.

관련 정보