Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JUGNsk Meetup #12. Александр Белокрылов: "Не клади все яйца в один контейнер".

jugnsk
November 19, 2019

JUGNsk Meetup #12. Александр Белокрылов: "Не клади все яйца в один контейнер".

Как здорово деплоить микросервисы в контейнерах. Возьмём в облаке контейнеровоз за недорого и загрузим его под завязку. Только что-то сервисы не стартуют, тормозят и тихонечко идут на дно.

Правильные инструменты диагностики и новые версии Java помогают разобраться и выправить ситуацию. Микросервисная архитектура и контейнеризация стали стандартами современной разработки приложений. Вызовы, с которыми сегодня сталкиваются разработчики, отличаются от тех проблем, которые мы привыкли решать раньше. Создатели Java-рантайма реагируют на это соответствующей функциональностью в JDK. Например, недорогой облачный инстанс может быть довольно мощным. И на нём работает связка контейнеров. А JVM, запущенные в разных контейнерах, ведут борьбу за ресурсы инстанса. Начиная с Java 10 виртуальные машины уже умеют жить дружно, работа над этим продолжилась и в Java 11.

С другой стороны, нужно выбрать, какой базовый образ использовать. Это включает в себя выбор операционной системы и Java-рантайма. Образы ОС могут сильно отличаться по размеру и иметь свои особенности, которые должна учитывать и Java. Java-рантаймы тоже теперь на любой вкус. И даже в рамках OpenJDK доступны сборки от разных компаний и с разной функциональностью и размером. И кроме того, можно создавать custom runtime image.

Мы рассмотрим практическое применение функциональности Java 11 в контейнерной среде, типичной для популярных фреймворков.

jugnsk

November 19, 2019
Tweet

More Decks by jugnsk

Other Decks in Programming

