Как интерпретировать метрики мониторинга: краткий ответ
Краткий ответ: анализ производительности начинается с сопоставления пользовательского симптома, инфраструктурных метрик, динамики и контекста событий. Один высокий показатель CPU, памяти, диска или сети показывает отклонение, но не доказывает его причину.
Рабочая последовательность выглядит так: зафиксируйте влияние на latency, error rate, throughput или SLO, сформулируйте гипотезу по сочетанию метрик, сравните период аномалии с нормальным фоном, затем подтвердите вывод логами, трейcами и журналом изменений. Гипотеза считается подтвержденной, когда несколько независимых источников описывают одну цепочку событий.
Метрики отвечают на вопрос «что и где ухудшилось». Логи уточняют ошибки и действия процессов, трейсы показывают путь конкретного запроса, а события связывают отклонение с деплоем, изменением конфигурации, работой резервного копирования или сбоем зависимости. Сервис может выглядеть healthy, но терять данные из-за проблем между компонентами, collector-пайплайном, очередью, базой данных или внешним API.
Почему один график почти никогда не объясняет причину
График отражает симптом или корреляцию, а первопричина может находиться на другом уровне. CPU способен вырасти после сетевой ошибки, когда приложение начинает повторять один запрос десятки раз. Заполненная память может отражать штатный файловый кеш Linux. Высокая дисковая активность бывает нормальной при последовательном чтении, но становится проблемой при росте задержки операций и очереди.
- Высокий CPU: ищите рост run queue, load average, latency и падение throughput при сопоставимом входящем трафике.
- Низкий free memory: проверяйте MemAvailable, swap, reclaim, major page faults и OOM-события. Page cache сам по себе не подтверждает дефицит RAM.
- Высокий disk I/O: сопоставляйте IOPS, throughput, await, queue depth, utilization и задержки запросов приложения.
- Сетевое отклонение: смотрите retransmits, packet drops, ошибки интерфейса, DNS latency, TCP failures, retry rate и время вызовов зависимостей.
Практическая проверка Linux-сервера с помощью top, vmstat, iostat и ss описана в руководстве по поиску узких мест сервера. Эти команды дают быстрый снимок, который затем нужно сопоставить с временными рядами и прикладными симптомами.
Минимальная цепочка проверки гипотезы
- Определите симптом. Зафиксируйте, выросла ли задержка, увеличилась ли доля ошибок, снизилась ли пропускная способность, нарушился ли SLO или остановились фоновые задачи.
- Проверьте ресурс и очередь. Смотрите CPU, RAM, disk I/O, network interface, очереди запросов, worker pool, активные соединения и время внешних вызовов.
- Изучите временной ряд. Сравните значения перед аномалией, во время нее и после восстановления. Один снимок состояния не показывает ни причину, ни устойчивость отклонения.
- Подтвердите гипотезу. Найдите связанные записи в логах, медленные spans в трейcах, события Kubernetes, деплои, изменения лимитов, сетевые ошибки и действия внешних систем.
Рабочее правило: высокий ресурсный показатель без пользовательского воздействия требует наблюдения, а ухудшение сервиса при нормальных ресурсах требует поиска блокировок, зависимостей и скрытых разрывов между компонентами.
С чего начать анализ производительности системы
Начинайте расследование с инцидента, а не с самого яркого графика в Grafana. Сначала определите, что именно заметил пользователь или система контроля качества, затем ограничьте область поиска по времени, сервисам и типам запросов.
Зафиксируйте симптом и границы инцидента
Запишите время начала и окончания отклонения с точностью до минуты. Укажите сервис, endpoint, регион, узел, namespace, pod, тип операции и долю затронутых запросов. Разделите полную недоступность, рост задержки, ошибки 5xx, потерю фоновых задач и деградацию одной зависимости.
- Сравните p50, p95 и p99 latency. Рост p99 при стабильном p50 часто указывает на небольшой сегмент медленных запросов, отдельные узлы или зависимость.
- Проверьте error rate и типы ошибок. Таймаут, отказ DNS, HTTP 5xx и ошибка записи в базу данных требуют разных веток диагностики.
- Сопоставьте throughput с входящим трафиком. Падение обработанных запросов при прежнем количестве входящих запросов указывает на очередь, ограничение ресурса или ошибки обработки.
- Определите границу распространения. Если проблему видит один pod, ищите локальный ресурсный дефицит или поврежденную конфигурацию. Если затронуты несколько зон, проверьте общую зависимость, балансировщик или сеть.
Например, рост p99 с 300 до 1800 мс только в одном endpoint при стабильном CPU приложения может указывать на медленный запрос к базе данных. Рост latency всех endpoint после обновления ingress требует другой проверки, включая TLS, соединения, лимиты и сетевой путь.
Сопоставьте прикладные и инфраструктурные показатели
Поставьте рядом панели приложения и узлов. На одном временном окне должны быть видны latency, error rate, throughput, размер очередей, активные соединения и время внешних вызовов, а рядом CPU, RAM, disk I/O и сеть.
| Прикладной сигнал | Инфраструктурная проверка | Рабочая гипотеза |
|---|---|---|
| Растет latency и очередь задач | CPU, run queue, throttling, worker pool | Сервис не успевает обрабатывать входящий поток |
| Ошибки и перезапуски контейнеров | Memory working set, memory limit, OOMKilled | Процесс упирается в лимит памяти |
| Медленные запросы к базе данных | Disk latency, fsync, queue depth, iowait | Хранилище или журнал транзакций задерживает операции |
| Timeout внешнего вызова | Retransmits, DNS latency, TCP failures, интерфейс | Проблема находится в сетевом пути или зависимости |
| Метрики пропали, но health check зеленый | Collector, pipeline, доступность endpoint метрик | Сервис работает, но данные наблюдаемости не доходят |
Рост ресурса без ухудшения сервиса не требует немедленного изменения конфигурации. Деградация при нормальном CPU, памяти, диске и сети указывает на блокировки, лимиты приложения, очередь, зависимость или ошибку передачи данных. Для Kubernetes полезно заранее настроить сбор показателей узлов и контейнеров через kube-state-metrics и node-exporter.
Выбирайте временное окно до, во время и после аномалии
Минимальное окно включает несколько минут до отклонения, весь период инцидента и период восстановления. Для медленной деградации добавьте часы или дни. Новую систему полезно наблюдать несколько дней на реальной нагрузке, чтобы увидеть рабочий диапазон, ночные задачи, резервное копирование и повторяющиеся пики.
Сравнивайте инцидент с сопоставимым фоном: тем же часом, днем недели, объемом трафика и числом активных пользователей. Отдельно отметьте деплой, изменение образа, переключение трафика, изменение CPU и memory limits, миграцию, обновление узла и плановые работы. Если алерт появился сразу после изменения, это формирует гипотезу, но еще не подтверждает причинность.
Как понять, что не хватает CPU
Нехватка CPU проявляется как ограничение способности выполнять работу. Процент загрузки становится диагностически значимым, когда вместе с ним растут очереди и задержки, а throughput перестает соответствовать входящему потоку.
Сочетание метрик, указывающее на CPU saturation
Проверяйте несколько признаков одновременно. На восьми виртуальных CPU load average, устойчиво находящийся около 12-14, при user CPU выше 90%, росте p95 с 200 до 900 мс и прежнем объеме запросов выглядит как сильная гипотеза о нехватке вычислительной мощности. Универсального процента для всех сервисов нет: интерактивный API, пакетный worker и база данных имеют разные рабочие диапазоны.
| Метрика | Что показывает | Когда сигнал становится значимым |
|---|---|---|
| User CPU | Время выполнения прикладного кода | Растет вместе с очередью, latency и снижением throughput |
| System CPU | Время ядра, системных вызовов, сети и I/O | Растет при большом числе системных операций, переключений и обработке пакетов |
| Load average и run queue | Количество задач, ожидающих CPU или некоторые неблокирующие ресурсы | Долго превышают число доступных CPU и совпадают с задержками |
| CPU steal | Время виртуальной машины, отданное соседним гостям гипервизора | Растет при деградации VM, хотя ее собственная загрузка не объясняет задержку |
| iowait | Время ожидания завершения операций I/O | Высокое значение требует проверки диска, а не автоматического увеличения CPU |
Высокий user CPU при горячих потоках приложения подтверждает вычислительную нагрузку. Высокий system CPU может указывать на сетевые вызовы, большое число файловых операций, частые переключения контекста или неудачный профиль параллелизма. Высокий iowait меняет направление расследования: процессоры простаивают в ожидании хранилища.
CPU throttling в контейнерах и Kubernetes
Контейнер способен упереться в CPU limit при свободном процессоре на node. Kubernetes ограничивает такой контейнер cgroup-механизмом, поэтому средняя загрузка узла может выглядеть нормальной, а latency конкретного сервиса будет расти.
Проверьте requests, limits, число реплик, фактическое потребление и признаки throttling. Для оценки доли периодов с ограничением можно использовать временной ряд:
100 * rate(container_cpu_cfs_throttled_periods_total[5m]) / rate(container_cpu_cfs_periods_total[5m])Сопоставьте результат с p95/p99 latency, размером очереди и временем обработки. Краткое throttling при отсутствии влияния на SLO не требует немедленного увеличения limit. Если throttling устойчиво совпадает с задержками, проверьте параллелизм, размер worker pool, профиль запросов и распределение нагрузки между репликами. Быстрый алгоритм поиска причины в pod и node собран в руководстве по диагностике Kubernetes через метрики.
Чем подтвердить гипотезу о нехватке CPU
- Найдите горячие процессы и потоки через
top,htopилиpidstat -u -t 1. Проверьте, какой процесс потребляет CPU, а не только общий показатель узла. - Сопоставьте время роста CPU с входящим трафиком, релизом, изменением алгоритма, увеличением числа ретраев или циклической ошибкой.
- Проверьте логи на timeouts, исчерпание worker pool, повторные попытки и сообщения о перегрузке.
- Изучите трейсы медленных запросов. Если значительная часть времени проходит внутри приложения, CPU-гипотеза сильнее. Если время уходит во внешнюю зависимость, увеличивать CPU преждевременно.
- При доступном профилировании снимите профиль в период аномалии и сравните горячие функции с нормальным периодом.
Масштабирование CPU оправдано при подтвержденном устойчивом дефиците, совпадающем с нарушением SLO. При ретраях, ошибочном цикле или неэффективном запросе увеличение ресурсов временно скроет причину и повысит стоимость обработки.
Как распознать нехватку памяти и давление на RAM
Linux использует свободную RAM под page cache, поэтому низкий показатель free memory сам по себе не описывает состояние системы. Для диагностики memory pressure нужны MemAvailable, swap, reclaim, page faults, PSI memory, OOM-события и влияние на работу процессов.
Какие метрики подтверждают memory pressure
| Сигнал | Что проверить | Связь с инцидентом |
|---|---|---|
| MemAvailable снижается | Доступный запас памяти и скорость его уменьшения | Низкий запас значим при росте reclaim, swap или задержек |
| Major page faults | Частоту чтения страниц с диска | Рост может задерживать процессы и увеличивать I/O |
| Swap in/out | Объем страниц, читаемых из swap и записываемых в него | Устойчивый обмен часто совпадает с зависаниями и ростом latency |
| Memory PSI | Время, которое задачи проводят в ожидании памяти | Показывает давление даже при отсутствии немедленного OOM |
| OOM-kill | События ядра и статусы контейнеров | Подтверждает принудительное завершение процесса из-за лимита |
Команда vmstat 1 помогает увидеть reclaim и swap в динамике. Смотрите столбцы swap in и swap out, page faults, runnable tasks и время ожидания. Один всплеск reclaim во время чтения большого файла не равен постоянному дефициту памяти. Повторяемый swap, рост major faults, OOM и увеличение p99 latency уже образуют согласованный набор признаков.
Как отличить утечку памяти от разового пика
Утечка обычно дает монотонный рост working set между рестартами. Например, контейнер начинает работу с 2 ГБ, за 6 часов доходит до 4,5 ГБ, не возвращается к базовому уровню после снижения нагрузки и завершается по memory limit. Повторяемость по версии приложения или сценарию запросов усиливает гипотезу об утечке.
Разовый пик имеет другую форму. Память быстро растет во время batch-задачи, прогрева кеша, крупного запроса, резервного копирования или обработки большого файла, затем возвращается к рабочему уровню. Зафиксируйте длительность пика, объем обработанных данных и момент освобождения памяти.
- Стройте график working set процесса или контейнера вместе с рестартами.
- Отмечайте релизы и изменения схемы данных, размера кеша, batch-размера и числа параллельных задач.
- Сравнивайте одинаковые сценарии нагрузки. Повторяемый рост на одной версии приложения требует анализа профиля памяти.
- Проверьте, не учитываете ли page cache как память приложения. Для процесса важны RSS, working set и данные cgroup.
Особенности памяти в контейнерах и Kubernetes
Запас RAM на node не отменяет OOM внутри контейнера. Если memory limit равен 1 ГБ, процесс получит OOMKilled при превышении этого значения, даже когда на узле свободно 20 ГБ.
Проверьте memory working set контейнера, memory limit, статус OOMKilled, restart count и события Kubernetes. Сопоставьте момент завершения контейнера с логами приложения и графиком памяти. Если несколько pod на одном узле испытывают проблему одновременно, проверяйте давление на node и eviction. Если завершается один pod при свободной RAM на узле, ищите его лимит, утечку или резкий размер запроса.
Повышение memory limit без анализа роста working set может увеличить интервал между сбоями и усложнить прогнозирование. Сначала определите, нужен ли сервису больший рабочий объем, исправление кеша, снижение параллелизма или устранение утечки.
Как определить дисковое узкое место
Высокая дисковая активность не всегда означает перегрузку. Последовательное чтение может давать большой throughput при небольшой задержке, а небольшая случайная запись с частым fsync способна создать очередь и замедлить базу данных.
Метрики диска, которые нужно смотреть вместе
| Метрика | Смысл | Признак ограничения |
|---|---|---|
| Read/write latency и await | Время выполнения операции, включая ожидание | Растут одновременно с latency приложения и очередью |
| Queue depth | Число операций, ожидающих устройства | Долго держится выше обычного уровня при прежнем профиле нагрузки |
| Utilization | Занятость устройства обработкой запросов | Длительно близка к пределу вместе с ростом await |
| IOPS | Число операций чтения и записи в секунду | Сопоставляются с типом устройства и размером блока |
| Throughput | Объем переданных данных в секунду | Высокое значение проблемно при росте latency или достижении пропускной способности |
| iowait | Время CPU в ожидании I/O | Подтверждает влияние хранилища на процессы, но требует проверки устройства |
Для быстрой проверки Linux используйте iostat -xz 1. Смотрите устройство, await, queue, utilization и read/write throughput в нескольких последовательных измерениях. Один высокий показатель в момент снимка не показывает, была ли очередь краткой или устойчивой.
Тип нагрузки меняет интерпретацию метрик. База данных чувствительна к latency fsync и случайной записи. Объектное или файловое хранилище может использовать последовательный throughput. ZFS добавляет собственные факторы, включая ARC, sync-записи, состояние пула и задержки дисков. Сетевое NAS требует проверки сетевого пути вместе с дисками.
Признаки проблем с объемом хранилища и inode
Заполненность файловой системы и низкая производительность I/O требуют разных проверок. Команда df -h показывает занятое место, а df -i помогает обнаружить исчерпание inode. Том может иметь свободные гигабайты, но не принимать новые файлы при исчерпанных inode.
- Проверьте usage файловой системы, inode usage и размер временных каталогов.
- Ищите ошибки записи, read-only remount, ошибки файловой системы и таймауты устройства.
- Проверьте рост логов, дампов, очередей и незавершенных временных файлов.
- Сопоставьте заполнение тома с ошибками приложений: невозможностью создать файл, записать журнал, обновить базу или сохранить результат.
- Для пула хранения проверьте состояние дисков, деградацию массива, свободное место и задержки операций.
Диск, заполненный на 98%, может остановить сервис при нормальном await. Устройство с 30% свободного места может перегружаться при частом случайном I/O. Эти случаи требуют разных действий: очистки и настройки политики хранения в первом случае, поиска тяжелого или неэффективного профиля операций во втором.
Как проверить связь между диском и задержками приложения
- Сопоставьте время медленных запросов и запросов к базе данных с read/write latency и queue depth.
- Проверьте fsync, checkpoint, compaction, создание индексов и резервное копирование. Эти операции часто создают нагрузку в определенное окно.
- Изучите логи на I/O errors, reset устройства, таймауты, ошибки файловой системы и read-only remount.
- Разделите локальное и сетевое хранилище. При NAS проверяйте disk latency на сервере хранения, сетевые retransmits и время ответа монтирования.
- Сравните успешные и медленные операции через трейсы. Если задержка возникает внутри базы данных на дисковом span, связь подтверждается точнее, чем общим графиком utilization.
Высокий throughput при низком await и стабильном p99 может быть штатным режимом. Рост await, очереди и времени fsync одновременно с замедлением запросов дает основание считать хранилище узким местом.
Как выявить сетевые ограничения и проблемы между компонентами
Сетевая деградация проявляется не только потерей связи. Сервис может отвечать с задержкой из-за retransmits, переполнения очереди интерфейса, DNS, TLS, MTU, балансировщика или внешней зависимости. При этом локальный процесс и liveness-check продолжат работать.
Сочетания сетевых метрик и прикладных симптомов
| Сетевой сигнал | Прикладной симптом | Что проверить |
|---|---|---|
| Retransmits и packet drops | Рост p95/p99, timeouts, retries | Интерфейс, путь, перегрузку, duplex, ошибки оборудования |
| Ошибки интерфейса | Неравномерная деградация узлов | ip -s link, counters, состояние порта и кабельного пути |
| Высокая загрузка канала | Очереди, задержки и снижение throughput | Направление трафика, QoS, балансировщик и пропускную способность |
| Рост DNS latency | Медленный первый запрос, connection timeout | Резолвер, search domains, доступность DNS и TTL |
| TCP connection failures | Ошибки подключения и рост retry rate | Порты, firewall, NetworkPolicy, лимиты соединений и состояние сервиса |
| TLS errors | Ошибки 4xx или 5xx, разрыв вызова | Сертификаты, время на узлах, SNI, прокси и настройки шифрования |
Сравнивайте сетевые показатели с p95/p99, 5xx, timeouts, retry rate и размером очередей. Команда ss -s дает сводку по соединениям, а ip -s link показывает counters интерфейса. Для анализа маршрута нужны измерения на обеих сторонах соединения, потому что один узел может видеть отправку, а второй получать потерю пакетов.
Подробный порядок проверки задержек, потерь, DNS и нестабильных соединений описан в руководстве по влиянию сети на производительность систем.
Почему healthy-статус не исключает сетевой инцидент
Liveness-check часто проверяет, что локальный процесс отвечает на простой HTTP-запрос. Readiness-check может не включать реальную операцию с очередью, базой данных или внешним API. Такой health check не подтверждает передачу пользовательских данных и доступность каждого участка цепочки.
Отдельно проверяйте:
- доступность collector и endpoint метрик;
- передачу сообщений в очередь и чтение из нее;
- подключение к базе данных и успешность тестовой операции;
- вызов внешнего API с теми же DNS, TLS и маршрутами, что использует приложение;
- поступление метрик в Prometheus и отображение свежих точек в Grafana.
Скрытый сбой pipeline может оставить статус сервиса зеленым, но создать пробелы в мониторинге. Если график внезапно перестал обновляться, сначала проверьте timestamp последней точки, состояние exporter, scrape errors и доступность collector.
Как локализовать проблемный участок сети
Разбейте путь запроса на переходы: клиент, балансировщик, ingress, pod, сервис, база данных или внешний API. Сравнивайте показатели по node, zone, namespace, pod, интерфейсу и направлению трафика.
- Определите, затронуты ли все узлы или только одна node, зона, подсеть или группа pod.
- Проверьте события балансировщика, изменения маршрутизации, NetworkPolicy и правила firewall.
- Сопоставьте DNS latency и TCP connection time с полным временем запроса.
- Проверьте сертификаты, срок действия, время на узлах и ошибки TLS.
- Исключите MTU и фрагментацию, если крупные ответы медленные, а короткие health-check проходят.
- Сопоставьте начало проблемы с изменением провайдера, маршрута, сетевого оборудования или внешнего API.
Фиксируйте переход, на котором растет latency или появляется ошибка. Формулировка «сеть медленная» недостаточна для действия. Формулировка «после ingress растет время TCP connection, а до ingress задержка стабильна» уже задает проверяемую гипотезу.
Как отличить всплеск нагрузки от устойчивой деградации
Кратковременный пик может быть штатным результатом batch-задачи, прогрева кеша или резервного копирования. Небольшой рост задержки, который повторяется каждый день и расходует error budget, требует действий, даже если ресурсные графики не достигают условного красного порога.
Сравнивайте аномалию с базовой линией, а не с универсальным порогом
Baseline строится по историческим временным рядам для сопоставимого периода и нагрузки. Сравнивайте текущий понедельник с предыдущими понедельниками, ночное окно с ночными окнами, а пиковый трафик с периодами похожего объема. Учитывайте сезонность, рабочие часы, batch-задачи, релизы, миграции и плановые работы.
Статический порог 80% CPU может создавать шум для batch-worker, который рассчитан на полную загрузку четырех ядер. Для API тот же показатель может быть критичным, если p99 уже нарушает SLO. Порог должен учитывать роль сервиса, число CPU, базовую нагрузку, объем трафика и допустимую задержку.
Для новой системы сначала соберите метрики на реальных target в течение нескольких дней. В Grafana отметьте нормальные диапазоны, типичные очереди, время восстановления и связь между нагрузкой и latency. В Prometheus храните метрики с достаточным периодом, чтобы сравнивать релизы и одинаковые календарные окна.
Оценивайте длительность, повторяемость и влияние на SLO
| Сценарий | Признаки | Действие |
|---|---|---|
| Краткий восстанавливающийся всплеск | Длится 30-60 секунд, не повторяется, SLO не нарушен | Зафиксировать контекст и продолжить наблюдение |
| Регулярная деградация под нагрузкой | Повторяется при похожем трафике, растут p99 и очереди | Найти ограничение и запланировать изменение |
| Непрерывное ухудшение | Latency постепенно растет, baseline не восстанавливается | Начать расследование утечки, исчерпания ресурса или регрессии |
| Резкая деградация после изменения | Начинается рядом с деплоем, миграцией или сменой лимитов | Сопоставить изменение с логами, трейсами и возможностью отката |
Оцените продолжительность, число повторений, долю затронутых запросов и расход error budget. Пик продолжительностью 20 секунд без влияния на пользователей и устойчивый рост p99 на 10-20% в течение часа имеют разный приоритет.
Учитывайте плановые работы и подавленные уведомления
Mute-режим должен отключать рассылку уведомлений, но сбор метрик и создание событий должны продолжаться. Иначе после работ теряется контекст, который нужен для сравнения baseline и поиска новой проблемы.
Перед плановыми работами запишите ожидаемые изменения: какие узлы будут недоступны, какие метрики вырастут, сколько времени продлится операция. После завершения проверьте возникшие события, пропуски метрик, ошибки scrape, состояние реплик и новую базовую линию. Если после обслуживания latency не вернулась к прежнему уровню, плановый статус не объясняет весь инцидент.
Как подтвердить выводы через логи, трейсы и события
Метрики локализуют отклонение, но первопричина часто находится в журнале приложения, трассировке запроса или журнале изменений. Корреляция событий связывает проблемы с действиями и снижает информационный шум, когда один сбой порождает десятки вторичных алертов.
Какие логи искать после обнаружения аномалии
Ограничьте поиск точным временным окном, сервисом, host, pod, request ID или trace ID. Ищите не все сообщения подряд, а признаки, которые соответствуют гипотезе:
- CPU или очередь: timeouts, retries, исчерпание worker pool, перегрузка executor и циклические ошибки;
- RAM: OOM, allocation failure, перезапуски, превышение лимита и сообщения сборщика мусора;
- диск: I/O errors, reset устройства, fsync timeout, read-only remount и ошибки файловой системы;
- сеть: connection reset, DNS failure, TLS error, timeout, отказ подключения и превышение лимита соединений;
- изменения: запуск миграции, смена конфигурации, деплой образа, изменение лимитов и переключение трафика.
Сопоставляйте время записи с точностью до секунд. Лог о timeout в 12:03:18 подтверждает связь с графиком только тогда, когда задержка возникла в том же сервисе и временном окне. Запись, появившаяся через 15 минут, может описывать следствие или отдельное событие.
Как трейсы показывают цепочку деградации запроса
Распределенная трассировка разбивает запрос на spans. Сравните успешный запрос и медленный запрос с похожими параметрами, затем найдите участок, где накапливается время.
- Длинный span приложения при высоком user CPU указывает на вычисление или блокировку внутри сервиса.
- Длинный span базы данных вместе с ростом disk latency указывает на хранение, запрос, fsync или checkpoint.
- Несколько повторных spans одного внешнего вызова подтверждают retry-цепочку.
- Длинный DNS, connect или TLS span направляет проверку к резолверу, сети или сертификатам.
- Нормальные инфраструктурные метрики при долгом span очереди указывают на задержку между компонентами или состояние брокера.
Трейсы особенно полезны при нормальном CPU, RAM, диске и сети. Они показывают, где запрос проводит время, тогда как общий график узла может скрыть проблему одного endpoint или зависимости.
Сопоставляйте метрики с журналом изменений
Соберите единый временной ряд для метрик, логов, трейсов и событий. Используйте общие поля service, host, pod, request ID и trace ID. Проверьте:
- деплои и смену версии образа;
- изменения CPU и memory limits, requests, числа реплик и правил autoscaling;
- миграции базы данных, создание индексов, compaction и резервное копирование;
- обновления node, ядра, драйверов и сетевых политик;
- изменения DNS, сертификатов, маршрутизации, балансировщика и внешнего провайдера.
Совпадение по времени формирует гипотезу. Подтвердите ее воспроизводимостью, логами, трассировкой или сравнением версии до и после изменения. Если после возврата конфигурации latency нормализовалась, уверенность выше, но проверьте, не совпало ли восстановление с окончанием batch-задачи или сетевого сбоя.
Корректная корреляция сокращает MTTR: дежурный видит не набор разрозненных алертов, а цепочку «изменение, симптом, зависимость, причина, действие». Для контроля метрик, логов и визуализации в одном процессе удобно использовать связку Prometheus и Grafana, а требования к сборщикам и дашбордам можно сверить с практическим руководством по мониторингу ресурсов Kubernetes.
Практический чек-лист: от алерта до решения
Используйте чек-лист при дежурстве, разборе инцидента и проверке изменений. Он помогает отделить подтвержденную причину от предположения и сохранить данные для следующего похожего случая.
Что зафиксировать в карточке инцидента
- Симптом и влияние: latency, error rate, throughput, затронутый SLO, количество запросов и пользователей.
- Временное окно: начало, пик, восстановление, повторные эпизоды и сопоставимый нормальный период.
- Область: сервис, endpoint, регион, zone, node, namespace, pod, интерфейс и зависимость.
- Метрики: CPU, load average, run queue, throttling, MemAvailable, swap, OOM, disk latency, IOPS, queue, retransmits, drops и DNS latency.
- Контекст: логи, трейсы, события, деплои, изменения конфигурации, плановые работы и действия внешних систем.
- Гипотезы: подтвержденная причина, отвергнутые варианты и уровень уверенности для каждого вывода.
- Действие: что изменили, кто выполнил, в какое время и какой риск имело изменение.
- Результат: как изменились те же метрики после действия и вернулся ли сервис к baseline.
Записывайте альтернативные гипотезы, даже если одна кажется очевидной. Например, рост CPU может быть следствием ретраев, а не первопричиной. Такая запись предотвращает повторный поиск уже проверенного варианта и помогает улучшить алертинг.
Когда масштабировать, менять код или продолжать наблюдение
| Подтвержденная причина | Действие | Проверка результата |
|---|---|---|
| Устойчивый дефицит CPU или CPU limit | Изменить число реплик, requests и limits после проверки профиля нагрузки | Сравнить latency, throughput, throttling и стоимость ресурсов |
| Утечка памяти или слишком крупный рабочий набор | Исправить удержание объектов, кеш или размер batch-задачи; временно увеличить лимит при контроле риска | Проверить working set между рестартами, OOM и restart count |
| Медленное хранилище | Изменить профиль запросов, расписание backup, параметры базы или конфигурацию дисков | Сравнить await, queue, fsync, p99 и ошибки записи |
| Заполненный том или inode | Удалить безопасные временные данные и настроить retention | Проверить свободное место, inode и успешность операций записи |
| Сетевая проблема | Исправить маршрут, DNS, MTU, NetworkPolicy, лимиты соединений или зависимость | Проверить retransmits, drops, connect time, retry rate и traces |
| Ошибка приложения или неэффективный запрос | Изменить код, запрос, параллелизм или retry policy | Сравнить профиль запроса, CPU, ошибки и latency на сопоставимой нагрузке |
| Краткий пик без влияния на SLO | Зафиксировать событие и продолжить наблюдение | Проверить повторяемость и расход error budget |
Масштабируйте систему при устойчивом дефиците ресурса, меняйте код или запросы при неэффективном потреблении, исправляйте конфигурацию при ограничении контейнера, диска или сети. Для контролируемого эксперимента с числом vCPU, объемом RAM и дисковым профилем можно использовать облачный стенд Timeweb Cloud, сохраняя исходные метрики и одинаковый сценарий нагрузки.
После каждого изменения повторите измерение на том же типе нагрузки и сопоставимом временном окне. Временное увеличение лимита, отключение ретраев или ручное переключение трафика снижает симптом, но не всегда устраняет первопричину. Закройте расследование только после проверки восстановления SLO, отсутствия новых ошибок и обновления дашборда или алерта.
Качественный анализ производительности дает проверяемую цепочку: пользовательский эффект, временной ряд, сочетание метрик, подтверждение логами и трейcами, связь с событием и измеренный результат действия. Такой подход помогает быстрее находить узкое место, снижать MTTR и не тратить ресурсы на реакцию по одному случайному пику.