Статистика производительности (Performance statistics)#

DataGrid включает в себя встроенный инструмент профилирования кластера. Работа с инструментом состоит из двух этапов:

  1. Сбор статистики на кластере.

  2. Создание отчета о производительности.

Сбор статистики производительности#

Для управления сбором статистики производительности используются:

  1. Интерфейс JMX:

    Метод

    Описание

    start()

    Начать сбор статистики по кластеру

    stop()

    Остановить сбор статистики по кластеру

    rotate()

    Произвести ротацию файлов статистики в кластере

    started()

    true, если сбор статистики начат

  2. Утилита control:

    Синтаксис команды:

    control.sh|bat --performance-statistics [start|stop|rotate|status]
    

    где:

    • start — начать сбор статистики по кластеру;

    • stop — остановить сбор статистики по кластеру;

    • rotate — произвести ротацию файлов статистики в кластере;

    • status — получить статус сбора статистики по кластеру.

Каждый узел собирает статистику производительности в бинарный файл. Этот файл размещается в рабочей директории DataGrid в каталоге {WORK_DIR}/perf_stat. Обычные события производительности записываются в node-{nodeId}.prf. Если файл с таким именем уже существует, к нему добавляется индекс: node-{nodeId}-{index}.prf.

Когда запускается сбор статистики, каждый узел также делает запись системных представлений в файл node-{nodeId}-system-views.prf. Если файл с таким именем уже существует, к нему добавляется индекс: node-{nodeId}-system-views-{index}.prf. Операция rotate применяется только к файлам обычных событий производительности. Подробнее о системных представлениях написано в разделе «Мониторинг».

Внимание

Файлы статистики производительности могут содержать конфиденциальную информацию, например: тексты запросов, имена кешей, названия задач, атрибуты узлов и значения, которые предоставляются системными представлениями. Храните и передавайте эти файлы в соответствии с политиками безопасности.

Файлы статистики производительности используются для создания отчета в режиме офлайн.

Для обычных событий производительности узлы используют циклический off-heap-буфер для временного хранения сериализованной статистики. Записывающий поток отправляет содержимое буфера в файл при достижении порога. Если буфер переполняется из-за медленного диска, некоторые показатели в статистике пропускаются. Подробнее о настройке написано ниже в разделе «Системные свойства».

Каждый процесс сбора статистики создает на узлах новые файлы. У каждого следующего файла будет такое же имя, как у предыдущего, но с соответствующим индексом. Например:

  • node-faedc6c9-3542-4610-ae10-4ff7e0600000.prf;

  • node-faedc6c9-3542-4610-ae10-4ff7e0600000-1.prf;

  • node-faedc6c9-3542-4610-ae10-4ff7e0600000-2.prf;

  • node-faedc6c9-3542-4610-ae10-4ff7e0600000-system-views.prf;

  • node-faedc6c9-3542-4610-ae10-4ff7e0600000-system-views-1.prf.

Создание отчета#

Расширение performance-statistics-ext позволяет генерировать офлайн-отчет в HTML-формате из файлов статистики производительности. Расширение находится в директории utils.

Для создания отчета:

  1. Остановите сбор статистики и поместите файлы со всех узлов в пустой каталог. Например:

    /path_to_files/
        ├── node-162c7147-fef8-4ea2-bd25-8653c41fc7fa.prf
        ├── node-162c7147-fef8-4ea2-bd25-8653c41fc7fa-system-views.prf
        ├── node-7b8a7c5c-f3b7-46c3-90da-e66103c00001.prf
        ├── node-7b8a7c5c-f3b7-46c3-90da-e66103c00001-system-views.prf
        ├── node-faedc6c9-3542-4610-ae10-4ff7e0600000.prf
        └── node-faedc6c9-3542-4610-ae10-4ff7e0600000-system-views.prf
    

    Файлы node-*-system-views*.prf хранятся рядом с обычными файлами статистики производительности. Если файлы системных представлений слишком велики для генерации отчета, их можно не включать в каталог — в этом случае отчет сгенерируется без раздела System views.

  2. Запустите скрипт из поставки:

    performance-statistics-tool/build-report.sh path_to_files
    

Отчет о производительности создается в новом каталоге по пути файлов статистики производительности:

path_to_files/report_yyyy-MM-dd_HH-mm-ss/

Для просмотра отчета откройте в браузере страницу report_yyyy-MM-dd_HH-mm-ss/index.html.

Также можно вывести все записи статистики производительности в консоль или файл с помощью скрипта print-statistics.sh из пакета performance-statistics-ext. Например, можно вывести записи о времени выполнения создания контрольных точек и записи о троттлинге страниц:

performance-statistics-tool/print-statistics.sh path_to_files --ops CHECKPOINT,PAGES_WRITE_THROTTLE

Чтобы записать результат выполнения команды в файл, используйте параметр --out:

performance-statistics-tool/print-statistics.sh path_to_files --ops CHECKPOINT,PAGES_WRITE_THROTTLE --out checkpoints.json

