Prometheus: разбираемся с CPU Usage

Mar 3, 2016 21:43 · 363 words · 2 minute read prometheus monitoring

Высокая нагрузка на процессор часто является причиной проблем в работе сервера и, как следствие, всей системы в целом.

Давайте разберемся с CPU usage с помощью системы мониторинга Prometheus и ее компонента node_exporter!

Считаем, что необходимые компоненты у нас уже установлены и настроены.

В таком случае, на странице метрик, которые собирает компонент node_exporter (например, http://[IP-адрес сервера]:9100/metrics), можем найти примерно следующее:

...
# HELP node_cpu Seconds the cpus spent in each mode.
# TYPE node_cpu counter
node_cpu{cpu="cpu0",mode="guest"} 0
node_cpu{cpu="cpu0",mode="idle"} 6.3011063e+06
node_cpu{cpu="cpu0",mode="iowait"} 39236.91
node_cpu{cpu="cpu0",mode="irq"} 2.59
node_cpu{cpu="cpu0",mode="nice"} 182.28
node_cpu{cpu="cpu0",mode="softirq"} 187644.54
node_cpu{cpu="cpu0",mode="steal"} 0
node_cpu{cpu="cpu0",mode="system"} 393626.47
node_cpu{cpu="cpu0",mode="user"} 976930.22
node_cpu{cpu="cpu1",mode="guest"} 0
node_cpu{cpu="cpu1",mode="idle"} 7.44783521e+06
node_cpu{cpu="cpu1",mode="iowait"} 51571.19
node_cpu{cpu="cpu1",mode="irq"} 0
node_cpu{cpu="cpu1",mode="nice"} 153.49
node_cpu{cpu="cpu1",mode="softirq"} 601.86
node_cpu{cpu="cpu1",mode="steal"} 0
node_cpu{cpu="cpu1",mode="system"} 75666.13
node_cpu{cpu="cpu1",mode="user"} 247391.94
node_cpu{cpu="cpu2",mode="guest"} 0
node_cpu{cpu="cpu2",mode="idle"} 7.54422889e+06
node_cpu{cpu="cpu2",mode="iowait"} 12677.1
node_cpu{cpu="cpu2",mode="irq"} 0
node_cpu{cpu="cpu2",mode="nice"} 243.15
node_cpu{cpu="cpu2",mode="softirq"} 671.72
node_cpu{cpu="cpu2",mode="steal"} 0
node_cpu{cpu="cpu2",mode="system"} 56869.98
node_cpu{cpu="cpu2",mode="user"} 216666.62
node_cpu{cpu="cpu3",mode="guest"} 0
node_cpu{cpu="cpu3",mode="idle"} 7.5734312e+06
node_cpu{cpu="cpu3",mode="iowait"} 6059.59
node_cpu{cpu="cpu3",mode="irq"} 0
node_cpu{cpu="cpu3",mode="nice"} 184.12
node_cpu{cpu="cpu3",mode="softirq"} 730.38
node_cpu{cpu="cpu3",mode="steal"} 0
node_cpu{cpu="cpu3",mode="system"} 48522.22
node_cpu{cpu="cpu3",mode="user"} 202380.88...

Данные для этих метрик берутся из файла /proc/stat и отображают время (в USER_HZ — сотых долях секунды), которое CPU расходует на выполнение задач. Эти задачи бывают нескольких типов:

  • user — время выполнения обычных процессов, которые выполняются в режиме пользователя (в user mode, userland);
  • nice — время выполнения процессов с приоритетом nice, которые выполняются в режиме пользователя;
  • system — время выполнения процессов, которые выполняются в режиме ядра (kernel mode);
  • idle — время простоя, CPU ничем не занят;
  • iowait — время ожидания I/O операций;
  • irq и softirq — время обработки аппаратных и программных прерываний;
  • steal — время, которое используют другие операционные системы (при виртуализации);
  • guest — время выполнения «гостевых» процессов (при виртуализации).

Общее время выполнения этих задач и есть CPU usage (вместе с временем бездействия). Высокое значения времени iowait может означать, что в вашей системе узким местом является дисковая подсистема или сеть.

Чтобы оценить, чем занимается процессор, открываем в браузере веб-интерфейс Prometheus (http://[IP-адрес сервера]:9090) и в поле Expression вводим например такую метрику: irate(node_cpu{job="node"}[5m])

Чтобы получить общее значение CPU usage (сумма времен выполнения задач по всем процессорам/ядрам) для отдельного хоста можно использовать следующую метрику: sum by (mode, instance) (irate(node_cpu{job="node"}[5m]))

Для отображения общего времени работы процессора (сумма времен выполнения задач по всем процессорам/ядрам без учета типа idle) в процентах можно использовать следующую метрику: 100 - (avg by (instance) (irate(node_cpu{job="node",mode="idle"}[5m])) * 100).

tweet Share