SlideShare a Scribd company logo
Механизмы
мониторинга
баз данных:
взгляд изнутри
Дмитрий Еманов
Firebird Project
Чего не будет в этом докладе

Как использовать top / iostat / perf / etc

Сравнения Zabbix / Cacti / Graphite / whatever

Красивых графиков с визуализацией ахтунгов в
продакшне с разных ракурсов

Нюансов интеграции с StatsD, CollectD или PerfMon
О чем будем говорить

Какая информация нужна DBA/DevOps от СУБД

Какими способами СУБД может ее предоставить

Какие тут присутствуют подводные камни

Немного поговорим про метрики

Поглядим на MySQL, PostgreSQL, Firebird

Байки из жизни: собственный опыт
Что имеет смысл мониторить

Доступность и целостность

Кто и что делает

Качественные и количественные данные

Пиковые и предельные ситуации

Системные и прикладные ошибки
Доступность и целостность

Доступность — извне, на разных уровнях

Целостность — изнутри

Критические ошибки в логах СУБД

Опционально: контрольные суммы

Возможность онлайн-валидации физической структуры
Кто и что делает

Активность (а также псевдо-активность) юзеров

Привязка к коннектам, транзакциям, SQL-запросам

Идентификация клиентов

Привязка к процессам / потокам ОС

Фоновые задачи СУБД
Идентификация клиентов

С какого хоста пришел запрос:
host/IP, MAC, протокол

С какого приложения пришел запрос:
port, PID, pathname, tag

Каким API пользовался клиент:
версия клиентской либы, версия протокола
Какая информация бывает
Executor Statistics
manager
Log manager
Рантайм-
статистика
Журналы
Какая информация бывает

Снэпшот — что происходит прямо сейчас
(на момент обращения), текущие значения метрик,
иногда пиковые значения метрик

История — полная или частичная хронология
событий мониторинга
Какая информация бывает

Снэпшот — требует периодического опроса;
может пропускать события; высокочастотный опрос
может сильно нагружать СУБД

История — при злоупотреблении нагружает СУБД;
быстро забивает дисковое пространство;
надо четко понимать, что именно хотим знать
Какая информация бывает

Штатные логи СУБД — история

Специальные утилиты — обычно снэпшот

SQL интерфейс — снэпшот

Через штатный API — снэпшот

Через низкоуровневую интеграцию (плагины) —
возможны варианты
Метрики

Обычно это текущие значения счетчиков

С одной стороны, считать надо много событий

Лучше перебдеть, чем недобдеть (с)

Но их детализация может стоить недешево
Детализация метрик

Только для сессии?
Или еще и для каждой транзакции?
Или еще и для каждого запроса?
А может, еще ниже уровнем?
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird Project)
Пытаемся считать на разных уровнях

Вот так — очень быстро
session→stats→record_backouts++;

Вот так — не очень быстро
query→stats→record_backouts++;
query→txn→stats→record_backouts++;
query→txn→session→stats→record_backouts++;
query→txn→session→db→stats→record_backouts++;
Пытаемся считать на разных уровнях

Но некоторые уровни могут и отсутствовать,
это надо проверять!

