Ввод: Windows Хост, Docker ( ограничение 2 Гб и 2 Гб, своп ) с Ubuntu и java / spring приложением внутри. Приложение не тривиально, и я не могу создать простой прототип. Проблема с утечкой памяти. Однако все параметры ниже пределов, и я не могу понять, почему приложение закрывается через некоторое время под определенной нагрузкой. Я нашел множество инструментов для измерения используемой памяти и не могу связать их между собой.
Я ограничил все известные мне флаги JVM и добавил такие инструменты мониторинга, как Javamelody. Я использовал top, free sar, docker stat, vmstat, и все они показывают, что использование памяти не увеличивается. Какой инструмент или какую часть я не учел?
Docker:
FROM adoptopenjdk/openjdk11:x86_64-ubuntu-jdk-11.0.3_7-slim
VOLUME /tmp
VOLUME /javamelody
RUN apt-get update && apt-get install procps wget -y
RUN apt-get install fontconfig ttf-dejavu -y
RUN apt-get install libjemalloc1 libjemalloc-dev -y
RUN apt-get install unzip -y
RUN mkdir /usr/local/async-profiler/ &&\
wget -O /usr/local/async-profiler/async-profiler.tar.gz https://github.com/jvm-profiling-tools/async-profiler/releases/download/v1.6/async-profiler-1.6-linux-x64.tar.gz &&\
cd /usr/local/async-profiler/ &&\
tar -xvzf async-profiler.tar.gz &&\
rm -f /usr/local/async-profiler/async-profiler.tar.gz
RUN mkdir /usr/local/flame-graph/ &&\
wget -O /usr/local/flame-graph/flame-graph.zip https://github.com/brendangregg/FlameGraph/archive/v1.0.zip &&\
cd /usr/local/flame-graph/ && unzip flame-graph.zip &&\
cd /usr/local/flame-graph/
RUN apt-get install sudo -y
RUN apt-get install sysstat -y
RUN apt-get install vim -y
ARG JAR_FILE
COPY target/${JAR_FILE} app.jar
COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD java \
-Xmx896m \
-XX:CompressedClassSpaceSize=256m \
-Xss512k \
-XX:MaxMetaspaceSize=640m \
-XX:MaxDirectMemorySize=512m \
-XX:+UseStringDeduplication \
-XX:+PrintFlagsFinal \
-XX:+UnlockDiagnosticVMOptions \
-XX:+PrintNMTStatistics \
-XX:NativeMemoryTracking=summary \
-XX:+CrashOnOutOfMemoryError \
-XX:ErrorFile=/tmp/hs_err_pid%p.log \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=tmp/ \
-jar /app.jar
docker -составить:
version: '3'
services:
risky-app:
image: risky:latest
security_opt:
- seccomp:unconfined
cap_add:
- ALL
ports:
- "9998:9998"
expose:
- "9998"
deploy:
resources:
limits:
memory: 600m
reservations:
memory: 600m
environment:
sar -r 1 10
07:08:00 AM kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
07:08:01 AM 96140 326208 1940876 95.28 58436 351536 6696124 161.97 869360 921972 3512
07:08:02 AM 96148 326356 1940868 95.28 58452 351572 6696124 161.97 869376 922096 3548
07:08:03 AM 96140 326272 1940876 95.28 58452 351592 6696124 161.97 869248 922104 3640
07:08:04 AM 95384 325852 1941632 95.32 58476 351852 6700112 162.07 869280 922460 3908
07:08:05 AM 95384 325864 1941632 95.32 58500 351844 6700112 162.07 869288 922460 3916
07:08:06 AM 95392 326076 1941624 95.32 58516 352040 6700112 162.07 869384 922644 4088
07:08:07 AM 95148 325916 1941868 95.33 58532 352272 6700112 162.07 869384 922728 4172
07:08:08 AM 75788 292372 1961228 96.28 56976 337580 6784708 164.11 897532 913128 4524
07:08:09 AM 113916 328664 1923100 94.41 56992 337708 6699800 162.06 861984 911204 4644
07:08:10 AM 113680 328548 1923336 94.42 57016 337840 6699800 162.06 861992 911288 4760
Average: 97312 323213 1939704 95.22 58035 347584 6707313 162.24 870683 919208 4071
docker статистика
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
4e8eb37052ef engine-app_risky-app_1 11.65% 588.8MiB / 600MiB 98.14% 88.5MB / 86.5MB 198MB / 98.3MB 86
вверх
top - 07:09:09 up 1:28, 0 users, load average: 0.55, 0.50, 0.44
Tasks: 5 total, 1 running, 4 sleeping, 0 stopped, 0 zombie
%Cpu(s): 10.8 us, 6.9 sy, 0.0 ni, 80.8 id, 0.5 wa, 0.0 hi, 0.8 si, 0.0 st
KiB Mem : 2037016 total, 117588 free, 1492880 used, 426548 buff/cache
KiB Swap: 2097148 total, 1040636 free, 1056512 used. 331312 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6 root 20 0 2903772 598740 8624 S 9.3 29.4 12:49.02 java
1 root 20 0 4628 0 0 S 0.0 0.0 0:00.01 sh
52 root 20 0 20180 956 956 S 0.0 0.0 0:00.00 bash
62 root 20 0 38256 1036 796 R 0.0 0.1 0:00.87 top
93 root 20 0 20308 2016 1540 S 0.0 0.1 0:00.03 bash
free -tk
root@4e8eb37052ef:/sys/fs/cgroup/memory# free -tk
total used free shared buff/cache available
Mem: 2037016 1490672 104868 68972 441476 332968
Swap: 2097148 1056768 1040380
Total: 4134164 2547440 1145248
jcmd 6 Сводка VM.native_memory
Total: reserved=1690873KB, committed=567805KB
- Java Heap (reserved=917504KB, committed=237308KB)
(mmap: reserved=917504KB, committed=237308KB)
- Class (reserved=422788KB, committed=183004KB)
(classes #32044)
( instance classes #30284, array classes #1760)
(malloc=7044KB #108298)
(mmap: reserved=415744KB, committed=175960KB)
( Metadata: )
( reserved=153600KB, committed=153088KB)
( used=148830KB)
( free=4258KB)
( waste=0KB =0.00%)
( Class space:)
( reserved=262144KB, committed=22872KB)
( used=20326KB)
( free=2546KB)
( waste=0KB =0.00%)
- Thread (reserved=44744KB, committed=8536KB)
(thread #82)
(stack: reserved=44352KB, committed=8144KB)
(malloc=295KB #414)
(arena=97KB #163)
- Code (reserved=255774KB, committed=91102KB)
(malloc=8086KB #26448)
(mmap: reserved=247688KB, committed=83016KB)
- GC (reserved=4023KB, committed=1815KB)
(malloc=1031KB #4988)
(mmap: reserved=2992KB, committed=784KB)
- Compiler (reserved=720KB, committed=720KB)
(malloc=589KB #2416)
(arena=131KB #5)
- Internal (reserved=1752KB, committed=1752KB)
(malloc=1712KB #7582)
(mmap: reserved=40KB, committed=40KB)
- Other (reserved=186KB, committed=186KB)
(malloc=186KB #20)
- Symbol (reserved=33305KB, committed=33305KB)
(malloc=30228KB #396733)
(arena=3077KB #1)
- Native Memory Tracking (reserved=8690KB, committed=8690KB)
(malloc=26KB #332)
(tracking overhead=8664KB)
- Arena Chunk (reserved=178KB, committed=178KB)
(malloc=178KB)
- Logging (reserved=4KB, committed=4KB)
(malloc=4KB #186)
- Arguments (reserved=18KB, committed=18KB)
(malloc=18KB #481)
- Module (reserved=1187KB, committed=1187KB)
(malloc=1187KB #6351)
vmstat -s
root@4e8eb37052ef:/sys/fs/cgroup/memory# vmstat -s
2037016 K total memory
1490396 K used memory
858356 K active memory
930076 K inactive memory
99064 K free memory
58984 K buffer memory
388572 K swap cache
2097148 K total swap
1057280 K used swap
1039868 K free swap
117815 non-nice user cpu ticks
0 nice user cpu ticks
40635 system cpu ticks
893337 idle cpu ticks
7225 IO-wait cpu ticks
0 IRQ cpu ticks
10712 softirq cpu ticks
0 stolen cpu ticks
1518777 pages paged in
5141480 pages paged out
20256 pages swapped in
293129 pages swapped out
6238589 interrupts
32714396 CPU context switches
1581054022 boot time
9558 forks
memory.stat
root@4e8eb37052ef:/sys/fs/cgroup/memory# cat memory.stat
cache 9875456
rss 612818944
rss_huge 0
shmem 0
mapped_file 1892352
dirty 405504
writeback 0
swap 69070848
pgpgin 320232
pgpgout 168267
pgfault 258357
pgmajfault 2475
inactive_anon 306356224
active_anon 306417664
inactive_file 4861952
active_file 4804608
unevictable 0
hierarchical_memory_limit 629145600
hierarchical_memsw_limit 1258291200
total_cache 9875456
total_rss 612818944
total_rss_huge 0
total_shmem 0
total_mapped_file 1892352
total_dirty 405504
total_writeback 0
total_swap 69070848
total_pgpgin 320232
total_pgpgout 168267
total_pgfault 258357
total_pgmajfault 2475
total_inactive_anon 306356224
total_active_anon 306417664
total_inactive_file 4861952
total_active_file 4804608
total_unevictable 0
Вопросы:
- Какой показатель c используется в качестве предела для предела docker и для пределов kubernetes? Так что после пересечения этой строки приложение будет OOMKilled
- Являются ли все эти возможные (полезные) инструменты, которые мы можем использовать для отслеживания памяти в docker контейнере?
- Есть ли какой-либо дополнительный скрытый потребитель памяти здесь это не отображается
- Почему в командах sar free отображаются странные показатели использования памяти?
Замечания:
- Приложение уничтожен, однако пределы не достигаются после запроса 6000 (который я использую в качестве нагрузочного тестирования)
- Приложение не уничтожается, если я полностью отключаю ведение журнала 40000 запросов, и это нормально
- Приложение уничтожается, если я отключить консольный вывод и оставить только ведение журнала файлов с поворотом на 10 МБ
- Приложение работает чуть лучше (8000 запросов перед уничтожением), если я увеличу максимальный размер соединения БД со значения по умолчанию (?) до 200. Используется postgres и HikaryCP как пул соединений