Мониторинг производительности

Страница посвящена системе мониторинга производительности

Подсистема мониторинга времени выполнения и частоты вызовов методов служб

Источником данных о производительности для подсистемы являются измерения времени выполнения и частоты вызовов методов служб.

Подсистема удовлетворяет следующим требованиям:

  • позволяет хранить данные о частоте вызовов и средней продолжительности выполнения методов служб Janet модуля;
  • позволяет выбирать источники данных о производительности путем внесения изменений в соответствующие файлы конфигурации;
  • позволяет создавать отчеты по собранным данным, в том числе по данным собранным за продолжительный промежуток времени;
  • позволяет осуществлять мониторинг в реальном масштабе времени;
  • позволяет осуществлять непрерывный мониторинг в режиме 24х7;
  • сбор данных о производительности Janet модуля не оказывает пагубного влияния на его быстродействие.

Сбор данных о быстродействии

Конфигурацию мониторинга предлагается производить внутри конфигурационного файла iJaNet-модуля jws-module.xml путем задания параметров мониторинга. Необходимый набор параметров будет рассмотрен на этапе реализации.

Измерения предлагается производить внутри системного метода jws.core.services.ServiceBase.invoke(). Полученные данные о времени вызова и времени выполнения передавать в очередь измерений откуда после предварительной обработки сохранять в файл, например, средствами log4j. Обработка данных включает в себя расчет среднего времени выполнения и частоты вызовов метода за минуту.
Количество записей в одном файле предлагается ограничить временным интервалом в одни сутки. Т.о. максимальный размер файла, содержащего данные с измерениями не будет превышать 24 * 60 = 1440 строк.
Для каждого метода являющегося источником данных о производительности создаётся отдельный набор файлов с данными измерений.

Анализ данных

Анализ проведенных измерений включает в себя разбор файлов с данными о производительности и построение пары графиков по имеющимся данным. Первый график: среднее время выполнения метода за минуту на заданном интервале. Второй: частота вызовов метода на заданном интервале. Пользователь должен иметь возможность изменять временной интервал. На рисунке приведен пример графика соответсвующего интервалу с 14:13 по 14:22 текущего дня.

Реализация

Очередь (FIFO) измерений janet.services.apm.impl.core.MeasurementQueue представляет собой синглтон с ленивой инициализацией - экземпляр класса создаётся при первом обращении к методу janet.services.apm.impl.core.MeasurementQueue.getInstance(). Элементы очереди - объекты класса janet.services.apm.impl.core.TraceRecord содержат информацию о времени вызова метода и времени возврата из метода, а также уникальный индентификатор фильтра в соотствии с которым было призведено измерение.
Для помещения/извлечения элементов в/из очередь(и) реализованы два метода:

  1. public void push(TraceRecord) - заносит новую запись о производительности в конец очереди. Если достигнут максимальный размер очереди происходит возврат из метода, переданное значение теряется.
  2. public TraceRecord pop() - забирает запись о производительности из начала очереди с удалением ее из очереди. Если очередь пуста метод возвращает null.

Оба этих метода, а также метод janet.services.apm.impl.core.MeasurementQueue.getInstance() потокобезопасны.

Коллектор измерений - работа выполняемая по расписанию. Реализована в классе janet.services.apm.impl.core.TraceInfoCollectorJob. В цикле извлекает элементы из очереди и передаёт их трассировщику.

Трассировщик - внутренняя служба модуля. Реализована в пакете janet.services.apm.impl. Содержит набор методов для сохранения и извлечения данных об измерениях. Для корректной работы службы необходимо сконфигурировать её backend.

Замечание: методы для извлечения данных доступны только при использовании janet.services.apm.impl.tracer.backend.DbBackend

Backend трассировщика - реализован в пакете janet.services.apm.impl.tracer.backend. Позволяет сохранять полученные измерения в одном из трех видов:
  • вывод поступающих данных на консоль (janet.services.apm.impl.tracer.backend.ConsoleBackend)
  • сохранение поступающих данных в файл (janet.services.apm.impl.tracer.backend.LogFileBackend)
  • сохранение поступающих данных в базу данных (janet.services.apm.impl.tracer.backend.DbBackend)

Конфигурирование очереди, коллектора и трассировщика

Размер очереди по умолчанию принимается равным 1000 экземплярам класса janet.services.apm.impl.core.TraceRecord. При необходимости размер очереди можно изменять в конфигурационном файле iJaNet-модуля jws-module.xml. Для этого в секции <module-properties> необходимо добавить следующий параметр