Вот так — совсем тормоза :-(
if (object)
object→stats→record_backouts++;
// и еще три раза
Как мы выкручиваемся
// Thread specific context data
struct Context : public ThreadData
{
Database* database;
Attachment* attachment;
Transaction* transaction;
Request* request;
RuntimeStatistics *reqStat, *traStat, *attStat, *dbbStat;
}
Как мы выкручиваемся
explicit Context(ISC_STATUS* status)
: ThreadData(ThreadData::tddDBB),
database(NULL), attachment(NULL),
transaction(NULL), request(NULL)
{
reqStat = traStat = attStat = dbbStat =
RuntimeStatistics::getDummy();
}
Как мы выкручиваемся
void setAttachment(Attachment* val)
{
attachment = val;
attStat = val ? &val->att_stats : RuntimeStatistics::getDummy();
}
void bumpStats(const RuntimeStatistics::StatType index)
{
reqStat->bumpValue(index);
traStat->bumpValue(index);
attStat->bumpValue(index);
dbbStat->bumpValue(index);
}
Детализация метрик

Глобальные счетчики — это просто, но неинтересно

Кое-что надо бы потаблично
Еще для индексов
А если помечтать, то...
… и тут Остапа понесло (с)
Детализация метрик

Счетчик надо сначала найти!

Хэш-таблица?
Сортированный массив?
Или, может, бинарное дерево?

Это все временные затраты, их надо оценивать
Детализация метрик
#if defined(REL_COUNTS_TREE)
typedef Firebird::BePlusTree<RelationCounts, ULONG,
Firebird::MemoryPool, RelationCounts> RelCounters;
#elif defined(REL_COUNTS_PTR)
typedef Firebird::PointersArray<RelationCounts,
Firebird::EmptyStorage<RelationCounts>,
ULONG, RelationCounts> RelCounters;
#else // sorted array
typedef Firebird::SortedArray<RelationCounts,
Firebird::EmptyStorage<RelationCounts>,
ULONG, RelationCounts> RelCounters;
#endif
Мониторинг ожиданий

I/O, блокировки разных видов

Кто, кого и на чем ждет

Интересен также контекст

Графы ожиданий, дэдлоки
Мониторинг ожиданий

I/O, блокировки разных видов

Кто, кого и на чем ждет

Интересен также контекст

Графы ожиданий, дэдлоки

Но самое интересное — время ожидания

Однако, тут могут быть сюрпризы!
Метрики: советы

Больше метрик, хороших и разных

Детализация стоит дорого, трижды подумайте над
реализацией (и надо ли оно вам вообще)

Если накладные расходы велики —
можно использовать отложенную запись

Самую тяжелую статистику имеет смысл
делать опциональной
Как выдавать данные наружу

Регулярно обновлять состояние и счетчики
в общей памяти — накладные расходы,
зато возможен высокочастотный мониторинг

Предоставлять состояние по запросу, метрики считать
локально и предоставлять также по запросу —
снэпшот слегка отстает, больше задержки при запросах
к мониторингу
Снэпшот-мониторинг в MySQL

performance_schema

Не такой уж и снэпшот

Можно включать/выключать (требуется перезапуск)

Настраивать можно «на лету»

Помимо счетчиков содержит также *_summary
Снэпшот-мониторинг в PostgreSQL

Statistics collector

Включать/выключать можно «на лету», по группам

Динамические представления pg_stat_* и pg_locks

Обновляется периодически

Снэпшот на время жизни транзакции
Наш опыт: снэпшот-мониторинг в Firebird

Виртуальные таблицы мониторинга

Метрики (локально) считаем всегда,
время замеряем опционально

Информация собирается по запросу

Снэпшот на время жизни транзакции
Наш опыт: снэпшот-мониторинг в Firebird

MON$DATABASE

MON$ATTACHMENTS

MON$TRANSACTIONS

MON$STATEMENTS

MON$CALL_STACK
+

MON$*_STATS

MON$*_USAGE
Наш опыт: снэпшот-мониторинг в Firebird

MON$DATABASE

MON$ATTACHMENTS

MON$TRANSACTIONS

MON$STATEMENTS

MON$CALL_STACK
+

MON$*_STATS

MON$*_USAGE
Считаются для каждого
объекта выше
Наш опыт: снэпшот-мониторинг в Firebird

MON$DATABASE

MON$ATTACHMENTS

MON$TRANSACTIONS

MON$STATEMENTS

MON$CALL_STACK
+

MON$*_STATS

MON$*_USAGE
Считаются для каждого
объекта выше
Агрегируются
снизу вверх
Логирование

Критические ошибки

Алерты — логические ошибки и пиковые ситуации
(медленные запросы, временные файлы)

Интерактивная трассировка

Аудит — постоянное логирование
Логирование в MySQL

Error log

General query log

Slow query log

Audit API + плагины
Логирование в PostgreSQL

Разные варианты — stderr / syslog / eventlog / файл

Есть функционал slow query log — через
log_min_duration_statement

Кастомизация логируемых запросов, умеет писать
долгие блокировки, временные файлы и т.п.

Динамическая трассировка для DTrace / SystemCap
(требует компиляции c --enable-dtrace)
Наш опыт: логирование в Firebird

Trace API + плагины

Системный аудит — управляется ядром, настраивается
конфигом, пишется в лог на диске (по умолчанию)
с ротацией (архивированием)

Пользовательская трассировка — управляется юзером
(start-pause-resume-stop), конфиг задается в рантайме,
лог пишется во временные файлы и удаляется по мере
вычитывания клиентом
Наш опыт: логирование в Firebird

Везде логируем ID объектов

Большинство событий спаренные — начало и конец

По завершении можем выдавать статистику — время
выполнения и детализированные метрики

Есть функционал slow query log — через time_threshold

Дополнительная кастомизация — через include/exclude
фильтры (regexp)
Наш опыт: логирование в Firebird
# трассируем медленные запросы
database = myslowdb
{
log_statement_finish = true
print_perf = true
time_threshold = 10000 # 10 seconds
}
# трассируем изменения метаданных
database = mycooldb
{
log_statement_start = true
include_filter = %(CREATE|ALTER|DROP)%
}
В реальной жизни надо сочетать

В логах — только алерты или подробно

От этого зависит частота снэпшот-мониторинга

Совсем интересно становится,
если их можно связать вместе
Вопросы?
dimitr@firebirdsql.org

More Related Content

PDF
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
PDF
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
PDF
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
PDF
Профилирование кода на C/C++ в *nix системах
PDF
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PDF
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
PDF
Call of Postgres: Advanced Operations (part 1)
PPTX
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Профилирование кода на C/C++ в *nix системах
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
Оптимизация high-contention write в PostgreSQL / Александр Коротков, Олег Бар...
Call of Postgres: Advanced Operations (part 1)
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...

What's hot (20)

PPTX
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
PDF
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
PDF
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
PDF
Streaming replication in practice
PPTX
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
PPTX
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
PDF
Anton Turetckii "What does it take to build a host?"
PDF
Максим Богук. Postgres-XC
PDF
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
PDF
PostgreSQL Streaming Replication
PDF
Реализация восстановления после аварий / Сергей Бурладян (Avito)
PDF
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
PDF
Современная операционная система: что надо знать разработчику / Александр Кри...
PDF
Хранение данных на виниле / Константин Осипов (tarantool.org)
PPTX
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
PDF
Twisted Framework - сетевые приложения в Python
PDF
Использование очередей асинхронных сообщений с PostgreSQL (Илья Космодемьянский)
PDF
Консольные приложения на Go
PDF
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
PPTX
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
libfpta — обгоняя SQLite и Tarantool / Леонид Юрьев (Positive Technologies)
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Streaming replication in practice
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Anton Turetckii "What does it take to build a host?"
Максим Богук. Postgres-XC
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
PostgreSQL Streaming Replication
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Современная операционная система: что надо знать разработчику / Александр Кри...
Хранение данных на виниле / Константин Осипов (tarantool.org)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Twisted Framework - сетевые приложения в Python
Использование очередей асинхронных сообщений с PostgreSQL (Илья Космодемьянский)
Консольные приложения на Go
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Основные кейсы использования in-memory СУБД на примере Тарантула и проектов M...
Ad

Similar to Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird Project) (20)

ODP
SECON'2016. Сигаев Федор, Pg в кластере. Скандалы, интриги, расследования
PDF
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
PDF
Hacking PostgreSQL. Разделяемая память и блокировки.
PPTX
Диагностика postgresql для системного администратора
PDF
Как мы строили аналитическую платформу на несколько миллиардов событии в меся...
PDF
Всеволод Поляков "История одного мониторинга"
PPTX
pgconf.ru 2017
PPT
Cистема внутренней статистики Odnoklassniki.ru
PDF
Как мы строили аналитическую платформу на несколько миллиардов событии в месяц
PDF
Coub - как мы строили аналитическую платформу на несколько миллиардов событий...
PDF
Не все базы данных одинаково полезны
PDF
Выступление Сергея Аверина, Badoo, на High Performance Conference
PDF
Не все базы данных одинаково полезны
PPTX
Open source субд глазами обычного программиста
PPT
Как устроен NoSQL, Андрей Аксенов (Sphinx)
PPT
А. Аксенов "Как устроен NoSql", DUMP-2014
PDF
Михаил Табунов, Аналитическая платформа на несколько миллиардов событий в месяц
PDF
SQL vs NoSQL: 
проблема выбора
PDF
Tk conf daniel-podolsky-sqlvsnosql
PPT
Алексей Чумаков. Apache Cassandra на реальном проекте
SECON'2016. Сигаев Федор, Pg в кластере. Скандалы, интриги, расследования
"Мы два месяца долбались, а потом построили индекс" (c) Аксенов
Hacking PostgreSQL. Разделяемая память и блокировки.
Диагностика postgresql для системного администратора
Как мы строили аналитическую платформу на несколько миллиардов событии в меся...
Всеволод Поляков "История одного мониторинга"
pgconf.ru 2017
Cистема внутренней статистики Odnoklassniki.ru
Как мы строили аналитическую платформу на несколько миллиардов событии в месяц
Coub - как мы строили аналитическую платформу на несколько миллиардов событий...
Не все базы данных одинаково полезны
Выступление Сергея Аверина, Badoo, на High Performance Conference
Не все базы данных одинаково полезны
Open source субд глазами обычного программиста
Как устроен NoSQL, Андрей Аксенов (Sphinx)
А. Аксенов "Как устроен NoSql", DUMP-2014
Михаил Табунов, Аналитическая платформа на несколько миллиардов событий в месяц
SQL vs NoSQL: 
проблема выбора
Tk conf daniel-podolsky-sqlvsnosql
Алексей Чумаков. Apache Cassandra на реальном проекте
Ad

