InfraGuard

Концепции настройки БД — блокировки, кэш, индексы, контрольная точка, память

Кратко излагает концепции производительности БД, которым обучают всплывающие подсказки при наведении на экране Сервисы ▸ База данных (7 причин ожидания блокировки строки, попадание в кэш буферного пула, использование индексов, давление контрольной точки/redo, сброс «грязных» страниц).

Обзор — что делает этот экран

Сервисы ▸ База данных напрямую подключается к зарегистрированным коллекторам БД (access=database) и показывает актуальные показатели нагрузки и структуры. Вместо простого перечисления чисел экран прикрепляет к каждому ключевому показателю (ожидание блокировки, коэффициент попаданий в кэш, использование индексов, контрольная точка, «грязные» страницы) специально спроектированную обучающую подсказку при наведении, чтобы вы узнали, «почему это значение плохое и как это исправить», прямо там, где вы его видите.

Эта статья кратко излагает концепции, которым учат такие подсказки. Полный словарь хранится в единственном месте — в самих подсказках (resources/lang/{ko,en}/dbmon.php, ключ edu), поэтому в реальной ситуации наведите указатель на показатель и прочитайте подробности, относящиеся к его контексту.

Экран — это монитор (что плохо прямо сейчас), подсказка — обучение причинам (почему и как), а фактический снимок конфигурации находится в параметрах экземпляра ([param] · nginx / my.cnf / sysctl). Читайте всё три вместе, чтобы пройти путь диагностика → доказательство → действие.

Когда использовать

Устройство экрана

Где прикрепляются обучающие подсказки:

Расположение Показатель Чему учит подсказка
Низ карточки справа · значок Cache Коэффициент попаданий в кэш (буферный пул) Формула расчёта + 4 способа его повысить
Низ карточки справа · значок Index Использование индексов Формула расчёта + 5 способов увеличить попадания по индексу
Нагрузка параллельности · lock Среднее ожидание блокировки строки (мс) 7 причин роста ожидания блокировки (по частоте)
Заголовок / подробности памяти · Checkpoint … % of redo Возраст контрольной точки Что означает давление на redo-лог и как читать его рост и спад
Подробности (сворачиваемые) · Управление памятью «Грязные» страницы · временной ряд контрольной точки Наложение порогов LWM/MAX + пометки эпизодов сброса

Сам корпус карточки обобщает две оси нагрузки:

Нижний блок анализа схемы (сворачиваемый) показывает общий объём, крупнейшие схемы, самые большие таблицы и состав движков (это не относится к концепциям настройки и берётся из information_schema).

Как пользоваться

  1. Найдите на карточке БД проблемный показатель (красный или жёлтый значок либо высокое значение).
  2. Наведите указатель на подпись или значок этого показателя, чтобы открыть контекстную подсказку — появятся причина, формула и порядок действий.
  3. Разверните Подробности, чтобы изучить временной ряд управления памятью с кривыми «грязных» страниц и контрольной точки и с линиями порогов.
  4. Примените на целевой БД тот рычаг конфигурации, на который указывает подсказка (например, innodb_buffer_pool_size, добавить индекс), либо сверьте его с текущим значением в параметрах экземпляра.

Ниже приведён сводный справочник по каждой концепции (эталоном служит сама подсказка).

Ожидание блокировки строки — 7 причин

Среднее время (мс), которое InnoDB ждал получения блокировки строки. Чем выше, тем сильнее конкуренция. По частоте:

# Причина Суть
1 Транзакции держат блокировки слишком долго После BEGIN … UPDATE … поздняя фиксация (внешний API, время раздумья пользователя, медленный запрос) выстраивает в очередь все транзакции, ожидающие эту строку. Самый частый случай.
2 Конкуренция за «горячую» строку Множество транзакций обновляют ОДНУ И ТУ ЖЕ строку (счётчик, остаток на складе, итоговая или сводная строка, последовательность) → работа сериализуется, ожидания накапливаются.
3 UPDATE/DELETE без индекса Если WHERE не может использовать индекс, InnoDB блокирует гораздо больше строк и диапазонов, чем нужно, → и блокирует посторонние транзакции. На практике это скрытая причина номер один.
4 Блокировки промежутков / next-key При REPEATABLE READ диапазонные блокировки захватывают и промежутки между строками, блокируя INSERT. Шаблон: диапазонный UPDATE + параллельный INSERT.
5 Крупные пакетные DML Один UPDATE/DELETE, затрагивающий десятки тысяч строк, надолго удерживает множество блокировок.
6 Медленный держатель блокировки Если удерживающий блокировку запрос медленный по вводу-выводу или по CPU, он дольше не отпускает блокировки — рост доли медленных запросов и рост ожиданий блокировки идут вместе.
7 Проверки внешних ключей Обновление таблицы со ссылкой по FK берёт разделяемые блокировки на родительских строках, что добавляет ожидания.

На этом экране причина № 3 (UPDATE без индекса) — скрытый главный источник всплесков ожидания блокировки. Читайте раздел TRANSACTIONS в SHOW ENGINE INNODB STATUS вместе с оценкой использования индексов.

Коэффициент попаданий в кэш (буферный пул InnoDB)

Высокий, когда большинство чтений обслуживается из памяти (буферного пула), а не с диска.

hit ratio = 1 − Δinnodb_buffer_pool_reads / Δinnodb_buffer_pool_read_requests
Оценка Порог
Отлично ≥ 99,5 %
Хорошо ≥ 98 %
Удовлетворительно ≥ 90 %

