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