私はAWSの何百ものシステムに影響を与えるメモリの問題に取り組んでいます。 120GBのRAMを搭載したi3.4xlインスタンスです。 Dockerコンテナ内で実行されているJavaデータベースサーバーはほとんどのRAMを消費しますが、報告された「使用済みメモリ」指標がプロセス使用量よりはるかに高いことが観察されました。
~$ free -m
total used free shared buff/cache available
Mem: 122878 105687 11608 1221 5583 14285
Swap: 0 0 0
上部のスナップショットは次のとおりです。使用されている108 GBのメモリのうち、データベースは77 GBしか占有していません。
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
そして/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
設定により、タブレットキャッシュをより積極的にリサイクルするために、以前にいくつかの点を変更しました。
~# cat /proc/sys/vm/vfs_cache_pressure
1000
/ proc / meminfoのタブレットメモリは15 GB以上で報告されていますが、現在は約2 GBのままです。以下はスラップトップ出力です(編集時に追加され、下のキャッシュを削除した後にメモリがいっぱいになり始めたとき)。
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
しかし、スラブキャッシュにより、メモリ使用量が依然として高くなります。私はそれを捨てることができるのでこれを信じています。
~# echo 2 > /proc/sys/vm/drop_caches
これにより、以下が表示されます。
~# free -m
total used free shared buff/cache available
Mem: 122878 82880 36236 1245 3761 37815
Swap: 0 0 0
/proc/meminfoには2GBのメモリしか表示されませんが、タブレットキャッシュを削除すると20GB以上のメモリが確保されます。これは新しい/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
だから私の質問はなぜこれが起こり、スラブキャッシュが使用されているメモリにあまりにも多くの影響を与えるのを防ぐにはどうすればよいですか?結局のところ、Javaサーバーはoom-kill状態になりますが、ページキャッシュがより効率的になるのを妨げる可能性があります。 Javaサーバーはファイルシステム(XFS)内の多数(数百万)のファイルを扱うため、これが関連している可能性がありますが、報告された指標が一貫していない理由は理解できません。これは同じ方法で構成された何百ものシステムに再び影響を与えた。
どんな助けでも大変感謝します。ありがとうございます!