Какие данные собираются#

Статистика производительности включает в себя записи:

Категория

Запись

Операции с кешем

Операции кеш-API и CacheStore: get, put, remove, invoke, lock, массовые (bulk) операции, операции разрешения конфликтов (conflict operations), а также операции загрузки, записи и удаления CacheStore. Подробнее о CacheStore написано в разделе «Внешнее хранение» документа «Руководство прикладного разработчика»

Метаданные кеша

Записи о запуске кеша с идентификаторами и именами кешей

Транзакции

Записи об операциях commit и rollback транзакций с указанием затронутых идентификаторов кеша, времени начала и длительности

Запросы

Записи об SQL-запросах, scan-запросах и запросах по индексированным полям объектов с указанием текста запроса или деталей кеша/индекса, идентификатора запроса, времени начала, длительности и флага успешного выполнения

Детали запросов

Логические и физические операции чтения запроса, обработанные строки и пользовательские свойства запроса

Задачи и задания

Записи о вычислительных задачах и заданиях с указанием имен задач, идентификаторов сессий, времени выполнения, времени в очереди, аффинити-партиций и флага тайм-аута

Персистентность

Записи о времени выполнения создания контрольных точек и записи о троттлинге страниц

Системные представления

Схемы и строки системных представлений, которые были зафиксированы при запуске сбора статистики (некоторые представления пропускаются, подробнее об этом написано в списке ниже)

Системные представления, которые пропускаются из-за больших объемов данных или дублирования информации, собираемой в виде записей о производительности:

  • baseline.node.attributes;

  • node.attributes;

  • metrics;

  • caches;

  • sql.queries;

  • nodes;

  • cacheGroupPageLists;

  • dataRegionPageLists;

  • partitionStates;

  • statisticsPartitionData;

  • metastorage;

  • distributed.metastorage.

Пример разделов HTML-отчета#

В отчет входят разделы: Cluster info (информация о кластере), Cache operations (операции с кешем), Transactions (транзакции), SQL queries (SQL-запросы), Scan queries (scan-запросы), Index queries (запросы по индексированным полям объектов), Tasks and jobs (задачи и задания) и System views (системные представления). Если в исходной директории есть файлы node-*-system-views*.prf, раздел System views будет заполнен данными из этих файлов.

Cluster info (информация о кластере)#

В разделе отображаются топология кластера и кеши, которые были найдены в исходных файлах (таблицы Cluster nodes и Started caches):

Cluster info

Cache operations (операции с кешем)#

В разделе отображается активность кеша и CacheStore для выбранных кеша и узла. Селекторы кеша и узла являются фильтрами для всех диаграмм на странице.

Столбчатая диаграмма демонстрирует распределение количества операций с кешем по их типам:

Distribution of cache operations

Линейная диаграмма отображает количество операций во времени для каждого типа операции:

Cache operation count over time

В разделе Cache store operations содержатся аналогичные разбивки для вызовов CacheStore. Диаграмма распределения обобщает количество операций CacheStore по типам:

Distribution of cache store operations

Линейные диаграммы показывают количество операций CacheStore во времени:

Cache store operation count over time

Transactions (транзакции)#

В разделе отображается транзакционная активность для выбранных кеша и узла. Гистограмма показывает распределение транзакций по длительности:

Transactions histogram

Под гистограммой расположены линейные диаграммы, которые показывают количество операций commit и rollback во времени:

Transactions commit chart

SQL queries (SQL-запросы)#

В разделе указана сводная статистика SQL-запросов. В таблице Overall statistics отображаются общее количество выполнений, длительность и количество чтений для каждого запроса. В каждой строке можно развернуть подтаблицу Properties с планами фаз Map и Reduce и подтаблицу Rows с информацией о строках, полученных на узлах Mapper и Reducer:

SQL queries overall statistics

В таблице Top of slowest queries перечислены медленные выполнения запросов с аналогичными развертываемыми подтаблицами:

Top of slowest SQL queries

Scan queries (scan-запросы)#

В разделе указана сводная статистика scan-запросов по кешу и информация о самых медленных запросах (таблицы Overall statistics и Top of slowest queries):

Scan queries report

Index queries (запросы по индексированным полям объектов)#

В разделе указана сводная статистика запросов по индексированным полям объектов и информация о самых медленных из них (таблицы Overall statistics и Top of slowest queries):

Index queries report

Tasks and jobs (задачи и задания)#

В разделе указана сводная статистика выполнения задач. В таблице Overall statistics отображаются результаты выполнения, общая продолжительность и количество заданий для каждой задачи:

Tasks and jobs overall statistics

В таблице Top of slowest tasks перечислены медленно выполняемые задачи. В каждой строке можно развернуть подтаблицу Jobs с указанием продолжительности заданий для каждого узла:

Top of slowest tasks with jobs subtable

System views (системные представления)#

