Какие ресурсы могут ограничивать производительность системы?

«Какие ресурсы могут ограничивать производительность системы?» — вопрос из категории Архитектура и DevOps-практики, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В моей практике при разборе инцидентов производительности я в первую очередь проверяю следующие ключевые ресурсы:

  1. CPU (Центральный процессор):

    • Высокая утилизация (load average, %usr/%sys): Указывает на нехватку вычислительной мощности. В облачных средах также важно отслеживать CPU throttling, когда виртуальная машина ограничивается гипервизором.
    • Контекстные переключения (context switches): Большое количество переключений между процессами/потоками создает накладные расходы.
  2. Память (RAM):

    • Нехватка свободной памяти: Приводит к активному использованию свопа (swap), что резко снижает производительность из-за дисковых операций.
    • OOM Killer (Out-Of-Memory Killer): В Linux ядро может принудительно завершить процесс при критической нехватке памяти.
  3. Ввод-вывод диска (Disk I/O):

    • Высокая задержка (latency) и время ожидания (await): Критично для баз данных и дисковых очередей.
    • Ограниченная пропускная способность (throughput): Разница между HDD и SSD/ NVMe может быть на порядки.
    • Исчерпание IOPS (Input/Output Operations Per Second): Частое ограничение в облачных блочных хранилищах.
  4. Сеть (Network):

    • Полоса пропускания (bandwidth): Исчерпание канала.
    • Задержка (latency) и потери пакетов (packet loss): Критично для распределенных систем и микросервисов.
  5. Файловые дескрипторы (File Descriptors):

    • Достижение лимита на открытые файлы, сокеты или каналы приводит к ошибкам EMFILE или ENFILE.

Пример базового мониторинга в Linux для быстрой диагностики:

# Общая картина нагрузки (CPU, память, процессы)
top -n 1 -b | head -20

# Детальная статистика по дискам (util%, await, r/s, w/s)
iostat -x 1 5

# Использование памяти (своп, кэш, доступная память)
free -h

# Сетевой трафик и ошибки по интерфейсам
iftop -n -P

# Проверка лимитов файловых дескрипторов для процесса (например, Nginx)
cat /proc/$(pgrep nginx | head -1)/limits | grep "open files"

Для постоянного наблюдения мы настраиваем сбор этих метрик в Prometheus (node_exporter) с алертами в Alertmanager при достижении пороговых значений.