Thank you for reading this post, don't forget to subscribe!
Высокая нагрузка на процессор часто является причиной проблем в работе сервера и, как следствие, всей системы в целом.
Давайте разберемся с CPU usage с помощью системы мониторинга Prometheus и ее компонента node_exporter
!
Считаем, что необходимые компоненты у нас уже установлены и настроены.
В таком случае, на странице метрик, которые собирает компонент node_exporter
(например, http://[IP-адрес сервера]:9100/metrics), можем найти примерно следующее:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
... # 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... |
[/codesyntax]
Данные для этих метрик берутся из файла /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)
.