Руководство по анализу метрик производительности MongoDB с помощью mongotop и mongostat

Используйте mongotop и mongostat для выявления горячих коллекций, нагрузки на ресурсы, всплесков подключений и медленных паттернов MongoDB.

Руководство по анализу метрик производительности MongoDB с помощью mongotop и mongostat

Проблемы с производительностью MongoDB часто проявляются в виде медленных страниц, задержек записи или внезапных всплесков подключений. mongotop и mongostat, устанавливаемые вместе с MongoDB Database Tools, предоставляют быстрый терминальный обзор текущего состояния сервера.

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

Понимание mongotop

mongotop предоставляет обзор операций чтения и записи, выполняемых на ваших экземплярах MongoDB, в реальном времени. Он отображает время, затраченное каждой коллекцией на операции чтения или записи за указанный интервал. Это особенно полезно для выявления коллекций, испытывающих наибольшую активность и потенциально являющихся источником снижения производительности.

Ключевые метрики, предоставляемые mongotop:

  • ns: Пространство имен коллекции (база_данных.коллекция).
  • total: Время, затраченное на чтение и запись в пространство имен в течение интервала выборки.
  • read: Время, затраченное на операции чтения в течение интервала выборки.
  • write: Время, затраченное на операции записи в течение интервала выборки.

Как использовать mongotop:

Вы можете запустить mongotop прямо из терминала, если у вас установлены инструменты MongoDB Database Tools и они доступны в PATH. По умолчанию обновление происходит каждую секунду. Вы также можете указать интервал в секундах.

mongotop

Чтобы указать интервал обновления (например, каждые 5 секунд):

mongotop 5

Для запуска mongotop для экземпляра MongoDB, работающего на другом хосте и порту:

mongotop --host <имя_хоста> --port <порт>

Интерпретация вывода mongotop:

  • Высокое время write для конкретной коллекции: Коллекция испытывает интенсивную нагрузку на запись. Проверьте объем записи, рост документов, индексы, затрагиваемые записью, и необходимость шардирования рабочей нагрузки.
  • Высокое время read: Проверьте планы запросов для этой коллекции. Отсутствующие индексы, большие результирующие наборы и сканирования при агрегации часто проявляются здесь.
  • Коллекции с постоянно высоким временем total: Это ваши самые горячие коллекции. Внимательно следите за их индексами, рабочим набором и шаблонами запросов.

Понимание mongostat

mongostat предоставляет более широкий обзор производительности и использования ресурсов экземпляра MongoDB в реальном времени. Он собирает и отображает различные метрики состояния сервера, включая операции в секунду, сетевой трафик, дисковый ввод-вывод и использование памяти.

Ключевые метрики, предоставляемые mongostat:

  • insert: Операции вставки в секунду.
  • query: Операции запросов в секунду.
  • update: Операции обновления в секунду.
  • delete: Операции удаления в секунду.
  • getmore: Операции getmore в секунду (используются для курсоров).
  • command: Операции команд в секунду.
  • dirty или dirty %: Данные кэша WiredTiger, измененные в памяти, но еще не записанные на диск. Точное название столбца зависит от версий MongoDB и инструментов.
  • used или used %: Использование кэша WiredTiger. Точное название столбца зависит от версий MongoDB и инструментов.
  • conn: Текущее количество подключений.
  • networkIn: Сетевой трафик, полученный сервером (в байтах).
  • networkOut: Сетевой трафик, отправленный сервером (в байтах).
  • res: Размер резидентной памяти, используемой процессом MongoDB (в МБ).
  • qr|qw: Количество операций чтения и записи в очереди, если столбец доступен.
  • ar|aw: Количество активных клиентов чтения и записи, если столбец доступен.

Как использовать mongostat:

mongostat также является утилитой командной строки. Как и mongotop, она обновляется периодически, с интервалом по умолчанию 5 секунд. Вы можете указать другой интервал и параметры подключения.

mongostat

Чтобы указать интервал обновления (например, каждые 2 секунды):

mongostat 2

Для подключения к удаленному экземпляру MongoDB:

mongostat --host <имя_хоста> --port <порт>

Интерпретация вывода mongostat:

  • Высокие показатели insert, query, update или delete: Указывает на высокую операционную нагрузку. Следите за этими метриками вместе с другими, чтобы понять, успевает ли система обрабатывать нагрузку.
  • Высокое значение conn: Большое количество подключений может создавать нагрузку на ресурсы сервера. Если это значение неожиданно высокое, проверьте пул соединений в вашем приложении.
  • Высокое значение networkIn или networkOut: Указывает на значительную передачу данных. Это может быть связано с большими запросами, трафиком репликации или возвратом больших результирующих наборов.
  • Высокое значение res: Процесс MongoDB потребляет много оперативной памяти. Убедитесь, что на сервере достаточно памяти, и проверьте наличие неэффективных запросов или больших наборов данных, которые могут способствовать высокому использованию памяти.
  • Высокое значение qr|qw: Указывает на то, что операции чтения или записи ставятся в очередь, что обычно свидетельствует о конкуренции за ресурсы или рабочей нагрузке, которую сервер не может обработать достаточно быстро.
  • Высокие значения dirty или used кэша: Если давление на кэш WiredTiger остается высоким, ваш рабочий набор может не помещаться в памяти, или запись на диск может отставать.
  • Медленные запросы при низких показателях операций: Используйте профилировщик, журнал медленных запросов или explain(), чтобы проверить, не сканируют ли запросы слишком много документов. Современный вывод mongostat не позволяет надежно определить процент пропусков индексов для развертываний WiredTiger.

Практические примеры и сценарии устранения неполадок

Сценарий 1: Медленная производительность приложения

  1. Запустите mongostat: Обратите внимание на показатели qr, aw, insert, query, update, delete. Если qr или aw высоки, или если показатели операций высоки, но не обрабатываются быстро, это указывает на наличие отставания.
  2. Запустите mongotop: Определите, какие коллекции испытывают наибольшее время read ms и write ms. Коллекция с высокой активностью записи может замедлять другие операции.
  3. Проверьте планы запросов: Для горячих коллекций, выявленных с помощью mongotop, выполните explain("executionStats") для типичных медленных запросов.
  4. Проанализируйте networkIn/networkOut в mongostat: Если они необычно высоки, ищите большие результирующие наборы, большие агрегации или трафик репликации.

Сценарий 2: Высокая загрузка ЦП или памяти

  1. Запустите mongostat: Отслеживайте res (резидентная память) и загрузку ЦП (часто наблюдаемую с помощью системных инструментов, таких как top или htop, но mongostat дает специфичную для БД перспективу). Высокое значение res может коррелировать с кэшем WiredTiger (used %).
  2. Изучите mongotop: Высокое время чтения/записи для конкретных коллекций может способствовать высокой загрузке ЦП.
  3. Посмотрите на показатели операций в mongostat: Если операции вставки/обновления/удаления чрезвычайно высоки, это естественным образом потребляет ЦП.
  4. Исследуйте кэш WiredTiger и дисковые метрики: Если грязный кэш остается высоким, а запись приложения замедляется, сравните вывод MongoDB с задержкой диска хоста и насыщением ввода-вывода.

Сценарий 3: Отставание репликации

Хотя mongotop и mongostat напрямую не измеряют отставание репликации, они важны для понимания причины отставания.

  1. Запустите mongostat на primary: Ищите высокие значения qr или aw, высокие показатели операций записи или высокую загрузку ЦП/памяти. Если primary перегружен, он не может эффективно записывать в свой oplog, что приводит к отставанию на secondary.
  2. Запустите mongostat на secondary: Наблюдайте за его операциями чтения/записи. Если secondary медленно применяет записи oplog, это может быть связано с недостаточными ресурсами на secondary или неэффективными запросами/операциями.

Советы и лучшие практики

  • Регулярно запускайте инструменты: Не ждите возникновения проблем с производительностью. Заблаговременно отслеживайте свои экземпляры MongoDB.
  • Установите базовые показатели: Поймите, что является "нормой" для вашего развертывания. Это облегчит выявление отклонений.
  • Комбинируйте с другими инструментами: mongotop и mongostat отлично подходят для моментальных снимков в реальном времени. Для исторического анализа рассмотрите использование встроенного мониторинга производительности MongoDB (например, db.serverStatus(), db.stats()) или внешних инструментов, таких как Prometheus с MongoDB Exporter, или сервисов мониторинга облачных провайдеров.
  • Понимайте свой рабочий набор: Знание размера вашего активного набора данных имеет решающее значение для управления памятью и понимания эффективности кэша WiredTiger.
  • Сосредоточьтесь на планах запросов: Используйте explain("executionStats") и журнал медленных запросов, чтобы подтвердить, являются ли причиной сканирования отсутствующие или неэффективные индексы.
  • Рассмотрите пул соединений: Высокие значения conn часто можно уменьшить, внедрив правильный пул соединений на уровне приложения.

Вывод

Используйте mongostat для понимания нагрузки на уровне сервера и mongotop для поиска коллекций, получающих наибольшее внимание при чтении или записи. Когда любой из инструментов указывает на горячую область, подтвердите причину с помощью планов запросов, журналов медленных запросов, метрик хоста и поведения подключений приложения, прежде чем изменять индексы или масштабировать развертывание.