Estou lidando com um problema de memória que afeta centenas de máquinas na AWS. São instâncias i3.4xl com 120 GB de RAM. Há um servidor de banco de dados Java em execução em um contêiner do Docker que consome a maioria da RAM, mas estou observando o relatório de métrica de "memória usada" muito maior do que o uso desse processo.
~$ free -m
total used free shared buff/cache available
Mem: 122878 105687 11608 1221 5583 14285
Swap: 0 0 0
Aqui está um instantâneo do topo. Dos 108GB de memória usados, apenas 77GB são ocupados pelo banco de dados.
top - 18:21:25 up 310 days, 15:48, 1 user, load average: 23.78, 20.90, 24.30
Tasks: 284 total, 2 running, 282 sleeping, 0 stopped, 0 zombie
%Cpu(s): 10.4 us, 3.9 sy, 0.0 ni, 83.5 id, 0.2 wa, 0.0 hi, 0.9 si, 1.1 st
KiB Mem : 12582788+total, 7280872 free, 10839378+used, 10153232 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 14414696 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
45338 root 20 0 88.304g 0.077t 24460 S 396.7 65.9 4962:44 java
1353 consul 20 0 53784 30068 0 S 1.3 0.0 10030:05 consul
82080 root 24 4 979740 46128 8548 S 1.3 0.0 6:46.95 aws
2941 dd-agent 20 0 194848 23548 3068 S 1.0 0.0 1293:05 python
83 root 20 0 0 0 0 S 0.3 0.0 290:30.49 ksoftirqd/15
503 root 20 0 147352 98228 87492 S 0.3 0.1 994:49.08 systemd-journal
964 root 20 0 0 0 0 S 0.3 0.0 1031:29 xfsaild/nvme0n1
1405 root 20 0 1628420 48796 16588 S 0.3 0.0 533:50.58 dockerd
2963 dd-agent 20 0 4184188 241520 1196 S 0.3 0.2 168:24.64 java
28797 xray 20 0 3107132 236288 4724 S 0.3 0.2 150:04.44 xray
116185 root 20 0 1722788 13012 6348 S 0.3 0.0 53:54.38 amazon-ssm-agen
1 root 20 0 38728 6144 3308 S 0.0 0.0 2:41.84 systemd
2 root 20 0 0 0 0 S 0.0 0.0 399:59.14 kthreadd
E / proc / meminfo:
~# cat /proc/meminfo
MemTotal: 125827888 kB
MemFree: 5982300 kB
MemAvailable: 14354644 kB
Buffers: 2852 kB
Cached: 9269636 kB
SwapCached: 0 kB
Active: 86468892 kB
Inactive: 6778036 kB
Active(anon): 83977260 kB
Inactive(anon): 1259020 kB
Active(file): 2491632 kB
Inactive(file): 5519016 kB
Unevictable: 3660 kB
Mlocked: 3660 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 220968 kB
Writeback: 0 kB
AnonPages: 83978456 kB
Mapped: 182596 kB
Shmem: 1259060 kB
Slab: 2122036 kB
SReclaimable: 1131528 kB
SUnreclaim: 990508 kB
KernelStack: 48416 kB
PageTables: 183468 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 62913944 kB
Committed_AS: 89880700 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
HardwareCorrupted: 0 kB
AnonHugePages: 28672 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 4868096 kB
DirectMap2M: 120961024 kB
DirectMap1G: 4194304 kB
Eu já havia feito algumas alterações para tentar recuperar o cache da laje de maneira mais agressiva definindo isso:
~# cat /proc/sys/vm/vfs_cache_pressure
1000
A memória slab em / proc / meminfo costumava reportar 15 GB +, mas agora fica em torno de 2 GB. Aqui está a saída slabtop (adicionada em uma edição, algum tempo depois do cache de descarte abaixo quando a memória começou a encher de novo):
Active / Total Objects (% used) : 7068193 / 7395845 (95.6%)
Active / Total Slabs (% used) : 158330 / 158330 (100.0%)
Active / Total Caches (% used) : 81 / 128 (63.3%)
Active / Total Size (% used) : 2121875.02K / 2188049.35K (97.0%)
Minimum / Average / Maximum Object : 0.01K / 0.29K / 8.00K
OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
1465206 1464982 99% 0.38K 35375 42 566000K mnt_cache
1360044 1360044 100% 0.19K 32383 42 259064K dentry
1175936 1107199 94% 0.03K 9187 128 36748K kmalloc-32
1056042 1055815 99% 0.10K 27078 39 108312K buffer_head
732672 727789 99% 1.06K 24606 30 787392K xfs_inode
462213 453665 98% 0.15K 8721 53 69768K xfs_ili
333284 333250 99% 0.57K 6032 56 193024K radix_tree_node
173056 117508 67% 0.06K 2704 64 10816K kmalloc-64
90336 31039 34% 0.12K 1414 64 11312K kmalloc-128
82656 23185 28% 0.19K 1972 42 15776K kmalloc-192
58328 40629 69% 0.50K 1012 64 32384K kmalloc-512
51476 51476 100% 0.12K 758 68 6064K kernfs_node_cache
45440 15333 33% 0.25K 713 64 11408K kmalloc-256
21250 21250 100% 0.05K 250 85 1000K ftrace_event_field
20706 20298 98% 0.04K 203 102 812K ext4_extent_status
19779 18103 91% 0.55K 347 57 11104K inode_cache
18600 18600 100% 0.61K 363 52 11616K proc_inode_cache
14800 13964 94% 0.20K 371 40 2968K vm_area_struct
14176 6321 44% 1.00K 443 32 14176K kmalloc-1024
12006 12006 100% 0.09K 261 46 1044K trace_event_file
11776 11776 100% 0.01K 23 512 92K kmalloc-8
No entanto, ainda parece que o cache slab está fazendo com que a memória usada seja alta. Eu acredito nisso porque posso abandonar:
~# echo 2 > /proc/sys/vm/drop_caches
Então você vê isso:
~# free -m
total used free shared buff/cache available
Mem: 122878 82880 36236 1245 3761 37815
Swap: 0 0 0
Mais de 20 GB foram liberados pela queda do cache slab, apesar de exibir apenas 2 GB de memória em / proc / meminfo. Aqui está o novo / proc / meminfo:
~# cat /proc/meminfo
MemTotal: 125827888 kB
MemFree: 34316592 kB
MemAvailable: 38394188 kB
Buffers: 6652 kB
Cached: 5726320 kB
SwapCached: 0 kB
Active: 85651988 kB
Inactive: 4084612 kB
Active(anon): 84007364 kB
Inactive(anon): 1283596 kB
Active(file): 1644624 kB
Inactive(file): 2801016 kB
Unevictable: 3660 kB
Mlocked: 3660 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 260096 kB
Writeback: 0 kB
AnonPages: 84008564 kB
Mapped: 194628 kB
Shmem: 1283636 kB
Slab: 601176 kB
SReclaimable: 401788 kB
SUnreclaim: 199388 kB
KernelStack: 48496 kB
PageTables: 183564 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 62913944 kB
Committed_AS: 89815920 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
HardwareCorrupted: 0 kB
AnonHugePages: 28672 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 4868096 kB
DirectMap2M: 120961024 kB
DirectMap1G: 4194304 kB
Então, eu acho que a minha pergunta é por que isso acontece e como posso evitar que o cache slab afete tanto a memória usada? Isso eventualmente faz com que o servidor Java seja destruído, mas também evita que o cache de página seja mais eficiente. O servidor Java toca muito (milhões) de arquivos no sistema de arquivos (XFS), portanto isso pode estar relacionado, mas não entendo por que as métricas relatadas não estão alinhadas. Mais uma vez, isso afeta centenas de máquinas configuradas da mesma maneira.
Qualquer ajuda seria apreciada, obrigado!
Tags aws memory linux out-of-memory