Prometheus alerte sur cpu usage kernel faux positifs

Posté par cjacques le 24/07/2024
RÉSOLU

cjacques

Membre depuis le 27/10/2023

Salut les sres j'ai un souci avec nos alertes cpu sur prometheus. on a des serveurs qui alertent pour cpu usage > 80% mais quand je me co dessus le top montre que c'est le kernel qui bosse genre 50-60% de temps en 'system' ou 'iowait' et nos apps sont peinardes. comment on filtre ça pour avoir des alertes pertinentes sur le vrai usage appli ?

# exemple de notre alerte
(1 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100 > 80

Commentaires

benoit-lemonnier

Membre depuis le 28/06/2021

salut. ouais le cpu 'system' et 'iowait' c'est le piège. la métrique `node_cpu_seconds_total` agrège tout. pour avoir l'usage appli tu dois exclure certains modes. le `mode="idle"` c'est bien mais il inclut aussi le `iowait` dedans si mes souvenirs sont bons.

jacques-gilbert

Membre depuis le 15/07/2019

non `idle` c'est le temps où le cpu fait rien. `iowait` c'est le cpu qui attend de l'io. un cpu en `iowait` n'est pas utilisé par ton appli. il attend. donc si `iowait` est haut ton app est bloquée sur de l'io pas sur du calcul.

benoit-lemonnier

Membre depuis le 28/06/2021

ah oui my bad `iowait` est une catégorie à part entière. donc si tu veux le cpu actif *utile* à tes apps tu devrais faire `mode!="idle"` et `mode!="iowait"` et `mode!="steal"` si t'es en vm.

cjacques

Membre depuis le 27/10/2023

ok je vois la nuance. donc si j'ai bien compris je devrais exclure `idle` et `iowait` de mon calcul ? et `steal` si je suis en VM. on est sur des vms donc je vais ajouter `steal` aussi.

benoit-lemonnier

Membre depuis le 28/06/2021

exactement. ta query devrait ressembler à un truc du genre :

100 - (avg by (instance) (rate(node_cpu_seconds_total{mode=~"idle|iowait|steal"}[5m])) * 100)
ça te donnera le pourcentage de cpu qui est *réellement* utilisé pour faire du travail utile (user + system non-iowait).

jacques-gilbert

Membre depuis le 15/07/2019

ouais ou plus simple tu peux sommer les modes qui t'intéressent genre `sum by (instance) (rate(node_cpu_seconds_total{mode=~"user|system"}[5m])) * 100` si tu veux juste user et system pur hors iowait/idle.

cjacques

Membre depuis le 27/10/2023

j'ai testé la première query avec `mode=~"idle|iowait|steal"` et ça change tout. les alerts sont beaucoup plus pertinentes maintenant. c'était un vrai point de douleur. merci les gars c'est top !

Laisser une réponse

Vous devez être connecté pour poster un message !

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire