Падение производительности автоматизированной системы чаще всего связано с исчерпанием CPU, RAM или дисковой подсистемы, регрессией после релиза, изменением конфигурации, ростом объема данных, очередей или сетевыми задержками. За первые 15 минут диагностики подтвердите деградацию по latency, throughput и error rate, определите время начала и затронутый контур, затем сопоставьте отклонения с ресурсами и последними изменениями.
Сначала зафиксируйте симптомы. Запишите p50, p95 и p99 latency, пропускную способность, процент ошибок, длину очередей, загрузку CPU и памяти, I/O wait, задержки диска, свободное место и сетевые показатели. Перезапуск сервиса до сбора этих данных может удалить полезные признаки: содержимое очередей, состояние соединений, открытые транзакции и картину нагрузки.
Практический порядок выглядит так: подтвердить факт деградации, построить временную шкалу, проверить ресурсы, сравнить рабочую и проблемную версии, проверить конфигурацию, затем перейти к данным и сети. Вывод подтверждайте повторным измерением на сопоставимой нагрузке. Единичный всплеск CPU или памяти сам по себе не доказывает причину.
Для расширенного поиска узких мест используйте практический разбор причин снижения производительности автоматизированных систем. Эта статья сосредоточена на быстрой локализации проблемы во время инцидента.
Как быстро проверить падение производительности системы: алгоритм первых 15 минут
Какие данные собрать до анализа
Зафиксируйте состояние системы в проблемный период и сравните его с последним известным нормальным состоянием. В качестве baseline подойдет аналогичный интервал предыдущего дня, среднее значение за рабочую неделю или результаты воспроизводимого бенчмарка.
- Время начала деградации с учетом часового пояса и момента появления первых ошибок.
- Список затронутых сервисов, методов API, очередей, баз данных, пользователей или площадок.
- p50, p95 и p99 latency. Среднее значение часто скрывает задержки у небольшой, но критичной доли запросов.
- Throughput: число запросов, заданий или сообщений за единицу времени.
- Error rate, тайм-ауты, коды ответов и количество повторных попыток.
- Загрузка CPU, load average, run queue, CPU throttling и steal time виртуальной машины.
- Available memory, page faults, активность swap, события OOM и рестарты контейнеров.
- I/O wait, latency накопителей, длина очереди операций, заполнение файловых систем и inode.
- Глубина очередей, возраст старейшего сообщения, скорость поступления и обработки задач.
- RTT, потери пакетов, retransmits, время DNS-резолвинга и задержка внешних API.
- Последние релизы, обновления пакетов, миграции схемы, изменения манифестов и параметров запуска.
Собирайте факты из monitoring, observability, логов и трассировок. В AI-сценариях дополнительно измеряйте latency одного запроса, throughput, потребление памяти и scaling curves, то есть изменение поведения при росте размера входных данных или числа параллельных запросов. Практический разбор метрик доступен в материале об анализе производительности системы и интерпретации показателей мониторинга.
date -Is
uptime
vmstat 1 5
iostat -xz 1 5
free -h
df -h
ss -s
Команды показывают состояние Linux-узла в момент проверки. Сохраните вывод в файл вместе с временной отметкой. Для Kubernetes дополнительно снимите состояние pod и событий:
kubectl top pods -A
kubectl get events -A --sort-by=.lastTimestamp
Как выглядит предварительный вердикт
На первом этапе формулируйте рабочую гипотезу, а не окончательный диагноз. В ней укажите, что замедлилось, когда началось, на каком слое проявляется проблема, какие факты поддерживают гипотезу и какая проверка нужна следующей.
| Наблюдение | Вероятное направление поиска | Следующая проверка |
|---|---|---|
| Latency растет, throughput почти не меняется | Медленная зависимость, блокировка, рост очереди или дисковой задержки | Трассировка запроса, slow query log, состояние очередей и I/O |
| Throughput падает, очередь растет | Насыщение воркеров, базы данных, диска или внешней зависимости | Сравнить скорость поступления и обработки задач |
| Ошибки начались сразу после релиза | Регрессия версии, миграции, переменных окружения или параметров запуска | Сопоставить временную шкалу и проверить предыдущий артефакт |
| CPU и диск свободны, latency увеличилась | Сеть, DNS, TLS, блокировки или медленный внешний API | Проверить реальный путь запроса и распределенную трассировку |
| Высокие run queue и CPU throttling | Конкуренция за процессорное время или слишком низкий лимит контейнера | Найти процесс или pod, создающий нагрузку |
| Swap активен, контейнеры перезапускаются | Дефицит памяти, утечка или ограничение memory limit | Проверить потребление, OOM events и лимиты |
Пример полезной записи: 10:20-10:45, p95 latency выросла на 180%, throughput снизился на 5%, error rate поднялся с 0,2% до 3,1%, CPU стабилен, очередь увеличивается, последний deployment в 10:17. Такая формулировка сразу направляет проверку к релизу и асинхронной обработке, а не к случайному перезапуску всех сервисов.
Нехватка ресурсов: CPU, память, диск и лимиты контейнеров
Ресурсную гипотезу проверяйте по цепочке хост - виртуальная машина - контейнер - приложение - база данных - очередь. Хост может выглядеть свободным, когда конкретный pod ограничен cgroups, база исчерпала пул соединений, а виртуальная машина теряет процессорное время из-за соседних нагрузок. Для системного чек-листа по bottleneck пригодится разбор поиска узкого места без преждевременного увеличения ресурсов.
Признаки упора в CPU и конкуренции за процессорное время
Ищите устойчивую загрузку CPU в течение нескольких минут, рост run queue, увеличение времени выполнения запросов и фоновых задач. Значение 90% CPU в течение короткого пика может быть нормальным. Если при такой загрузке одновременно растут p95 latency, очередь выполнения и время ответа, процессор становится вероятным узким местом.
Сопоставляйте load average с числом ядер. Например, load average 12 на узле с 8 логическими CPU указывает на конкуренцию за выполнение, но не объясняет ее источник. Проверьте user, system, iowait, steal и idle. Высокий steal time указывает на нехватку процессорного времени со стороны гипервизора, даже когда внутри гостевой системы нет очевидного процесса-лидера.
mpstat -P ALL 1 5
pidstat -u -w 1 5
top -H
После подтверждения нагрузки найдите конкретный процесс, pod, поток или тип запроса. В Kubernetes проверьте CPU throttling: контейнер может получать меньше времени, чем требует приложение, из-за низкого limits.cpu. Меняйте лимит после проверки фактического потребления и профиля нагрузки. Простое увеличение CPU скрывает утечку, бесконечный цикл или неудачную параллельную обработку.
Как распознать дефицит памяти и swap
Нехватка RAM часто проявляется общей медленной работой, тайм-аутами, ростом page faults и рестартами, а не понятным сообщением об ошибке. Смотрите available memory, а не только поле free. Linux использует свободную память под кэш, поэтому низкое значение free не доказывает дефицит.
free -h
vmstat 1 5
swapon --show
dmesg -T | grep -Ei 'oom|out of memory|killed process'
Постоянная активность swap на фоне роста latency указывает на давление по памяти. Проверьте потребление по процессам, размер heap, кэш приложения, page faults и длительность сборки мусора. В Kubernetes ищите события OOMKilled, рестарты pod, memory limit и фактическое потребление. Сравните рабочие экземпляры: один pod с постоянным ростом памяти может указывать на утечку, тогда как одинаковый рост у всех экземпляров чаще связан с увеличением нагрузки или размера данных.
Резкое увеличение memory limit без проверки причины опасно. Оно может привести к вытеснению памяти на уровне узла и вызвать OOM уже у других сервисов. Сначала зафиксируйте профиль потребления, найдите процесс-источник и проверьте, не изменился ли размер кэша, batch или входного объекта.
Дисковая подсистема: I/O wait, задержки и свободное место
Диск становится узким местом, когда приложение ждет чтения, записи, fsync, журналирования, checkpoint или синхронизации. Проверяйте не одну загрузку накопителя, а сразу latency, utilization, очередь операций и I/O wait. Устройство с 60% загрузки способно тормозить систему при отдельных операциях с высокой задержкой.
iostat -xz 1 5
pidstat -d 1 5
df -h
df -ih
dmesg -T | grep -Ei 'error|fail|reset|io'
Свяжите показатели с типом нагрузки. База данных может ждать WAL или журнал транзакций, сервис загрузки файлов, временные файлы, а система резервного копирования, snapshot, scrub или resilver. Заполнение тома выше 90-95% часто ухудшает работу временных файлов и фоновых операций, но точный порог зависит от файловой системы и приложения.
В хранилищах на ZFS проверьте состояние pool, свободное место, ошибки устройств, активные scrub или resilver, а для чтения оцените поведение ARC. Команды zpool status и zpool list помогают быстро исключить деградацию пула. Не запускайте тяжелые тесты записи на рабочем томе без оценки риска для данных.
Лимиты и квоты в Kubernetes, Docker и виртуальной среде
Проверьте фактические ограничения, примененные к запущенному экземпляру. В Kubernetes это requests.cpu, limits.cpu, requests.memory, limits.memory, quota namespace и ограничения на число pod. В Docker смотрите cgroups, CPU quota, memory limit, число открытых файлов и сетевые лимиты. В виртуальной машине добавьте проверку ballooning, steal time и лимитов диска.
kubectl top pods -A
kubectl describe pod app-pod
kubectl get resourcequota -A
docker stats --no-stream
ulimit -n
Отдельно проверьте пул соединений с базой данных и лимиты файловых дескрипторов. Приложение может использовать 200 рабочих потоков, но иметь pool всего на 20 соединений. В этом случае CPU будет свободен, а запросы накопятся в ожидании подключения.
Для временного тестового контура, нагрузочного сравнения или проверки масштабирования можно использовать облачные VDS, базы данных и Kubernetes в Timeweb Cloud. Сравнивайте одинаковые профили нагрузки, размеры дисков, число CPU и настройки сети, иначе результаты нельзя сопоставить с production.
Регрессия после обновления: как проверить версию, релиз и rollback
Регрессия проявляется как резкое ухудшение после изменения программного или инфраструктурного слоя. Связь по времени еще не доказывает причину, но дает сильную рабочую гипотезу. Постройте временную линию с точностью хотя бы до минуты: жалобы пользователей, изменение p95, появление ошибок, deployment, обновление пакетов, миграция схемы и изменение балансировщика.
Какие изменения сопоставить со временем деградации
- Релиз приложения, смену образа или сборки.
- Обновление библиотек, runtime, JVM, ядра, драйверов и системных пакетов.
- Миграции базы данных, изменение индексов, схемы и параметров подключения.
- Обновление ingress, Nginx, балансировщика, DNS или сетевых политик.
- Изменение autoscaling, числа реплик, affinity, requests и limits.
- Новые правила безопасности, аудит, шифрование и уровень логирования.
- Запуск резервного копирования, отчетов, индексации, очистки или другого фонового задания.
- Автоматические изменения, которые внесла другая команда или система управления конфигурацией.
Security update тоже учитывайте в журнале изменений. Пакет или служба, не связанные с кодом приложения напрямую, могут изменить фоновые процессы, управление привилегиями, правила доступа или частоту служебных операций.
Как сравнить рабочую и проблемную версии
Составьте diff не только для номера версии. Сравните digest образов, зависимости, переменные окружения, параметры запуска, манифесты, конфигурацию runtime, схему базы данных, настройки кэша и фактические лимиты контейнеров. Проверьте, что запущенный экземпляр действительно использует ожидаемый артефакт.
Для подтверждения используйте тестовый контур, канареечный экземпляр или отдельный набор запросов с одинаковым профилем нагрузки. Снимите latency, throughput, memory, error rate и scaling curves при двух версиях. Если новая версия медленнее на одинаковых данных и при одинаковом числе запросов, гипотеза регрессии получает измеримое подтверждение.
Перед production-развертыванием новых версий полезно проводить PoC и нагрузочную проверку. Для распределенной платформы, особенно active-active в двух ЦОД, тестируйте не один сервис, а полный путь запроса с балансировкой, репликацией и внешними зависимостями.
Когда rollback оправдан, а когда сначала нужны доказательства
Rollback оправдан, когда одновременно выполняются три условия: деградация началась после конкретного изменения, проблема воспроизводится на новой версии, а предыдущий артефакт проверен и совместим с текущим состоянием данных. Если миграция схемы необратима, простой откат бинарника может привести к ошибкам чтения или записи.
До отката сохраните метрики, логи, трассировки, список изменений и состояние очередей. Проверьте, не потеряются ли сообщения, не прервутся ли транзакции и не потребуется ли отдельный план для базы данных. После действия снова измерьте p50, p95, p99, throughput и error rate.
Пошаговый сценарий для случая, когда система замедлилась после обновления, описан в материале о поиске причины регресса и безопасном rollback.
Изменения конфигурации: поиск параметров, которые замедляют систему
Код может оставаться прежним, а фактическое поведение сервиса изменится из-за configuration drift. Причиной становятся ручная правка, новый ConfigMap, переменная окружения, шаблон Helm, политика платформы или незаметное изменение значения по умолчанию после обновления.
Параметры приложения, которые проверяют в первую очередь
Начните с настроек, которые напрямую влияют на параллельность, ожидание и объем работы:
| Параметр | Как проявляется ошибка | Что сравнить |
|---|---|---|
| Число воркеров и потоков | Мало воркеров увеличивает очередь, слишком много создает конкуренцию за CPU и соединения | Фактическое число процессов, потоков, pod и активных задач |
| Connection pool | Запросы ждут свободного подключения к базе или внешнему API | Размер пула, занятые соединения, время ожидания и лимит базы |
| Timeout | Долгое ожидание удерживает потоки и соединения | Тайм-ауты клиента, прокси, приложения и зависимости |
| Retry policy | Повторы увеличивают нагрузку на уже медленную зависимость | Число попыток, backoff, список повторяемых ошибок |
| Размер очереди | Малая очередь быстро отбрасывает задачи, большая скрывает отставание | Глубина, возраст сообщений и время обработки |
| Кэш | Промахи увеличивают обращения к базе или внешнему API | Hit ratio, TTL, размер, вытеснение и доступность кэша |
| Уровень логирования | Подробная запись увеличивает I/O и объем данных | Изменения уровня, частоту событий и размер логов |
| Garbage collector и runtime | Длинные паузы или частые сборки увеличивают latency | Heap, паузы GC, аллокации и параметры запуска |
Проверяйте значения в работающем процессе, а не только в файле конфигурации. Для примера, timeout 30 секунд и три повтора способны удерживать один запрос до 90 секунд, если политика повторов не ограничивает общий срок. Ретраи с малым backoff часто превращают краткую сетевую задержку в лавину новых запросов.
Сравнивайте конфигурацию с последней подтвержденной рабочей версией. Храните параметры в системе контроля изменений, фиксируйте автора и время правки, а перед применением проверяйте итоговый файл, который получает контейнер или виртуальная машина.
Конфигурация прокси, балансировщика и платформы
Проблема может находиться перед приложением. Проверьте upstream timeout, keepalive, rate limit, health checks, алгоритм балансировки, число реплик, autoscaling, affinity, ingress и DNS. Если один backend работает медленно, алгоритм с закреплением сессии способен направить к нему значительную часть трафика.
Сравните фактическую конфигурацию Nginx или ingress с рабочей версией. Проверьте, не уменьшилось ли число upstream, не изменился ли размер очереди, не включилось ли принудительное закрытие соединений. Рост числа новых TCP или TLS-соединений при стабильном throughput часто указывает на проблему keepalive или на изменение поведения прокси.
Для Kubernetes сопоставьте число реплик, распределение pod по узлам, правила affinity и события autoscaling. Масштабирование не поможет, если все экземпляры упираются в один общий ресурс, например базу данных, очередь, сетевой канал или лимит внешнего API.
Рост объема данных и нагрузки: поиск узких мест в производительности системы
Постепенная деградация часто появляется без релиза и аварии. Растут таблицы, индексы, файлы, очереди, число пользователей, размер входных объектов или количество параллельных операций. Если конфигурация неизменна, сравните текущий профиль данных с периодом, когда latency и throughput находились в норме.
Признаки того, что проблема связана с данными, а не с инфраструктурой
- Latency увеличивается плавно в течение недель или месяцев.
- Медленнее стал конкретный тип операции, например поиск по истории или формирование отчета.
- Растут таблицы, индексы, файловые каталоги, временные объекты или размер сообщений.
- Резервное копирование и фоновые задачи занимают больше времени при той же конфигурации.
- Средние показатели узла остаются стабильными, но отдельные запросы получают длинный хвост задержки.
- Очередь растет во время пиков и не успевает вернуться к baseline после снижения нагрузки.
Для проверки используйте scaling curves. Запустите одинаковый сценарий на наборах данных разного размера и измерьте latency, throughput и memory. Линейный рост времени может быть ожидаемым, а резкий перелом кривой указывает на насыщение кэша, памяти, индекса, диска или соединений.
Быстрая проверка базы данных, индексов и запросов
Начните с slow query log и топа операций по суммарному времени. Для каждой тяжелой операции проверьте план выполнения, число обработанных строк, использование индекса, сортировки, временные таблицы и обращения к диску. Сравните план с предыдущим периодом, когда система работала нормально.
- Проверьте, не изменился ли состав или порядок индексов.
- Найдите блокировки, длительные транзакции и соединения, которые удерживаются дольше обычного.
- Сопоставьте число активных соединений с connection pool приложения и лимитом базы.
- Проверьте рост временных таблиц, spill на диск и операции сортировки.
- Измерьте время checkpoint, репликации и записи журнала транзакций.
- Определите самые тяжелые таблицы, индексы и запросы за проблемный интервал.
Не создавайте и не удаляйте индекс в production без оценки нагрузки, проверки блокировок и плана отката. Индекс может ускорить чтение, но увеличить время записи и потребление диска. Перед изменением воспроизведите запрос на тестовой копии с актуальным объемом данных.
Очереди, фоновые задачи и накопление отложенной работы
Пользователь видит медленную систему, когда причина находится в асинхронном контуре. Проверьте глубину очереди, возраст старейшего сообщения, скорость поступления, скорость обработки, число активных воркеров, неудачные задачи и повторные попытки.
Сравните скорость поступления задач с пропускной способностью потребителей. Если поток поступления обозначить как λ, а скорость обработки как μ, при λ выше μ очередь будет расти даже при нормальной загрузке интерфейсного сервиса. Накопление старых сообщений подтверждает устойчивый дефицит обработки, а короткие пики с быстрым возвратом к baseline указывают на временную перегрузку.
Отдельно проверьте зависшие задачи, poison messages и бесконечные retries. Один неисправный тип задания способен занимать воркеры и блокировать нормальную работу. Увеличивайте число потребителей только после проверки базы, внешних API и лимитов, иначе очередь уменьшится на короткое время, а нагрузка на зависимость вырастет.
Сетевые проблемы: быстрая проверка задержек между сервисами
Сетевой слой проверяйте, когда CPU, RAM и диск не показывают насыщения, а latency растет между конкретными компонентами. Идите по реальному пути запроса: клиент - балансировщик - ingress или прокси - приложение - база данных - внешняя зависимость. Проверка одного узла не исключает задержку на другом участке маршрута.
Что проверить при росте latency без загрузки CPU и диска
Измерьте RTT и потери между узлами, проверьте retransmits, состояние TCP-соединений, ошибки интерфейса и изменение маршрутизации. Сравните проблемный сегмент с рабочим: другой availability zone, ЦОД, namespace или сетевой путь часто сразу показывает разницу.
ss -s
ss -ti
ip -s link
mtr -rwzc 50 10.10.10.12
tracepath 10.10.10.12
Потери пакетов и retransmits увеличивают время доставки даже при невысокой средней загрузке канала. Рост RTT без потерь может указывать на перегруженный маршрут, изменение межплощадочного пути или синхронную операцию, которая теперь проходит через удаленный сегмент.
Проверяйте соединения по каждому направлению. Клиент может получать быстрый ответ от балансировщика, тогда как приложение ждет базу данных. Распределенная трассировка помогает разложить общее время запроса на DNS, установку TCP, TLS, обработку прокси, серверное выполнение и ответ зависимости.
DNS, TLS и внешние зависимости как скрытая причина тормозов
Измерьте время DNS-резолвинга и число ошибок разрешения имен. Проверьте TTL, состояние локального кэша, доступность всех DNS-серверов и различия ответов в разных ЦОД. Задержка DNS особенно заметна, когда приложение создает новое соединение для каждого запроса.
Для TLS проверьте число новых рукопожатий, повторные подключения, срок действия сертификата и полноту цепочки. Рост времени handshake при стабильном времени обработки приложения указывает на проблему соединений, прокси, сертификатов или сетевого пути.
dig +stats service.internal
openssl s_client -connect service.internal:443 -servername service.internal
Внешняя зависимость может отвечать медленно, возвращать временные ошибки или ограничивать частоту запросов. Сопоставьте метрики приложения с latency внешнего API, кодами ответа и количеством retries. Тайм-ауты на разных слоях должны образовывать согласованную цепочку: короткий timeout прокси при длинном timeout приложения приводит к обрывам, а слишком длинные значения удерживают рабочие потоки.
Особенности проверки при работе между двумя ЦОД
В active-active архитектуре сравните показатели отдельно для каждого ЦОД. Проверьте межплощадочную задержку, потери, маршрутизацию, доступность базы и очередей из каждой площадки, синхронизацию данных и распределение трафика. Среднее значение по двум ЦОД может скрыть проблему одного сегмента.
Если запись выполняется синхронно, каждый межплощадочный RTT добавляет задержку в критический путь операции. При неравномерном распределении трафика один ЦОД может перегружаться, пока второй остается свободным. Проверяйте health checks, DNS или anycast-маршрутизацию, affinity и поведение при частичном отказе канала.
Изменения архитектуры active-active проверяйте нагрузочным тестом до включения в production. Тестируйте отказ одного ЦОД, рост межплощадочной задержки, потерю зависимости и возврат трафика. PoC должен охватывать реальные размеры данных, число соединений и фоновые операции, иначе результаты будут слишком оптимистичными.
Как подтвердить устранение деградации и настроить раннее обнаружение
Исправление считается подтвержденным, когда система вернулась к baseline на сопоставимом профиле нагрузки, а не когда исчез один заметный симптом. После изменения продолжайте наблюдение за всеми связанными слоями: приложение, ресурсы, база, очереди, сеть и внешние зависимости.
Какие метрики сравнить после исправления
| Группа | Что сравнить | Признак устойчивого результата |
|---|---|---|
| Отклик | p50, p95, p99 latency | Значения вернулись к baseline, включая хвост задержек |
| Пропускная способность | Throughput и число завершенных задач | Сервис выдерживает тот же поток без накопления очереди |
| Ошибки | Error rate, тайм-ауты, retries | Ошибки не растут после окончания пикового периода |
| Ресурсы | CPU, run queue, memory, swap, I/O wait | Нет постоянного насыщения или скрытого throttling |
| Хранилище | Disk latency, utilization, очередь операций, свободное место | Задержка не возвращается при обычной нагрузке |
| Очереди | Глубина, возраст сообщений, скорость потребления | Очередь уменьшается или удерживается около baseline |
| Сеть | RTT, packet loss, retransmits, DNS и TLS latency | Показатели сопоставимы с рабочим сегментом |
Используйте одинаковый временной интервал и одинаковый профиль нагрузки. Для воспроизводимого теста зафиксируйте размер входных данных, число параллельных запросов, версию артефакта и параметры окружения. Если p95 восстановился, но p99 остается высоким, проблема с хвостом latency еще не решена.
Минимальный чек-лист для следующего инцидента
- Зафиксировать baseline для latency, throughput, error rate, ресурсов, очередей и сети.
- Определить точное время начала деградации и перечислить затронутые компоненты.
- Сохранить метрики, логи, трассировки, события Kubernetes и состояние очередей до перезапуска.
- Проверить CPU, RAM, swap, I/O wait, latency диска, свободное место и лимиты контейнеров.
- Сопоставить проблему с релизами, обновлениями пакетов, миграциями и конфигурационными изменениями.
- Сравнить рабочую и проблемную версии на тестовом контуре или канареечном экземпляре.
- Проверить рост данных, slow query log, планы запросов, блокировки, индексы и очереди.
- Пройти сетевой маршрут от клиента к зависимости: RTT, потери, DNS, TLS, retransmits и внешние API.
- Выбрать минимально рискованное действие: остановить неудачный rollout, ограничить фоновые задачи, вернуть проверенный артефакт или изменить подтвержденный лимит.
- После исправления сравнить метрики с baseline и записать причину, действие, результат и условия воспроизведения.
Для раннего обнаружения настройте оповещения на p95 и p99 latency, error rate, рост очередей, OOM, CPU throttling, disk latency, packet loss и изменения конфигурации. Храните журнал релизов и параметров, поддерживайте доступ к логам и трассировкам, регулярно проверяйте актуальность инструкций. Такая observability сокращает время поиска и помогает отличить краткий пик от устойчивой деградации.
Главное правило оперативной диагностики: сначала собрать доказательства и локализовать слой, затем менять систему. Перезапуск, увеличение ресурсов и rollback дают результат только тогда, когда подтверждены причина, ожидаемый эффект и возможные побочные последствия.