Quarkus: модернізація програм на прикладі helloworld з JBoss EAP Quickstart (продовження)

Всім привіт – з вами п'ятий пост із нашої серії про Quarkus! (До речі, дивіться наш вебінар «Це Quarkus – Kubernetes native Java фреймворк». Покажемо, як розпочати «з нуля» або перенести готові рішення)

Quarkus: модернізація програм на прикладі helloworld з JBoss EAP Quickstart (продовження)

В попередньому пості ми розглянули модернізацію Java-додатків за допомогою підтримуваних Quarkus технологій (CDI та Servlet 3) на прикладі програми helloworld з репозиторію Red Hat JBoss Enterprise Application Platform (JBoss EAP) Quickstart. Сьогодні ми продовжимо тему модернізації та обговоримо питання споживання пам'яті.

Вимірювання продуктивності – це фундаментальна основа практично будь-якої модернізації, а звіти щодо використання пам'яті є важливою частиною процесу аналізу продуктивності. Сьогодні ми розглянемо відповідні вимірювальні інструменти, за допомогою яких можна кількісно оцінити покращення, одержані в результаті модернізації Java-додатків.

Подробиці про вимірювання використання пам'яті можна дізнатися з посібника Quarkus під назвою Measuring Performance—How do we measure memory usage?

А нижче ми просто покажемо, як порівняти дані з використання пам'яті трьома різними типами додатків (JBoss EAP, JAR-пакет і файл), збираючи ці дані в Linux за допомогою утиліт pmap і ps.

JBoss EAP

Запускаємо екземпляр програми JBoss EAP (див. розділ «Розгортаємо helloworld» в попередньому пості) і потім дивимось його ідентифікатор процесу PID (у нашому прикладі це 7268) за допомогою наступної команди:

$ pgrep -lf jboss
7268 java

Примітка. Опція –a дозволяє отримати повний командний рядок (тобто $ pgrep -af jboss).

Тепер використовуємо PID 7268 у командах ps та pmap.

Ось так:

$ ps -o pid,rss,command -p 7268
PID RSS COMMAND 
7268 665348 java -D[Standalone] -server -verbose:gc -Xloggc:/home/mrizzi/Tools/jboss-eap-7.2.0/jboss-eap-7.2/standalone/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=3M -XX:-TraceClassUnloading -Xms1303m -Xmx1303m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferI

І ось так:

$ pmap -x 7268
7268:   java -D[Standalone] -server -verbose:gc -Xloggc:/home/mrizzi/Tools/jboss-eap-7.2.0/jboss-eap-7.2/standalone/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=3M -XX:-TraceClassUnloading -Xms1303m -Xmx1303m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Dorg.jboss.boot.log.file=/home/mrizzi/Tools/jboss-eap-7.2.0/jboss-eap-7.2/standa
Address           Kbytes     RSS   Dirty Mode  Mapping
00000000ae800000 1348608  435704  435704 rw---   [ anon ]
0000000100d00000 1035264       0       0 -----   [ anon ]
000055e4d2c2f000       4       4       0 r---- java
000055e4d2c30000       4       4       0 r-x-- java
000055e4d2c31000       4       0       0 r---- java
000055e4d2c32000       4       4       4 r---- java
000055e4d2c33000       4       4       4 rw--- java
[...]
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- -------
total kB         3263224  672772  643024

Дивимося RSS і бачимо, що JBoss EAP споживає приблизно 650 МБ пам'яті.

JAR-пакет

Запускаємо JAR-додаток (див. розділ «Запускаємо helloworld, упакований у JAR» в попередньому пості):

$ java -jar ./target/helloworld-<version>-runner.jar

Знову дивимося PID за допомогою команди pgrep (на цей раз використовуємо описану вище опцію -a):

$ pgrep -af helloworld
6408 java -jar ./target/helloworld-<version>-runner.jar

Запускаємо ps та pmap, щоб виміряти використання пам'яті, але тепер для процесу 6408.

