Estou tentando configurar algum monitoramento para ver quando um serviço está usando muita memória. O uso de memória pode ser lido de dois lugares:
- o
/proc/<pid>/status
para o pid, ou - o
/sys/fs/cgroup/<group-id>/memory.stat
para o grupo de controle em que é executado.
O serviço é iniciado pelo systemd, portanto, ele obtém seu próprio grupo de controle e, como às vezes inicia processos filho que preciso incluir nas estatísticas, e como o caminho é constante nas reinicializações, a estatística do grupo de controle é mais apropriada.
Infelizmente, os números parecem não corresponder. Aqui está uma amostra dos valores em um ponto em que nenhum subprocesso está sendo executado (o comando é exatamente como executado, exceto pelo nome do serviço, e o resultado é exatamente como obtido, exceto itens não relacionados à memória removidos):
# 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
Eu consideraria o valor apropriado como VmRSS
(= RssAnon
+ RssFile
+ RssShmem
) da estatística do processo. Mas enquanto eu acho que anon
do grupo deve ser RssAnon
do processo e file
do grupo deve ser RssFile
do processo, eles não combinam. Enquanto anon
é 5736 KB, RssAnon
é apenas 5468 KB, e para arquivo a diferença é ainda maior, file
sendo apenas 2352 KB, mas RssFile
sendo 20016 KB, diferença de quase ordem de magnitude.
Também há um memory.current
arquivo com um valor que corresponde aproximadamente a anon
+ file
+ kernel_stack
+ slab
+ sock
+ shmem
, mas não vejo nenhum valor correspondente no status do processo.
Então, por que os números são tão diferentes e quais são mais indicativos de quanta pressão de memória o aplicativo está exercendo no sistema?
Nota: usando cgroup2 no kernel 4.19.72 (BSP incorporado um pouco obsoleto).