서비스가 너무 많은 메모리를 사용하고 있는지 확인하기 위해 모니터링을 설정하려고 합니다. 메모리 사용량은 다음 두 곳에서 읽을 수 있습니다.
- pid
/proc/<pid>/status
이거나 /sys/fs/cgroup/<group-id>/memory.stat
통제 그룹의 경우에는 실행되었습니다.
서비스는 systemd에 의해 시작되므로 자체 제어 그룹이 있고 때로는 통계에 포함해야 하는 하위 프로세스를 시작하고 경로가 재부팅 후에도 지속되므로 제어 그룹 통계가 더 적합합니다.
안타깝게도 숫자가 일치하지 않는 것 같습니다. 서브 프로세스 없이 실행할 때의 값의 예는 다음과 같습니다(명령어는 서비스 이름을 제외하고는 실행한 것과 완전히 동일하며, 비메모리 관련 항목을 제거한 것을 제외하면 결과는 얻은 것과 완전히 동일함) 항목):
# cat /sys/fs/cgroup/system.slice/some.service/memory.stat /proc/$(cat /sys/fs/cgroup/system.slice/some.service/cgroup.procs)/status
anon 5873664
file 2408448
kernel_stack 491520
slab 962560
sock 0
shmem 61440
file_mapped 405504
file_dirty 0
file_writeback 0
inactive_anon 0
active_anon 5853184
inactive_file 1916928
active_file 360448
unevictable 0
slab_reclaimable 270336
slab_unreclaimable 692224
pgfault 60258
pgmajfault 99
pgrefill 0
pgscan 0
pgsteal 0
pgactivate 0
pgdeactivate 0
pglazyfree 0
pglazyfreed 0
workingset_refault 0
workingset_activate 0
workingset_nodereclaim 0
…
VmPeak: 494812 kB
VmSize: 494164 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 25836 kB
VmRSS: 25484 kB
RssAnon: 5468 kB
RssFile: 20016 kB
RssShmem: 0 kB
VmData: 464776 kB
VmStk: 132 kB
VmExe: 180 kB
VmLib: 23940 kB
VmPTE: 156 kB
VmSwap: 0 kB
voluntary_ctxt_switches: 9
nonvoluntary_ctxt_switches: 620
적절한 값은 프로세스 통계 VmRSS
(= RssAnon
+ RssFile
+)에서 나온 것이라고 생각합니다. 그런데 팀은 프로세스 에 속해야 하고, 팀은 프로세스에 속해야 한다고 RssShmem
생각하는데 둘이 일치하지 않아요. 5736KB이지만 파일 의 경우 차이는 5468KB에 불과해 2352KB에 불과하지만 20016KB로 거의 10배 차이가 납니다.anon
RssAnon
file
RssFile
anon
RssAnon
file
RssFile
+++ 와 대략 일치하는 memory.current
값을 가진 파일 도 있지만 프로세스 상태에 일치하는 값이 표시 되지 않습니다 .anon
file
kernel_stack
slab
sock
shmem
그렇다면 이러한 숫자가 왜 그렇게 다른가요? 그리고 응용 프로그램이 시스템에 가하는 메모리 압력이 얼마나 되는지를 더 잘 나타내는 숫자는 무엇입니까?
참고: 커널 4.19.72에서 cgroup2(약간 오래된 내장 BSP)를 사용합니다.
답변1
~에서통제 그룹 v2가이드:
메모리 영역은 이를 인스턴스화한 cgroup에 할당됩니다.지역이 해제될 때까지 cgroup에 대한 책임은 유지됩니다. 프로세스를 다른 cgroup으로 마이그레이션해도 이전 cgroup에서 인스턴스화될 때 메모리 사용량이 새 cgroup으로 이동되지 않습니다.
메모리 영역은 다른 cgroup에 속한 프로세스에서 사용할 수 있습니다. 이 영역이 어떤 cgroup에 포함될지는 정의되지 않았습니다.;그러나 시간이 지남에 따라 메모리 영역은 높은 회수 압력을 피하기에 충분한 메모리 공간이 있는 cgroup에 포함될 가능성이 높습니다.
file
따라서 RssFile
cgroup과 in의 차이점부터 시작 하겠습니다 /proc/<pid>/status
.
프로세스가 20016KB 파일을 열었을 수 있지만 해당 파일 페이지는 이전에 메모리 캐시에 있었을 수 있습니다.다른 프로세스에서는 해당 프로세스를 열고 해당 cgroup에서 비용을 청구합니다.. 따라서 20016KB 중 2352KB만 cgroup에 의해 청구되고 나머지는 다른 cgroup(및 이전에 이러한 파일을 로드한 프로세스)에 속합니다.
anon
RssAnon
in cgroups와 /proc/<pid>/status
in .
와 관련하여 memory.current
제가 아는 한 모든 커널 내부(예: kernel_stack
및 )는 cgroup에서만 볼 수 있으며 사용자 공간 메모리 정보만 표시되기 slab
때문에 이러한 숫자에 대한 프로세스별 통계는 볼 수 없습니다 ./proc/<pid>/status