More from Ontico (20)

PDF
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
PDF
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
PDF
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
PDF
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PDF
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
PPTX
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
PPTX
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
PDF
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
PPTX
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
PPTX
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
PDF
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
PPT
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
PPTX
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
PPTX
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
PPTX
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
PPTX
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
PDF
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
PPTX
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)

Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird Project)

  • 2. Чего не будет в этом докладе  Как использовать top / iostat / perf / etc  Сравнения Zabbix / Cacti / Graphite / whatever  Красивых графиков с визуализацией ахтунгов в продакшне с разных ракурсов  Нюансов интеграции с StatsD, CollectD или PerfMon
  • 3. О чем будем говорить  Какая информация нужна DBA/DevOps от СУБД  Какими способами СУБД может ее предоставить  Какие тут присутствуют подводные камни  Немного поговорим про метрики  Поглядим на MySQL, PostgreSQL, Firebird  Байки из жизни: собственный опыт
  • 4. Что имеет смысл мониторить  Доступность и целостность  Кто и что делает  Качественные и количественные данные  Пиковые и предельные ситуации  Системные и прикладные ошибки
  • 5. Доступность и целостность  Доступность — извне, на разных уровнях  Целостность — изнутри  Критические ошибки в логах СУБД  Опционально: контрольные суммы  Возможность онлайн-валидации физической структуры
  • 6. Кто и что делает  Активность (а также псевдо-активность) юзеров  Привязка к коннектам, транзакциям, SQL-запросам  Идентификация клиентов  Привязка к процессам / потокам ОС  Фоновые задачи СУБД
  • 7. Идентификация клиентов  С какого хоста пришел запрос: host/IP, MAC, протокол  С какого приложения пришел запрос: port, PID, pathname, tag  Каким API пользовался клиент: версия клиентской либы, версия протокола
  • 8. Какая информация бывает Executor Statistics manager Log manager Рантайм- статистика Журналы
  • 9. Какая информация бывает  Снэпшот — что происходит прямо сейчас (на момент обращения), текущие значения метрик, иногда пиковые значения метрик  История — полная или частичная хронология событий мониторинга
  • 10. Какая информация бывает  Снэпшот — требует периодического опроса; может пропускать события; высокочастотный опрос может сильно нагружать СУБД  История — при злоупотреблении нагружает СУБД; быстро забивает дисковое пространство; надо четко понимать, что именно хотим знать
  • 11. Какая информация бывает  Штатные логи СУБД — история  Специальные утилиты — обычно снэпшот  SQL интерфейс — снэпшот  Через штатный API — снэпшот  Через низкоуровневую интеграцию (плагины) — возможны варианты
  • 12. Метрики  Обычно это текущие значения счетчиков  С одной стороны, считать надо много событий  Лучше перебдеть, чем недобдеть (с)  Но их детализация может стоить недешево
  • 13. Детализация метрик  Только для сессии? Или еще и для каждой транзакции? Или еще и для каждого запроса? А может, еще ниже уровнем?
  • 15. Пытаемся считать на разных уровнях  Вот так — очень быстро session→stats→record_backouts++;  Вот так — не очень быстро query→stats→record_backouts++; query→txn→stats→record_backouts++; query→txn→session→stats→record_backouts++; query→txn→session→db→stats→record_backouts++;
  • 16. Пытаемся считать на разных уровнях  Но некоторые уровни могут и отсутствовать, это надо проверять!  Вот так — совсем тормоза :-( if (object) object→stats→record_backouts++; // и еще три раза
  • 17. Как мы выкручиваемся // Thread specific context data struct Context : public ThreadData { Database* database; Attachment* attachment; Transaction* transaction; Request* request; RuntimeStatistics *reqStat, *traStat, *attStat, *dbbStat; }
  • 18. Как мы выкручиваемся explicit Context(ISC_STATUS* status) : ThreadData(ThreadData::tddDBB), database(NULL), attachment(NULL), transaction(NULL), request(NULL) { reqStat = traStat = attStat = dbbStat = RuntimeStatistics::getDummy(); }
  • 19. Как мы выкручиваемся void setAttachment(Attachment* val) { attachment = val; attStat = val ? &val->att_stats : RuntimeStatistics::getDummy(); } void bumpStats(const RuntimeStatistics::StatType index) { reqStat->bumpValue(index); traStat->bumpValue(index); attStat->bumpValue(index); dbbStat->bumpValue(index); }
  • 20. Детализация метрик  Глобальные счетчики — это просто, но неинтересно  Кое-что надо бы потаблично Еще для индексов А если помечтать, то... … и тут Остапа понесло (с)
  • 21. Детализация метрик  Счетчик надо сначала найти!  Хэш-таблица? Сортированный массив? Или, может, бинарное дерево?  Это все временные затраты, их надо оценивать
  • 22. Детализация метрик #if defined(REL_COUNTS_TREE) typedef Firebird::BePlusTree<RelationCounts, ULONG, Firebird::MemoryPool, RelationCounts> RelCounters; #elif defined(REL_COUNTS_PTR) typedef Firebird::PointersArray<RelationCounts, Firebird::EmptyStorage<RelationCounts>, ULONG, RelationCounts> RelCounters; #else // sorted array typedef Firebird::SortedArray<RelationCounts, Firebird::EmptyStorage<RelationCounts>, ULONG, RelationCounts> RelCounters; #endif
  • 23. Мониторинг ожиданий  I/O, блокировки разных видов  Кто, кого и на чем ждет  Интересен также контекст  Графы ожиданий, дэдлоки
  • 24. Мониторинг ожиданий  I/O, блокировки разных видов  Кто, кого и на чем ждет  Интересен также контекст  Графы ожиданий, дэдлоки  Но самое интересное — время ожидания  Однако, тут могут быть сюрпризы!
  • 25. Метрики: советы  Больше метрик, хороших и разных  Детализация стоит дорого, трижды подумайте над реализацией (и надо ли оно вам вообще)  Если накладные расходы велики — можно использовать отложенную запись  Самую тяжелую статистику имеет смысл делать опциональной
  • 26. Как выдавать данные наружу  Регулярно обновлять состояние и счетчики в общей памяти — накладные расходы, зато возможен высокочастотный мониторинг  Предоставлять состояние по запросу, метрики считать локально и предоставлять также по запросу — снэпшот слегка отстает, больше задержки при запросах к мониторингу
  • 27. Снэпшот-мониторинг в MySQL  performance_schema  Не такой уж и снэпшот  Можно включать/выключать (требуется перезапуск)  Настраивать можно «на лету»  Помимо счетчиков содержит также *_summary
  • 28. Снэпшот-мониторинг в PostgreSQL  Statistics collector  Включать/выключать можно «на лету», по группам  Динамические представления pg_stat_* и pg_locks  Обновляется периодически  Снэпшот на время жизни транзакции
  • 29. Наш опыт: снэпшот-мониторинг в Firebird  Виртуальные таблицы мониторинга  Метрики (локально) считаем всегда, время замеряем опционально  Информация собирается по запросу  Снэпшот на время жизни транзакции
  • 30. Наш опыт: снэпшот-мониторинг в Firebird  MON$DATABASE  MON$ATTACHMENTS  MON$TRANSACTIONS  MON$STATEMENTS  MON$CALL_STACK +  MON$*_STATS  MON$*_USAGE
  • 31. Наш опыт: снэпшот-мониторинг в Firebird  MON$DATABASE  MON$ATTACHMENTS  MON$TRANSACTIONS  MON$STATEMENTS  MON$CALL_STACK +  MON$*_STATS  MON$*_USAGE Считаются для каждого объекта выше
  • 32. Наш опыт: снэпшот-мониторинг в Firebird  MON$DATABASE  MON$ATTACHMENTS  MON$TRANSACTIONS  MON$STATEMENTS  MON$CALL_STACK +  MON$*_STATS  MON$*_USAGE Считаются для каждого объекта выше Агрегируются снизу вверх
  • 33. Логирование  Критические ошибки  Алерты — логические ошибки и пиковые ситуации (медленные запросы, временные файлы)  Интерактивная трассировка  Аудит — постоянное логирование
  • 34. Логирование в MySQL  Error log  General query log  Slow query log  Audit API + плагины
  • 35. Логирование в PostgreSQL  Разные варианты — stderr / syslog / eventlog / файл  Есть функционал slow query log — через log_min_duration_statement  Кастомизация логируемых запросов, умеет писать долгие блокировки, временные файлы и т.п.  Динамическая трассировка для DTrace / SystemCap (требует компиляции c --enable-dtrace)
  • 36. Наш опыт: логирование в Firebird  Trace API + плагины  Системный аудит — управляется ядром, настраивается конфигом, пишется в лог на диске (по умолчанию) с ротацией (архивированием)  Пользовательская трассировка — управляется юзером (start-pause-resume-stop), конфиг задается в рантайме, лог пишется во временные файлы и удаляется по мере вычитывания клиентом
  • 37. Наш опыт: логирование в Firebird  Везде логируем ID объектов  Большинство событий спаренные — начало и конец  По завершении можем выдавать статистику — время выполнения и детализированные метрики  Есть функционал slow query log — через time_threshold  Дополнительная кастомизация — через include/exclude фильтры (regexp)
  • 38. Наш опыт: логирование в Firebird # трассируем медленные запросы database = myslowdb { log_statement_finish = true print_perf = true time_threshold = 10000 # 10 seconds } # трассируем изменения метаданных database = mycooldb { log_statement_start = true include_filter = %(CREATE|ALTER|DROP)% }
  • 39. В реальной жизни надо сочетать  В логах — только алерты или подробно  От этого зависит частота снэпшот-мониторинга  Совсем интересно становится, если их можно связать вместе