Ось так:

$ ps -o pid,rss,command -p 6408
  PID   RSS COMMAND
 6408 125732 java -jar ./target/helloworld-quarkus-runner.jar

І ось так:

$ pmap -x 6408
6408:   java -jar ./target/helloworld-quarkus-runner.jar
Address           Kbytes     RSS   Dirty Mode  Mapping
00000005d3200000  337408       0       0 rw---   [ anon ]
00000005e7b80000 5046272       0       0 -----   [ anon ]
000000071bb80000  168448   57576   57576 rw---   [ anon ]
0000000726000000 2523136       0       0 -----   [ anon ]
00000007c0000000    2176    2088    2088 rw---   [ anon ]
00000007c0220000 1046400       0       0 -----   [ anon ]
00005645b85d6000       4       4       0 r---- java
00005645b85d7000       4       4       0 r-x-- java
00005645b85d8000       4       0       0 r---- java
00005645b85d9000       4       4       4 r---- java
00005645b85da000       4       4       4 rw--- java
[...]
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- -------
total kB         12421844  133784  115692

Знову дивимося RSS та бачимо, що JAR-пакет споживає приблизно 130 МБ.

Виконуваний файл

Запускаємо нативник (див. розділ «Запускаємо виконуваний нативний файл helloworld» в попередньому пості):

$ ./target/helloworld-<version>-runner

Знову дивимося його PID:

$ pgrep -af helloworld
6948 ./target/helloworld-<version>-runner

І потім використовуємо отриманий ідентифікатор процесу (6948) у командах ps та pmap.

Ось так:

$ ps -o pid,rss,command -p 6948
  PID   RSS COMMAND
 6948 19084 ./target/helloworld-quarkus-runner
И вот так:
$ pmap -x 6948
6948:   ./target/helloworld-quarkus-runner
Address           Kbytes     RSS   Dirty Mode  Mapping
0000000000400000      12      12       0 r---- helloworld-quarkus-runner
0000000000403000   10736    8368       0 r-x-- helloworld-quarkus-runner
0000000000e7f000    7812    6144       0 r---- helloworld-quarkus-runner
0000000001620000    2024    1448     308 rw--- helloworld-quarkus-runner
000000000181a000       4       4       4 r---- helloworld-quarkus-runner
000000000181b000      16      16      12 rw--- helloworld-quarkus-runner
0000000001e10000    1740     156     156 rw---   [ anon ]
[...]
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- -------
total kB         1456800   20592    2684

Дивимося RSS і бачимо, що файл займає близько 20 МБ пам'яті.

Порівнюємо витрату пам'яті

Отже, ми отримали такі цифри щодо використання пам'яті:

  • JBoss EAP - 650 МБ.
  • JAR пакет – 130 МБ.
  • Виконуваний файл – 20 МБ.

Очевидно, що виконуваний файл займає набагато менше пам'яті.

Підбиваємо підсумки 4 та 5 постів

У цьому та попередньому постах ми розглянули питання модернізації Java-додатків з використанням технологій, що підтримуються в Quarkus (CDI і Servlet 3), а також різні способи розробки, складання та запуску таких додатків. Ми показали, як виконувати збір даних щодо використання пам'яті для оцінки покращень, досягнутих у результаті такої модернізації. Ці статті допомагають зрозуміти, як працює Quarkus і в чому полягає його користь - незалежно від того, чи йдеться про найпростішу програму helloworld з наших прикладів або про набагато більш складні програми з реального життя.

Ми повернемося за два тижні з заключним постом про Quarkus – до зустрічі!

У заключному посту ми покажемо, як об'єднати AMQ Online і Quarkus, щоб побудувати сучасну систему обміну повідомленнями на базі OpenShift з використанням двох нових технологій, пов'язаних з обробкою повідомлень. Читайте по за посиланням.

Джерело: habr.com

Додати коментар або відгук