В разделе указаны строки из собранных системных представлений. На вкладке доступны селектор узла, селектор системного представления и таблица с возможностью поиска по страницам для выбранного представления:

System views report

Вывод статистики#

Скрипт предоставляет инструмент для вывода всех записей статистики производительности в консоль или в JSON-файл. Используйте этот инструмент для доступа к отдельным записям.

Для печати статистики запустите скрипт из релиз-пакета инструмента:

performance-statistics-tool/print-statistics.sh <path_to_files>

где path_to_files — путь к файлу статистики или к директории с несколькими файлами статистики.

Опции, которые поддерживает инструмент:

Опция

Описание

--out out_file

Добавляет результат выполнения команды в JSON-формате в указанный файл

--ops op_types

Выводит только указанные типы операций через запятую

--from start_time_from

Выводит только записи, время начала которых больше или равно указанному значению (Unix Epoch мс)

--to start_time_to

Выводит только записи, время начала которых меньше или равно указанному значению (Unix Epoch мс)

--caches cache_names

Выводит только записи, которые относятся к указанным через запятую именам кеша

Скрипт позволяет фильтровать операции по типу операции, времени или кешу. Для получения более подробной информации вызовите справку:

performance-statistics-tool/print-statistics.sh --help

Примеры команд:

performance-statistics-tool/print-statistics.sh path_to_files --ops QUERY,QUERY_ROWS,QUERY_PROPERTY
performance-statistics-tool/print-statistics.sh path_to_files --ops SYSTEM_VIEW_ROW
performance-statistics-tool/print-statistics.sh path_to_files --ops CHECKPOINT,PAGES_WRITE_THROTTLE
performance-statistics-tool/print-statistics.sh path_to_files --from 1713700000000 --to 1713703600000
performance-statistics-tool/print-statistics.sh path_to_files --caches cache1,cache2 --out perfstat.json

Пример вывода статистики в терминале:

{"op":"CACHE_GET","nodeId":"955130d1-5218-4e46-87f6-62755e92e9b4","cacheId":-1809642915,"startTime":1616837094237,"duration":64992213}
{"op":"CACHE_PUT","nodeId":"955130d1-5218-4e46-87f6-62755e92e9b4","cacheId":-1809642915,"startTime":1616837094237,"duration":879869}
{"op":"CACHE_GET_AND_PUT","nodeId":"955130d1-5218-4e46-87f6-62755e92e9b4","cacheId":1328364293,"startTime":1616837094248,"duration":17186240}
{"op":"TX_COMMIT","nodeId":"955130d1-5218-4e46-87f6-62755e92e9b4","cacheIds":[-1809642915],"startTime":1616837094172,"duration":184887787}
{"op":"QUERY","nodeId":"955130d1-5218-4e46-87f6-62755e92e9b4","type":"SQL_FIELDS","text":"create table Person (id int, val varchar, primary key (id))","id":0,"startTime":1616837094143,"duration":258741595,"success":true}

Системные свойства#

Свойство

Тип

Значение по умолчанию

Описание

IGNITE_PERF_STAT_FILE_MAX_SIZE

Long

32 ГБ

Максимальный размер файла статистики производительности в байтах. Сбор статистики производительности прекращается при превышении максимального размера файла

IGNITE_PERF_STAT_BUFFER_SIZE

Integer

32 МБ

Размер off-heap-буфера статистики производительности в байтах

IGNITE_PERF_STAT_FLUSH_SIZE

Integer

8 МБ

Минимальный размер пакета данных статистики производительности для отправления в файл в байтах

IGNITE_PERF_STAT_CACHED_STRINGS_THRESHOLD

Integer

10240

Порог закешированных строк статистики производительности. Кеширование строк прекращается при превышении порога

Настройки для аудита событий#

Для настройки аудита событий необходимо:

  1. Добавить RestProcessorPluginProvider в список плагинов.

  2. Включить события RestEventType.EVT_REST_REQ_SUCCEEDED и RestEventType.EVT_REST_REQ_FAILED в IgniteConfiguration.

    Пример
    XML#
    <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration" primary="true">
        ...
        <property name="pluginProviders">
            <list>
                ...
                <ref bean="restProcPlugin"/>
            </list>
        </property>
    
        <property name="includeEventTypes" ref="eventTypes"/>
        ...
        </bean>
    
    <bean id="restProcPlugin" class="com.sbt.security.ignite.core.rest.RestProcessorPluginProvider">
            <property name="configuration">
                <bean id="restProcPluginConfiguration" class="com.sbt.security.ignite.core.rest.RestProcessorPluginConfiguration"/>
            </property>
    </bean>
    
    <util:list id="eventTypes" value-type="java.lang.Integer">
        ...
        <util:constant static-field="com.sbt.security.ignite.core.events.RestEventType.EVT_REST_REQ_SUCCEEDED"/>
        <util:constant static-field="com.sbt.security.ignite.core.events.RestEventType.EVT_REST_REQ_FAILED"/>
        ...
    </util:list>