<param name="janet.apm.max_queue_size" type="int">[desired value]</param>

Настройка коллектора измерений производится внутри секции <scheduled-jobs>. Для этого внутри секции создается подсекция <job> следующего вида

<job start-delay="10000" interval="20000">
    <job-class>janet.services.apm.impl.core.TraceInfoCollectorJob</job-class>
    <parameters>
        <param name="janet.apm.tracer_service_name" type="string">apm</param>
    </parameters>
</job>

Атрибуты start-delay и interval имеют то же значение, что и для обычной работы по расписанию. <job-class> должен содержать ссылку на реализацию коллектора janet.services.apm.impl.core.TraceInfoCollectorJob. Единственный параметр janet.apm.tracer_service_name содержит название службы-трассировщика, которое было задано при конфигурации службы-трассировщика.

Трассировщик описывается в секции <local-services> в отдельном подразделе <service>. Пример конфигурации трассировщика приведён ниже:

<service name="apm" publish="true">
    <factory-class>jws.core.services.GenericServiceFactory</factory-class>
    <service-interface>janet.services.apm.ITracerService</service-interface>
    <parameters>
        <param name="impl.class" type="string">janet.services.apm.impl.TracerServiceImpl</param>
        <param name="backend" type="janet.services.apm.impl.conf.TracerServiceBackendConf">
            <backend-class>janet.services.apm.impl.tracer.backend.ConsoleBackend</backend-class>
        </param>
    </parameters>
</service>

В атрибуте name задаётся имя службы-трассировщика. В подсекциях <factory-class> и <service-interface> задаётся имя класса используемого для управления экземплярами службы и класса определяющего интерфейс службы jws.core.services.GenericServiceFactory и janet.services.apm.ITracerService соответственно. В параметре impl.class задаётся имя класса реализующего интерфейс службы janet.services.apm.impl.TracerServiceImpl. В параметре backend конфигурируется backend трассировщика.

Класс, реализующий backend трассировщика задаётся в подсекции <backend-class>, которая может принимать одно из следующих значений:
  • janet.services.apm.impl.tracer.backend.ConsoleBackend
  • janet.services.apm.impl.tracer.backend.FileBackend
  • janet.services.apm.impl.tracer.backend.DbBackend

В первых двух случаях данные об измерениях сохраняются в системную консоль или лог-файл. В последнем случае сохранение производится в БД, для чего необходимо сконфигурировать источник данных и параметры таблицы. Пример кофигурации приведён ниже:

<param name="backend" type="janet.services.apm.impl.conf.TracerServiceBackendConf">
    <backend-class>janet.services.apm.impl.tracer.backend.DbBackend</backend-class>
    <parameters>
        <param name="datasource" type="jws.services.common.DirectDataSourceConf">
            <driver-class>org.firebirdsql.jdbc.FBDriver</driver-class>
            <connection-url>jdbc:firebirdsql:localhost:janet</connection-url>
            <driver-parameters>
                <param name="user" type="string">SYSDBA</param>
                <param name="password" type="string">masterkey</param>
            </driver-parameters>
        </param>
        <param name="backend.db.tableName" type="string">APM_TRACER_MEASUREMENTS</param>
    </parameters>
</param>

Источник данных задаётся в параметре datasource. Работа с источниками данных подробно рассмотрена в Платформа iJaNet V5. Общее описание. В параметре backend.db.tableName задаётся название для таблицы СУБД в которую будут сохраняться данные произведенных измерений. Значение параметра должно совпадать с названием предварительно созданной таблицы в БД. Скрипт для создания таблицы с именем APM_TRACER_MEASUREMENTS приведен ниже:

CREATE TABLE APM_TRACER_MEASUREMENTS (
  SERVICE_NAME VARCHAR(256),
  FILTER_ID VARCHAR(256),
  START_TIME BIGINT,
  FINISH_TIME BIGINT
);

Полезные ссылки

Мониторинг работы Java-приложений: Часть 1. Мониторинг производительности и степени готовности Java-систем

улучшение_9_рис.xls (25 KB) Виталий Шакуров, 04/29/2010 08:14 pm

улучшение_9_рис2.vsd (23 KB) Виталий Шакуров, 04/29/2010 08:14 pm

улучшение_9_рис2.png (11 KB) Виталий Шакуров, 04/29/2010 08:14 pm

улучшение_9_рис.PNG (17.4 KB) Виталий Шакуров, 04/29/2010 08:14 pm

Also available in: HTML TXT