Как его повысить (кратко): увеличьте innodb_buffer_pool_size (эмпирическое правило — 50–75 % ОЗУ) · сократите полные сканирования, чтобы не засорять буферный пул · уменьшите рабочий набор (не выбирайте лишние столбцы, выносите крупные BLOB, архивируйте) · используйте innodb_buffer_pool_instances, чтобы снизить конкуренцию, и выгружайте/загружайте буферный пул при перезапуске.

Использование индексов

Доля чтений, нашедших строки по индексу, относительно чтений, дошедших сканированием до следующей строки.

index usage = Δhandler_read_key / (Δhandler_read_key + Δhandler_read_rnd_next)
Оценка Порог
Отлично ≥ 90 %
Хорошо ≥ 70 %
Удовлетворительно ≥ 40 %

Как его повысить (кратко): с помощью EXPLAIN найдите полные сканирования (type=ALL) и сортировки во временных файлах, затем проиндексируйте столбцы из WHERE/JOIN/ORDER BY · стройте составные индексы, ставя самый селективный столбец первым (правило левого префикса) · не отключайте индексы функциями и приведением типов на столбце (WHERE DATE(col)=… → используйте диапазон) · применяйте покрывающие индексы · удаляйте дублирующие и неиспользуемые индексы.

Возраст контрольной точки (давление на redo-лог)

Насколько redo-лог ушёл вперёд от последней контрольной точки (в байтах) = объём изменений, ещё не сброшенных в файлы данных, и объём работы, который InnoDB воспроизвёл бы после сбоя. Показатель % of redo в заголовке — это расстояние до обрыва, за которым начинается шторм сбросов.

Состояние % of redo Значение
Безопасно < 50 % Изменения сбрасываются вовремя
Наблюдать 50 – 75 % Запись опережает сброс; принудительный сброс приближается
Риск ≥ 75 % Близко к порогу асинхронного/синхронного сброса — принудительный сброс грозит задержками и штормами ввода-вывода

Как это читать: рост = запись > сброс (redo заполняется) · спад = сброс догнал (здоровое состояние) · пилообразная форма = накопление ↔ сброс, нормальный ритм. Вблизи 75 % стоит подумать об увеличении буферного пула или innodb_log_file_size.

Сброс «грязных» страниц (управление памятью)

Страницы буферного пула, изменённые, но ещё не записанные на диск. Подходящее значение задают собственные пороги сброса сервера (innodb_max_dirty_pages_pct = MAX, innodb_max_dirty_pages_pct_lwm = LWM). Мнение специалистов: «грязные» страницы должны колебаться ниже LWM.

Состояние Условие Значение
Здоровое (good) Колеблется ниже порога (здоровая пила) БД не страдает во время сбросов
Внимание (warn) Выше нижней отметки (зона перед сбросом) Следите за давлением записи и отставанием контрольной точки
Риск (crit) Достигнут порог MAX Агрессивный сброс → всплески задержек и штормы ввода-вывода (увеличьте буферный пул или redo-лог)

Временной ряд управления памятью накладывает линии порогов LWM/MAX поверх «грязных» страниц и отмечает эпизоды вытеснения и сброса. Показатели справа дополнительно выводят Pending writes и Row-lock avg.

Источники данных

Реальные счётчики и хранилище, на которые опираются обучающие концепции:

Концепция Исходный счётчик / состояние Примечание
Ожидание блокировки SHOW GLOBAL STATUS · information_schema.processlist Вычисляет очередь; требуется привилегия PROCESS
Коэффициент попаданий в кэш Innodb_buffer_pool_reads / _read_requests Разность между замерами
Использование индексов Handler_read_key / Handler_read_rnd_next Разность между замерами
Контрольная точка · «грязные» Состояние InnoDB (возраст контрольной точки · «грязные» страницы · ожидающие) Временной ряд управления памятью
QPS · медленные Questions · Slow_queries (накопительные) Разность → отсюда выводятся QPS и доля медленных

Пороги состояния карточки (degraded) (значения по умолчанию из OpsPolicy::dbThresholds() — настраиваются в разделе Операционная политика):

Условие Порог по умолчанию Метка причины
Насыщение соединений conn_pct ≥ 80 % насыщение соединений
threads_running ≥ 40 высокая параллельность
waiting (очередь) ≥ 5 очередь запросов
slow_qps ≥ 1/с доля медленных запросов

Права доступа

Устранение неполадок и FAQ

В. Backlog показывает «own connections only». Для подсчёта запросов в очереди по всему серверу учётной записи БД нужна привилегия PROCESS. Без неё считаются только ваши собственные соединения. См. sql/infr_db_monitor_grant.sql (рекомендуется отдельная учётная запись для мониторинга).

В. Оценки кэша или индексов пусты (N/A). Производные показатели вычисляются как разность между двумя замерами. Если коллектор только что запущен или счётчики сброшены (после перезапуска), первый замер не даёт оценки — дождитесь следующего цикла.

В. Карточка показывает stale (нет свежего замера). В режиме economy сбор пропускается, когда в консоли нет ни одного пользователя. При входе ensureFresh(45s) делает немедленный замер, но если планировщик отстаёт, карточка может ненадолго понизиться до pending. Для постоянного сбора установите режим сбора БД в значение always в разделе Операционная политика.

В. Как перевести или отредактировать текст подсказок? Обучающий словарь находится в одном месте: ключ edu файла resources/lang/{ko,en}/dbmon.php (единственный источник). Остальные локали используют en как запасной вариант.

В. Как на деле сузить причину ожидания блокировки? На целевой БД изучите SHOW ENGINE INNODB STATUS (TRANSACTIONS · LATEST DETECTED DEADLOCK), а также information_schema.INNODB_TRX / data_locks, и сверьте результат с приведённой выше таблицей из 7 причин.

Смежные темы

데이터베이스 화면의 원인 교육 팝오버
데이터베이스 화면의 원인 교육 팝오버