Мониторинг. Нагрузочное тестирование. [email_address] 2009.01.19
Мониторинг. Обоснование. Предварительные вопросы: Сколько времени  CPU  потребляет Ваше приложение? Сколько памяти операционной системы оно использует? Сколько объектов оно хранит в своём хранилище? Сколько пользователей в системе сейчас? Сколько раз вызывается тот или иной метод  ( а так же каково его время выполнения ) ?
Мониторинг. Обоснование. Причём, все эти показатели в разрезе времени…
Мониторинг. Обоснование. Если Вы не можете ответить на эти вопросы, то Вашему программному обеспечению нужны средства мониторинга.
Мониторинг.  JMX. JMX ( J ava  M anagement e X tension) Расширение  Java  машины ( JVM )   для предоставления средств мониторинга и управления. Впервые появилась как часть  JRE/JDK  в  Java 1.5 ( но можно использовать и в  Java 1.4) Получила дальнейшее развитие в  Java 6, Java 7…
Мониторинг.  JMX. Какую информацию  JMX  позволяет получать? Информацию о  JMV (CPU,  память, кол-во потоков, загруженные классы,  Heap/Non Heap  память, сборщик мусора и пр… ) Информацию специфичную для приложения, которое выполняется в  JVM.
Мониторинг.  JMX. Для получения представления о том, как информация, специфичная для приложения, может быть опубликована через  JMX , необходим краткий экскурс в архитектуру.
Мониторинг.  JMX.
Мониторинг.  JConsole. В комплекте с  JDK  идёт стандартный клиент для мониторинга  JMX  данных –  jconsole.
Мониторинг.  JConsole.
Мониторинг.  JConsole.
Мониторинг.  JConsole.
Мониторинг. Включение  JMX. В  Java 6  локальные соединения  JMX  активированы по-умолчанию. В  Java 5 , для  JVM  необходимо передать параметр  -Dcom.sun.management.jmxremote= true Для активации удалённых подключений (с других машин) (в обеих версиях):  -Dcom.sun.management.jmxremote.port= ????   -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
Мониторинг.  MAGNET. Подсистема мониторинга  MAGNET. Кое-кто уже использует одну из подсистем платформы. Подсистему журналирования. Подключается просто: <dependency> <groupId>ru.magnetosoft.magnet</groupId> <artifactId>magnet-subsystem-management</artifactId> <version>0.1-SNAPSHOT</version> </dependency>
Мониторинг.  MAGNET. Подсистема позволяет собирать статистику по состояниям системы, по действиям выполняемым в ней. Накапливать и хранить статистику. Возвращать её в запрошенные диапазоны времени. Кроме того, она содержит утилиты для преобразования данных в форматы, специфичные для  JMX  протокола (и обратно).
Нагрузочное тестирование.   Обоснование. Симптомы необходимости внедрения нагрузочного тестирования: Через 3 месяца система начинает «деградировать». При пороге в 5 одновременных пользователей время ответа системы превышает 2 сек. Неожиданные ошибки конкурентного доступа. Зависание приложение системы при интенсивной работе. Непонятное потребление ресурсов при интенсивной работе или большом кол-ве пользователей.
Нагрузочное тестирование.   Правило  # 1. Нагрузочное тестирование – не однократная процедура.
Нагрузочное тестирование.  JMeter. JMeter -  продукт для проведения нагрузочного тестирования. Особенности: Тестирование различных видов серверов:  Web - HTTP, HTTPS  SOAP /WS   Database via JDBC  LDAP  Полностью портируем на все платформы (написан на  Java ). Многопоточность обеспечивает конкурентные замеры различных функций и обеспечивает эмуляцию виртуальных пользователей ( VUser ).  Offline  анализ результатов замеров.  Высокая конфигурируемость.
Нагрузочное тестирование.  JMeter. На текущий момент рассмотрим возможности  JMeter  в области тестирования веб-сервисов. После (возможно в другой презентации) – тестирование веб-приложений.
Нагрузочное тестирование.  JMeter. Основные компоненты  JMeter: Sampler –  генератор запросов Listener  – анализатор результатов выполнения запросов Controller  – контроль выполнения  Sampler’ ов (циклы, условия, группы, время выполнения и прочее…)
Нагрузочное тестирование.  JMeter.
Нагрузочное тестирование. Пример. Пример проведения нагрузочного тестирования будет продемонстрирован на модуле гетерогенного поиска ( HS ) .
Нагрузочное тестирование. Пример. Создаём под-проект по отношению к основному и размещаем код (код, скрипты, шаблоны) по тестированию в нём.
Нагрузочное тестирование. Пример. Создаём заглушки модулей участников взаимодействия ( FM, EM, Dict ) .  Они эмулируют поведение своих реальных собратьев, но выдают псевдо-данные, которые предназначены для создания заполнения основного модуля. Для тех, кто не в курсе модуль  HS , производит первоначальное извлечение данных из всех остальных модулей (подвергая их предварительной обработке), после чего переходит в основной режим работы. Режим выполнения сложных поисковых запросов.
Нагрузочное тестирование. Пример. Создаём  Ant  ( http://ant.apache.org/ ) скрипт, который выполняет ВСЮ работы в автоматическом режиме.
Нагрузочное тестирование. Пример. Извлекает из  maven  репозитария все необходимые артефакты, включая заархивированные версии  tomcat’ а и  jmeter.  Это позволяет избежать предварительной настройки рабочих мест для проведения тестов. Распаковывает и конфигурирует извлечённые артефакты.
Нагрузочное тестирование. Пример. Запускает все сконфигурированные артефакты в настроенном  tomcat’ е (с активированной поддержкой  JMX ). Ждёт старта и окончания предварительной синхронизации модулей. Запускает  JMeter ( как  ant  задачу ) , передавая ему в качестве параметров конфигурационный файл, в котором указано, что и как тестировать, а так же куда записывать результаты и логи.
Нагрузочное тестирование. Пример. JMeter  начинает выполнять тестовые запросы в соответствии с конфигурационным файлом (который также имеет расширение  “.jmx” ) .  Одновременно при этом он снимает показатели с  JVM  и записывает их в указанный лог-файл ( XML  формата).
Нагрузочное тестирование. Пример. После выполнения нагрузочных тестов сгенерированные  XML  файлы подвергаются специальной обработке, после которой создаются  XML  и  HTML  файлы содержащие суммарную статистику теста.
Нагрузочное тестирование. Пример. <?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> <jmxJvmDataStatistics> <satistics> <recordsCount>32</recordsCount> <measurementStarted>2009-01-18T13:31:25.062+0300</measurementStarted> <measurementFinished>2009-01-18T13:32:06.046+0300</measurementFinished> <measurementTime>40984</measurementTime> <jvmUptimeAtMeasurementEnd>143843</jvmUptimeAtMeasurementEnd> </satistics> <maxStateData> <processCPUUsagePerCent>26.7159257449927</processCPUUsagePerCent> <commitedVirtualMemorySize>52539392</commitedVirtualMemorySize> <heapMemoryUsage>9091984</heapMemoryUsage> <nonHeapMemoryUsage>23645624</nonHeapMemoryUsage> <threadCount>26</threadCount> <freePhysicalMemorySize>143142912</freePhysicalMemorySize> <freeSwapSpaceSize>686731264</freeSwapSpaceSize> </maxStateData> <minStateData> <processCPUUsagePerCent>0.000000944645308465716</processCPUUsagePerCent> <commitedVirtualMemorySize>49008640</commitedVirtualMemorySize> <heapMemoryUsage>8109448</heapMemoryUsage> <nonHeapMemoryUsage>22115016</nonHeapMemoryUsage> <threadCount>26</threadCount> <freePhysicalMemorySize>136445952</freePhysicalMemorySize> <freeSwapSpaceSize>679084032</freeSwapSpaceSize> </minStateData> <avgStateData> <processCPUUsagePerCent>5.81998057718807</processCPUUsagePerCent> <commitedVirtualMemorySize>51784704</commitedVirtualMemorySize> <heapMemoryUsage>8590992</heapMemoryUsage> <nonHeapMemoryUsage>23369054.25</nonHeapMemoryUsage> <threadCount>26</threadCount> <freePhysicalMemorySize>137923072</freePhysicalMemorySize> <freeSwapSpaceSize>680529664</freeSwapSpaceSize> </avgStateData> </jmxJvmDataStatistics>
Нагрузочное тестирование. Пример.
Нагрузочное тестирование. Пример. После этого тот же  ant  скрипт запускает стандартные  JUnit  тесты, которые анализируют итоговые  XML  файлы (а могут и оригинальные)  и принимают решение – прошёл тест или нет.
Нагрузочное тестирование. Приведённые скрипт (и его модификации для других продуктов) должен находиться в  CI  сервер и отслеживать: не повлияли ли внесённые изменения на требуемые показатели производительности.
Нагрузочное тестирование. При разработке данные скрипт (и его модификации) могут использоваться для автоматизации основных задач (конфигурирование, развёртывание). Запуск самого  JMeter’ а можно проводит в ручную. Благодаря его богатому графическому интерфейсу процесс распределения нагрузки можно проследить более визуально.

Monitoring and Load testing

  • 1.
  • 2.
    Мониторинг. Обоснование. Предварительныевопросы: Сколько времени CPU потребляет Ваше приложение? Сколько памяти операционной системы оно использует? Сколько объектов оно хранит в своём хранилище? Сколько пользователей в системе сейчас? Сколько раз вызывается тот или иной метод ( а так же каково его время выполнения ) ?
  • 3.
    Мониторинг. Обоснование. Причём,все эти показатели в разрезе времени…
  • 4.
    Мониторинг. Обоснование. ЕслиВы не можете ответить на эти вопросы, то Вашему программному обеспечению нужны средства мониторинга.
  • 5.
    Мониторинг. JMX.JMX ( J ava M anagement e X tension) Расширение Java машины ( JVM ) для предоставления средств мониторинга и управления. Впервые появилась как часть JRE/JDK в Java 1.5 ( но можно использовать и в Java 1.4) Получила дальнейшее развитие в Java 6, Java 7…
  • 6.
    Мониторинг. JMX.Какую информацию JMX позволяет получать? Информацию о JMV (CPU, память, кол-во потоков, загруженные классы, Heap/Non Heap память, сборщик мусора и пр… ) Информацию специфичную для приложения, которое выполняется в JVM.
  • 7.
    Мониторинг. JMX.Для получения представления о том, как информация, специфичная для приложения, может быть опубликована через JMX , необходим краткий экскурс в архитектуру.
  • 8.
  • 9.
    Мониторинг. JConsole.В комплекте с JDK идёт стандартный клиент для мониторинга JMX данных – jconsole.
  • 10.
  • 11.
  • 12.
  • 13.
    Мониторинг. Включение JMX. В Java 6 локальные соединения JMX активированы по-умолчанию. В Java 5 , для JVM необходимо передать параметр -Dcom.sun.management.jmxremote= true Для активации удалённых подключений (с других машин) (в обеих версиях): -Dcom.sun.management.jmxremote.port= ???? -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
  • 14.
    Мониторинг. MAGNET.Подсистема мониторинга MAGNET. Кое-кто уже использует одну из подсистем платформы. Подсистему журналирования. Подключается просто: <dependency> <groupId>ru.magnetosoft.magnet</groupId> <artifactId>magnet-subsystem-management</artifactId> <version>0.1-SNAPSHOT</version> </dependency>
  • 15.
    Мониторинг. MAGNET.Подсистема позволяет собирать статистику по состояниям системы, по действиям выполняемым в ней. Накапливать и хранить статистику. Возвращать её в запрошенные диапазоны времени. Кроме того, она содержит утилиты для преобразования данных в форматы, специфичные для JMX протокола (и обратно).
  • 16.
    Нагрузочное тестирование. Обоснование. Симптомы необходимости внедрения нагрузочного тестирования: Через 3 месяца система начинает «деградировать». При пороге в 5 одновременных пользователей время ответа системы превышает 2 сек. Неожиданные ошибки конкурентного доступа. Зависание приложение системы при интенсивной работе. Непонятное потребление ресурсов при интенсивной работе или большом кол-ве пользователей.
  • 17.
    Нагрузочное тестирование. Правило # 1. Нагрузочное тестирование – не однократная процедура.
  • 18.
    Нагрузочное тестирование. JMeter. JMeter - продукт для проведения нагрузочного тестирования. Особенности: Тестирование различных видов серверов: Web - HTTP, HTTPS SOAP /WS Database via JDBC LDAP Полностью портируем на все платформы (написан на Java ). Многопоточность обеспечивает конкурентные замеры различных функций и обеспечивает эмуляцию виртуальных пользователей ( VUser ). Offline анализ результатов замеров. Высокая конфигурируемость.
  • 19.
    Нагрузочное тестирование. JMeter. На текущий момент рассмотрим возможности JMeter в области тестирования веб-сервисов. После (возможно в другой презентации) – тестирование веб-приложений.
  • 20.
    Нагрузочное тестирование. JMeter. Основные компоненты JMeter: Sampler – генератор запросов Listener – анализатор результатов выполнения запросов Controller – контроль выполнения Sampler’ ов (циклы, условия, группы, время выполнения и прочее…)
  • 21.
  • 22.
    Нагрузочное тестирование. Пример.Пример проведения нагрузочного тестирования будет продемонстрирован на модуле гетерогенного поиска ( HS ) .
  • 23.
    Нагрузочное тестирование. Пример.Создаём под-проект по отношению к основному и размещаем код (код, скрипты, шаблоны) по тестированию в нём.
  • 24.
    Нагрузочное тестирование. Пример.Создаём заглушки модулей участников взаимодействия ( FM, EM, Dict ) . Они эмулируют поведение своих реальных собратьев, но выдают псевдо-данные, которые предназначены для создания заполнения основного модуля. Для тех, кто не в курсе модуль HS , производит первоначальное извлечение данных из всех остальных модулей (подвергая их предварительной обработке), после чего переходит в основной режим работы. Режим выполнения сложных поисковых запросов.
  • 25.
    Нагрузочное тестирование. Пример.Создаём Ant ( http://ant.apache.org/ ) скрипт, который выполняет ВСЮ работы в автоматическом режиме.
  • 26.
    Нагрузочное тестирование. Пример.Извлекает из maven репозитария все необходимые артефакты, включая заархивированные версии tomcat’ а и jmeter. Это позволяет избежать предварительной настройки рабочих мест для проведения тестов. Распаковывает и конфигурирует извлечённые артефакты.
  • 27.
    Нагрузочное тестирование. Пример.Запускает все сконфигурированные артефакты в настроенном tomcat’ е (с активированной поддержкой JMX ). Ждёт старта и окончания предварительной синхронизации модулей. Запускает JMeter ( как ant задачу ) , передавая ему в качестве параметров конфигурационный файл, в котором указано, что и как тестировать, а так же куда записывать результаты и логи.
  • 28.
    Нагрузочное тестирование. Пример.JMeter начинает выполнять тестовые запросы в соответствии с конфигурационным файлом (который также имеет расширение “.jmx” ) . Одновременно при этом он снимает показатели с JVM и записывает их в указанный лог-файл ( XML формата).
  • 29.
    Нагрузочное тестирование. Пример.После выполнения нагрузочных тестов сгенерированные XML файлы подвергаются специальной обработке, после которой создаются XML и HTML файлы содержащие суммарную статистику теста.
  • 30.
    Нагрузочное тестирование. Пример.<?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> <jmxJvmDataStatistics> <satistics> <recordsCount>32</recordsCount> <measurementStarted>2009-01-18T13:31:25.062+0300</measurementStarted> <measurementFinished>2009-01-18T13:32:06.046+0300</measurementFinished> <measurementTime>40984</measurementTime> <jvmUptimeAtMeasurementEnd>143843</jvmUptimeAtMeasurementEnd> </satistics> <maxStateData> <processCPUUsagePerCent>26.7159257449927</processCPUUsagePerCent> <commitedVirtualMemorySize>52539392</commitedVirtualMemorySize> <heapMemoryUsage>9091984</heapMemoryUsage> <nonHeapMemoryUsage>23645624</nonHeapMemoryUsage> <threadCount>26</threadCount> <freePhysicalMemorySize>143142912</freePhysicalMemorySize> <freeSwapSpaceSize>686731264</freeSwapSpaceSize> </maxStateData> <minStateData> <processCPUUsagePerCent>0.000000944645308465716</processCPUUsagePerCent> <commitedVirtualMemorySize>49008640</commitedVirtualMemorySize> <heapMemoryUsage>8109448</heapMemoryUsage> <nonHeapMemoryUsage>22115016</nonHeapMemoryUsage> <threadCount>26</threadCount> <freePhysicalMemorySize>136445952</freePhysicalMemorySize> <freeSwapSpaceSize>679084032</freeSwapSpaceSize> </minStateData> <avgStateData> <processCPUUsagePerCent>5.81998057718807</processCPUUsagePerCent> <commitedVirtualMemorySize>51784704</commitedVirtualMemorySize> <heapMemoryUsage>8590992</heapMemoryUsage> <nonHeapMemoryUsage>23369054.25</nonHeapMemoryUsage> <threadCount>26</threadCount> <freePhysicalMemorySize>137923072</freePhysicalMemorySize> <freeSwapSpaceSize>680529664</freeSwapSpaceSize> </avgStateData> </jmxJvmDataStatistics>
  • 31.
  • 32.
    Нагрузочное тестирование. Пример.После этого тот же ant скрипт запускает стандартные JUnit тесты, которые анализируют итоговые XML файлы (а могут и оригинальные) и принимают решение – прошёл тест или нет.
  • 33.
    Нагрузочное тестирование. Приведённыескрипт (и его модификации для других продуктов) должен находиться в CI сервер и отслеживать: не повлияли ли внесённые изменения на требуемые показатели производительности.
  • 34.
    Нагрузочное тестирование. Приразработке данные скрипт (и его модификации) могут использоваться для автоматизации основных задач (конфигурирование, развёртывание). Запуск самого JMeter’ а можно проводит в ручную. Благодаря его богатому графическому интерфейсу процесс распределения нагрузки можно проследить более визуально.