25.12.15.9 Таблицы сводки памяти
Модуль Performance Schema отслеживает использование памяти и агрегирует статистику использования памяти, подробности которой определяются следующими факторами:
Тип используемой памяти (различные кэши, внутренние буферы и так далее)
Поток, учётная запись, пользователь, хост, косвенно выполняющие операцию с памятью
Модуль Performance Schema отслеживает следующие аспекты использования памяти:
Объёмы используемой памяти
Количество операций
Минимальные и максимальные значения
Объёмы памяти помогают понять или настроить потребление памяти сервером.
Количество операций помогает понять или настроить общую нагрузку, которую сервер оказывает на выделение памяти, что влияет на производительность. Выделение одного байта миллион раз не эквивалентно выделению миллиона байт один раз; отслеживание как объёмов, так и количества операций позволяет выявить разницу.
Минимальные и максимальные значения имеют решающее значение для обнаружения пиков рабочей нагрузки, общей стабильности рабочей нагрузки и возможных утечек памяти.
Таблицы сводки памяти не содержат информации о времени, поскольку события памяти не отслеживаются по времени.
Подробности о сборе данных об использовании памяти см. в разделе Поведение инструментации памяти.
Пример сводной информации о событиях памяти:
mysql> SELECT *
FROM performance_schema.memory_summary_global_by_event_name
WHERE EVENT_NAME = 'memory/sql/TABLE'\G
*************************** 1. row ***************************
EVENT_NAME: memory/sql/TABLE
COUNT_ALLOC: 1381
COUNT_FREE: 924
SUM_NUMBER_OF_BYTES_ALLOC: 2059873
SUM_NUMBER_OF_BYTES_FREE: 1407432
LOW_COUNT_USED: 0
CURRENT_COUNT_USED: 457
HIGH_COUNT_USED: 461
LOW_NUMBER_OF_BYTES_USED: 0
CURRENT_NUMBER_OF_BYTES_USED: 652441
HIGH_NUMBER_OF_BYTES_USED: 669269
Каждая таблица сводки памяти имеет одну или несколько группирующих колонок, указывающих, как таблица агрегирует события. Имена событий относятся к именам инструментов событий в таблице setup_instruments:
memory_summary_by_account_by_event_nameсодержит колонкиUSER,HOSTиEVENT_NAME. Каждая строка суммирует события для заданной учётной записи (комбинации пользователя и хоста) и имени события.memory_summary_by_host_by_event_nameсодержит колонкиHOSTиEVENT_NAME. Каждая строка суммирует события для заданного хоста и имени события.memory_summary_by_thread_by_event_nameсодержит колонкиTHREAD_IDиEVENT_NAME. Каждая строка суммирует события для заданного потока и имени события.memory_summary_by_user_by_event_nameсодержит колонкиUSERиEVENT_NAME. Каждая строка суммирует события для заданного пользователя и имени события.memory_summary_global_by_event_nameсодержит колонкуEVENT_NAME. Каждая строка суммирует события для заданного имени события.
Каждая таблица сводки памяти имеет следующие колонки со значениями агрегированных данных:
-
COUNT_ALLOC,COUNT_FREEАгрегированное количество вызовов функций выделения и освобождения памяти.
-
SUM_NUMBER_OF_BYTES_ALLOC,SUM_NUMBER_OF_BYTES_FREEАгрегированные размеры выделенных и освобождённых блоков памяти.
-
CURRENT_COUNT_USEDАгрегированное количество блоков памяти, которые были выделены, но не освобождены. Это колонка для удобства, равная
COUNT_ALLOC−COUNT_FREE. -
CURRENT_NUMBER_OF_BYTES_USEDАгрегированный размер блоков памяти, которые были выделены, но не освобождены. Это колонка для удобства, равная
SUM_NUMBER_OF_BYTES_ALLOC−SUM_NUMBER_OF_BYTES_FREE. -
LOW_COUNT_USED,HIGH_COUNT_USEDМинимальные и максимальные значения, соответствующие колонке
CURRENT_COUNT_USED. -
LOW_NUMBER_OF_BYTES_USED,HIGH_NUMBER_OF_BYTES_USEDМинимальные и максимальные значения, соответствующие колонке
CURRENT_NUMBER_OF_BYTES_USED.
Разрешено использование TRUNCATE TABLE для таблиц сводки памяти. Это оказывает следующие эффекты:
В общем случае, усечение сбрасывает базовый уровень для статистики, но не изменяет состояние сервера. То есть, усечение таблицы памяти не освобождает память.
COUNT_ALLOCиCOUNT_FREEсбрасываются до нового базового уровня, уменьшая каждый счётчик на одно и то же значение.Аналогично,
SUM_NUMBER_OF_BYTES_ALLOCиSUM_NUMBER_OF_BYTES_FREEсбрасываются до нового базового уровня.LOW_COUNT_USEDиHIGH_COUNT_USEDсбрасываются до значенияCURRENT_COUNT_USED.LOW_NUMBER_OF_BYTES_USEDиHIGH_NUMBER_OF_BYTES_USEDсбрасываются до значенияCURRENT_NUMBER_OF_BYTES_USED.
Кроме того, каждая таблица сводки памяти, которая агрегируется по учётной записи, хосту, пользователю или потоку, неявно усекается при усечении таблицы подключений, от которой она зависит, или усечении таблицы memory_summary_global_by_event_name. Подробности см. в разделе Раздел 25.12.8, «Таблицы подключений Performance Schema».
Поведение инструментирования памяти
Инструменты памяти перечислены в таблице setup_instruments и имеют имена вида memory/. Большинство инструментов инструментирования памяти по умолчанию отключены. code_area/instrument_name
Инструменты с префиксом memory/performance_schema/ показывают, сколько памяти выделено для внутренних буферов в самом Performance Schema. Инструменты memory/performance_schema/ встроенные, всегда включены и не могут быть отключены при запуске сервера или во время работы. Встроенные инструменты памяти отображаются только в таблице memory_summary_global_by_event_name.
Для управления состоянием инструментирования памяти при запуске сервера используйте строки в вашем файле my.cnf:
-
Включить:
[mysqld] performance-schema-instrument='memory/%=ON'
-
Отключить:
[mysqld] performance-schema-instrument='memory/%=OFF'
Для управления состоянием инструментирования памяти во время работы обновите столбец ENABLED соответствующих инструментов в таблице setup_instruments:
-
Включить:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'memory/%';
-
Отключить:
UPDATE performance_schema.setup_instruments SET ENABLED = 'NO' WHERE NAME LIKE 'memory/%';
Для инструментов памяти столбец TIMED в setup_instruments игнорируется, так как операции с памятью не измеряются по времени.
Когда поток в сервере выполняет операцию выделения памяти, которая была инструментирована, применяются следующие правила:
Если поток не инструментирован или инструмент памяти не включен, то выделенный блок памяти не инструментируется.
В противном случае (то есть, если и поток, и инструмент включены), выделенный блок памяти инструментируется.
Для освобождения памяти применяются следующие правила:
Если операция выделения памяти была инструментирована, соответствующая операция освобождения памяти инструментируется, независимо от текущего состояния включения инструмента или потока.
Если операция выделения памяти не была инструментирована, соответствующая операция освобождения памяти не инструментируется, независимо от текущего состояния включения инструмента или потока.
Для статистики по потокам применяются следующие правила.
Когда выделен инструментированный блок памяти размером N, Performance Schema вносит эти изменения в столбцы таблицы сводки памяти:
COUNT_ALLOC: Увеличено на 1CURRENT_COUNT_USED: Увеличено на 1HIGH_COUNT_USED: Увеличено, еслиCURRENT_COUNT_USED— новый максимумSUM_NUMBER_OF_BYTES_ALLOC: Увеличено наNCURRENT_NUMBER_OF_BYTES_USED: Увеличено наNHIGH_NUMBER_OF_BYTES_USED: Увеличено, еслиCURRENT_NUMBER_OF_BYTES_USED— новый максимум
При освобождении инструментированного блока памяти Performance Schema вносит эти изменения в столбцы таблицы сводки памяти:
COUNT_FREE: Увеличено на 1CURRENT_COUNT_USED: Уменьшено на 1LOW_COUNT_USED: Уменьшено, еслиCURRENT_COUNT_USED— новый минимумSUM_NUMBER_OF_BYTES_FREE: Увеличено наNCURRENT_NUMBER_OF_BYTES_USED: Уменьшено наNLOW_NUMBER_OF_BYTES_USED: Уменьшено, еслиCURRENT_NUMBER_OF_BYTES_USED— новый минимум
Для агрегатов более высокого уровня (глобальные, по аккаунту, по пользователю, по хосту) применяются те же правила, что и для минимальных и максимальных значений.
LOW_COUNT_USEDиLOW_NUMBER_OF_BYTES_USED— это более низкие оценки. Значение, сообщаемое Performance Schema, гарантированно меньше или равно минимальному количеству или размеру фактически используемой в процессе работы памяти.HIGH_COUNT_USEDиHIGH_NUMBER_OF_BYTES_USED— это более высокие оценки. Значение, сообщаемое Performance Schema, гарантированно больше или равно максимальному количеству или размеру фактически используемой в процессе работы памяти.
Для нижних оценок в сводных таблицах, отличных от memory_summary_global_by_event_name, значения могут стать отрицательными, если владение памятью передается между потоками.
Вот пример вычисления оценки; обратите внимание, что реализация оценки может быть изменена:
Поток 1 использует память в диапазоне от 1 МБ до 2 МБ во время выполнения, как сообщается в столбцах LOW_NUMBER_OF_BYTES_USED и HIGH_NUMBER_OF_BYTES_USED таблицы memory_summary_by_thread_by_event_name.
Поток 2 использует память в диапазоне от 10 МБ до 12 МБ во время выполнения, так же, как и в первом случае.
Когда эти два потока принадлежат одному и тому же аккаунту, оценки по аккаунту предполагают, что этот аккаунт использовал память в диапазоне от 11 МБ до 14 МБ. То есть, LOW_NUMBER_OF_BYTES_USED для агрегата более высокого уровня — это сумма каждого LOW_NUMBER_OF_BYTES_USED (при условии худшего случая). Аналогично, HIGH_NUMBER_OF_BYTES_USED для агрегата более высокого уровня — это сумма каждого HIGH_NUMBER_OF_BYTES_USED (при условии худшего случая).
11 МБ — это нижняя оценка, которая может произойти только если оба потока достигли минимального значения использования памяти одновременно.
14 МБ — это верхняя оценка, которая может произойти только если оба потока достигли максимального значения использования памяти одновременно.
Фактическое использование памяти для этого аккаунта могло находиться в диапазоне от 11,5 МБ до 13,5 МБ.
Для планирования ресурсов на самом деле желательно отслеживать худший случай, поскольку это показывает, что потенциально может произойти, когда сеансы не коррелированы, что обычно и происходит.
© 2025 Oracle
Licensed under the GPLv2 License.