4.Prometheus. CPU Usage

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"]

[/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).