Transcript

  1. 2 WWW.BELL-SW.COM 2 WWW.BELL-SW.COM Кто здесь? Александр Белокрылов @gigabel https://bell-sw.com

    @bellsoftware Liberica JDK – среда исполнения Java SE Ex-employers
  2. 3 WWW.BELL-SW.COM 3 WWW.BELL-SW.COM 20 years of history 1997 MCST

    – Moscow Center of SPARC Technologies The company worked as a contractor for Sun Microsystems 2004 Sun Microsystems founded its own Development Center in Saint-Petersburg. 2010 Oracle Corp. acquired Sun Microsystems 2017
  3. 9 WWW.BELL-SW.COM 9 WWW.BELL-SW.COM Контейнеризация l  Linux контейнеры —  cgroups

    —  namespaces —  Isolation —  Управление ресурсами —  Не путать с виртуализацией l  Docker images —  Всего то, конфигуратор l  Docker tools —  Управляй —  Следи —  Оркестрируй
  4. 13 WWW.BELL-SW.COM 13 WWW.BELL-SW.COM JVM l  Virtual Machine —  OS

    process —  Runtime —  JIT/code —  GC l  Expectations from containers —  Configuration —  Test ≃ Prod —  Isolation l  We need Java tools —  Management —  Monitoring —  Debug
  5. 17 WWW.BELL-SW.COM 17 WWW.BELL-SW.COM JDK 9 l  JDK-6515172 Runtime.availableProcessors() ignores

    Linux taskset command u  docker –cpuset-cpus l  JDK-8161993 G1 crashes if active_processor_count changes during startup l  JDK-8170888 Experimental support for cgroup memory limits in container (ie Docker) environments u  -XX:+UseCGroupMemoryLimitForHeap u  docker --memory
  6. 18 WWW.BELL-SW.COM 18 WWW.BELL-SW.COM JDK 10 l  JDK-8146115 Improve docker

    container detection and resource configuration usage u  -XX:+UseContainerSupport u  -XX:ActiveProcessorCount=N u  -Xlog:os+container=trace u  --cpus --cpu-quota –cpu-period u  Deprecate experimental •  JDK-8186248 Allow more flexibility in selecting Heap % of available RAM u  -XX:InitialRAMPercentage u  -XX:MaxRAMPercentage u  -XX:MinRAMPercentage •  JDK-8179498 attach in Linux should be relative to /proc/pid/root and namespace aware
  7. 19 WWW.BELL-SW.COM 19 WWW.BELL-SW.COM JDK 11 •  JDK-8197867 Update CPU

    count algorithm when both cpu shares and quotas are used u  -XX:+PreferContainerQuotaForCPUCount u  --cpu-shares •  JDK-8194086 Remove deprecated experimental flag UseCGroupMemoryLimitForHeap •  JDK-8203357 Container Metrics u  -XshowSettings:system •  JDK-8193710 jcmd -l and jps commands do not list Java processes running in Docker containers
  8. 20 WWW.BELL-SW.COM 20 WWW.BELL-SW.COM JDK 8 •  JDK 8 GA.

    “...none of my business” •  JDK 8u u  Backports from JDK 9 u  Backports from JDK 10 u  Backports from JDK 11
  9. 21 WWW.BELL-SW.COM 21 WWW.BELL-SW.COM JDK 8 •  JDK 8 GA.

    “...none of my business” •  JDK 8u u  Backports from JDK 9 u  Backports from JDK 10 u  Backports from JDK 11 ¯\_(ツ)_/¯
  10. 23 WWW.BELL-SW.COM 23 WWW.BELL-SW.COM JDK 12 •  JEP 346: Promptly

    Return Unused Committed Memory from G1 —  May help in case of overcommit
  11. 24 WWW.BELL-SW.COM 24 WWW.BELL-SW.COM JDK 13+ l  JDK-8199944 Add Container

    MBean to JMX l  JDK-8203359 Create new events, and adjust existing events, to account for host/container reporting of resources l  JMC-5901 Utilize information from the host/ container l  JDK-8198715 Investigate adding NUMA container support to hotspot u  --cpuset-mems
  12. 29 WWW.BELL-SW.COM 29 WWW.BELL-SW.COM Base images https://hub.docker.com/u/bellsoft JRE 8u222 JDK

    13 Debian 227 MB 227 MB Centos 307 MB 307 MB Alpine 133 MB 134 MB Alpine musl base 42 MB
  13. 30 WWW.BELL-SW.COM 30 WWW.BELL-SW.COM Base images l  Java versions l 

    13 l  8, 11 l  Linux distribution —  Debian —  CentOS —  Alpine —  Alpine musl l  Arch —  x86_64 —  ARM64 —  ARM32
  14. 32 WWW.BELL-SW.COM 32 WWW.BELL-SW.COM Build alpine-musl image $ mkdir ctx;

    cd ctx $ wget https://github.com/bell-sw/Liberica/blob/master/docker/repos/ liberica-openjdk-alpine-musl/11/Dockerfile $ docker build . --build-arg LIBERICA_IMAGE_VARIANT=base
  15. 33 WWW.BELL-SW.COM 33 WWW.BELL-SW.COM Что случилось? $ docker run -it

    --rm -v /export/dchuyko/demo:/demo -p 9000:9000 \ -m 5m debian /demo/jdk8u121/bin/java \ -jar /demo/gs-actuator-service-0.1.0.jar
  16. 34 WWW.BELL-SW.COM 34 WWW.BELL-SW.COM Что случилось? $ docker run -it

    --rm -v /export/dchuyko/demo:/demo -p 9000:9000 \ -m 5m debian /demo/jdk8u121/bin/java \ -jar /demo/gs-actuator-service-0.1.0.jar
  17. 35 WWW.BELL-SW.COM 35 WWW.BELL-SW.COM Что случилось? или l  -XX:NativeMemoryTracking=summary l 

    jps l  jcmd А сколько памяти достаточно? $ journalctl -f _TRANSPORT=kernel $ docker inspect test -f '{{json .State}}'
  18. 36 WWW.BELL-SW.COM 36 WWW.BELL-SW.COM Происходит что-то странное? $ docker run

    -it --rm -v /export/dchuyko/demo:/demo -p 9000:9000 \ -m 128m debian /demo/jdk8u121/bin/java \ -jar /demo/gs-actuator-service-0.1.0.jar $ jmeter.sh -n -t micro.jmx
  19. 37 WWW.BELL-SW.COM 37 WWW.BELL-SW.COM Происходит что-то странное? $ docker run

    -it --rm -v /export/dchuyko/demo:/demo -p 9000:9000 \ -m 128m debian /demo/jdk8u121/bin/java \ -jar /demo/gs-actuator-service-0.1.0.jar $ jmeter.sh -n -t micro.jmx
  20. 38 WWW.BELL-SW.COM 38 WWW.BELL-SW.COM Что происходит? l  docker stats l 

    jstat l  smem, pmap Никто за нас не подумал $ docker run -it --rm -v /export/dchuyko/demo:/demo -p 9000:9000 \ -m 768m --memory-swappiness 0 debian /demo/jdk8u121/bin/java \ -jar /demo/gs-actuator-service-0.1.0.jar ~~~~~ Started HelloWorldApplication in 18.584 seconds (JVM running for 20.425)
  21. 39 WWW.BELL-SW.COM 39 WWW.BELL-SW.COM AOT cpv – classpath in container.

    $ docker run -it --rm -v /export/dchuyko/demo:/demo -p 9000:8080 \ -m 768m --memory-swappiness 0 bellsoft/liberica-openjdk-alpine:11.0.4 java \ -XX:+UnlockDiagnosticVMOptions -XX:+LogTouchedMethods \ -cp /demo/thin.jar:$(cat cpv) hello.HelloWorldApplication $ jdk-11.0.4/bin/jcmd 35647 VM.print_touched_methods \ | grep -v "35647" | grep -v "#" >methods.log $ cat methods.log | grep -v SystemModules.hashes | grep -v SystemModules.descriptors \ | tr -d ':' | awk -F "(" '{gsub(/\//,".",$1);print $1"("$2}' \ | awk -F ")" '{gsub(/\//,".",$2);print "compileOnly "$1")"$2}' >methods.list $ docker run -it --rm -v /export/dchuyko/demo:/demo -m 768m --memory-swappiness 0 \ bellsoft/liberica-openjdk-alpine:11.0.4 jaotc \ --compile-commands /demo/methods.list --jar $(cat cpv) \ --info --ignore-errors --output /demo/thin.so
  22. 40 WWW.BELL-SW.COM 40 WWW.BELL-SW.COM AppCDS cpv – classpath in container.

    $ docker run -it --rm -v /export/dchuyko/demo:/demo -p 9000:8080 \ -m 384m --memory-swappiness 0 bellsoft/liberica-openjdk-alpine:11.0.4 \ java -XX:DumpLoadedClassList=/demo/hello-ext.classlist \ -cp /demo/thin.jar:$(cat cpv) hello.HelloWorldApplication $ docker run -it --rm -v /export/dchuyko/demo:/demo -p 9000:8080 \ -m 384m --memory-swappiness 0 bellsoft/liberica-openjdk-alpine:11.0.4 \ java -Xshare:dump -XX:SharedClassListFile=/demo/hello-ext.classlist \ -XX:SharedArchiveFile=/demo/hello-ext.jsa \ -cp /demo/thin.jar:$(cat cpv) hello.HelloWorldApplication $ docker run -it --rm -v /export/dchuyko/demo:/demo -p 9000:8080 \ -m 256m --memory-swappiness 0 bellsoft/liberica-openjdk-alpine:11.0.4 \ java -Xshare:on -XX:SharedArchiveFile=/demo/hello-ext.jsa \ -cp /demo/thin.jar:$(cat cpv) hello.HelloWorldApplication
  23. 41 WWW.BELL-SW.COM 41 WWW.BELL-SW.COM Startup & footprint improvements x2.5 ÷6

    $ docker run -it --rm -v /export/dchuyko/demo:/demo -p 9000:8080 \ -m 128m --memory-swappiness 0 bellsoft/liberica-openjdk-alpine:11.0.4 \ java -XX:TieredStopAtLevel=1 \ -Xshare:on -XX:SharedArchiveFile=/demo/hello-ext.jsa \ -cp /demo/thin.jar:$(cat cpv) hello.HelloWorldApplication ~~~~~ Started HelloWorldApplication in 7.304 seconds (JVM running for 8.283)
  24. 42 WWW.BELL-SW.COM 42 WWW.BELL-SW.COM Выводы l  Java 11 и выше

    работает в контейнере и знает об ограничениях l  Контейнерная диагностика l  Java диагностика l  Все фичи JVM работают в контейнерах l  Используем похожесть окружения для подготовки AppCDS и AOT l  Нужно использовать последние версии —  Безопасность —  Эффективность l  Мудро подходи к выбору базового имиджа l  Помоги своим сервисам быть лучше —  Предупреждай отказы —  Уменьшай футпринт —  Ускоряй стартап