cgroup을 사용하여 사용자가 사용할 수 있는 메모리 양을 제한하려고 합니다(systemd와 함께 Ubuntu 16.04 사용).
user-.slice의 MemoryLimit 속성을 설정한 후 해당 cgroup에 반영된 변경 사항을 볼 수 있습니다 memory.limit_in_bytes
.
그러나 해당 사용자가 VirtualBox VM을 실행할 때 VirtualBox가 2GB RAM을 사용하는 것처럼 보이더라도( ps
아래 출력 참조) 해당 메모리는 cgroup memory.usage_in_bytes
파일에 반영되지 않습니다.
$ cat /sys/fs/cgroup/memory/user.slice/user-1001.slice/memory.usage_in_bytes
1353863168
cgroups 파일에서 VirtualBox 프로세스 ID를 볼 수 있습니다 tasks
.
$ ps un -p 19678
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
1001 19678 97.4 29.4 4660560 2378040 ? Sl 07:25 3:48 /usr/lib/virtualbox/VirtualBox
$ grep 19678 /sys/fs/cgroup/memory/user.slice/user-1001.slice/tasks
19678
memory.stat
cgroup 파일에는 다음 값이 표시됩니다.
$ cat /sys/fs/cgroup/memory/user.slice/user-1001.slice/memory.stat
cache 423411712
rss 880754688
rss_huge 331350016
mapped_file 176910336
dirty 307200
writeback 0
pgpgin 14357052
pgpgout 14129610
pgfault 14533957
pgmajfault 16595
inactive_anon 546553856
active_anon 447401984
inactive_file 151785472
active_file 158326784
unevictable 36864
hierarchical_memory_limit 5368709120
total_cache 423411712
total_rss 880754688
total_rss_huge 331350016
total_mapped_file 176910336
total_dirty 307200
~에 따르면메모리.txt, rss + cache
더 정확한 버전을 제공해야 합니다 memory.usage_in_bytes
. 결과는 1304166400 이하입니다.
그렇다면 VirtualBox의 메모리가 누락된 이유는 무엇입니까?
편집하다: 자세한 출력 및 memory.stat
문서가 추가되었습니다.
답변1
느낌이 있어이 파일많은 도움이 될 것입니다(특히 섹션 5.5 및 5.2). 여기에 요약해 보려고 합니다.
내가 얻은 가장 좋은 설명은 제공된 숫자가 memory.usage_in_bytes
매우 정확하지는 않지만 무언가가 사용하는 메모리 양에 대한 일반적인 아이디어를 제공하기 위한 것이라는 것입니다. memory.stat
다양한 프로세스에서 사용되는 메모리에 대해 더 정확한(더 복잡하긴 하지만) 아이디어를 제공할 수 있습니다. 메모리 사용량이 여기에 표시되지 않으면 더 큰 문제가 있을 수 있습니다.
편집하다:문서의 섹션 5.2를 계속 읽으면 몇 가지 추가 정보를 찾을 수 있습니다.
익명 및 스왑 캐시 메모리만 "rss" 통계의 일부로 나열됩니다. 이를 실제 "상주 세트 크기" 또는 cgroup에서 사용하는 물리적 메모리 양과 혼동해서는 안 됩니다. 'rss + file_mapped"는 cgroup의 상주 세트 크기를 제공합니다. (참고: 파일과 shmem은 다른 cgroup 간에 공유될 수 있습니다. 이 경우 메모리 cgroup이 페이지 캐시의 소유자인 경우에만 file_mapped를 고려하십시오.)
이 경우 현재 보고 있는 문제에 대한 해결책이 아직 없기 때문에 virtualbox 프로세스의 소유자가 virtualbox 프로세스에서 사용하는 모든 페이지 캐시의 소유자가 아니라고 믿게 됩니다.
제가 권장하는 마지막 온전성 검사는 OOM Killer 로그를 확인하고 OOM Killer가 활성화되어 있는지 확인하는 것입니다. OOM 킬러가 활성화되면 메모리 로그에서 이상한 결과를 얻을 수 있습니다.