présentation de runqstat – nouvel outil Linux Run Queue & load Average

obtenir une moyenne de charge CPU réelle sur Linux

la moyenne de charge Linux est aussi vieille que les collines, et à peu près aussi déroutante, car peu d’ingénieurs peuvent même vous dire ce qu’elle est vraiment ou comment elle est calculée.,
heureusement, Brendon Gregg a un excellent résumé, y compris son histoire, à Linux load Averages: Solving The Mystery, où vous pouvez voir le problème de base:

Linux load Average inclut les e/s

c’est aussi simple que ça. Contrairement à tous les autres systèmes de type UNIX (Solaris, AIX, etc.), Linux compte à la fois les processus en cours d’exécution/exécutables et les processus bloqués (non interruptibles), qui attendent généralement des e/s. c’est une mauvaise chose, et date d’un patch archaïque de 24 ans que Brendon a trouvé.

Pourquoi faisons-nous des soins?,

Nous nous en soucions car sur tout système à usage mixte (utilisant à la fois CPU et E / S), la moyenne de charge résultante est très variable et souvent inutile. Cela peut être particulièrement mauvais avec les systèmes hautement threadés qui peuvent provoquer des e / s, il est donc facile d’en bloquer des dizaines ou des centaines sur des disques lents.

ce que la plupart d’entre nous veulent vraiment, c’est la mesure traditionnelle Unix de la moyenne de charge, qui est le nombre moyen de processus exécutables moyennés dans le temps. Cela nous indique à quel point notre système est chargé, et nous pouvons regarder la file d’attente comme une mesure de saturation, c’est-à-dire, une file D’attente CPU continue signifie que nous sommes surchargés.

Donc, comment pouvons-nous faire cela?

nous voulons vraiment que la longueur de la file D’attente D’exécution du CPU, qui devient> 0 lorsque les processus doivent attendre le CPU. Mais il est difficile d’obtenir avec précision, et le noyau Linux n’est pas très sympathique dans ce domaine.

Tout d’abord, ce que les gens de Linux appellent la file d’attente d’exécution comprend les tâches en cours d’exécution, donc ce n’est pas vraiment la file d’attente, mais la file d’attente plus ce qui est en cours d’exécution. C’est déroutant, et vous devez donc soustraire le nombre de processeurs pour avoir une idée de la file d’attente réelle.,

Plusieurs outils peuvent obtenir la taille de file d’attente instantanée actuelle. C’est ce que montrent la colonne vmstat « r” et « sar-q”; Les deux obtiennent cela à partir de la métrique procs_running de /proc/stat.

le problème est que c’est un comptage instantané, donc c’est très bruyant et il faut faire la moyenne pour obtenir des données utiles, mais le noyau ne le fera pas pour vous. Idéalement, il y aurait une sortie du noyau dans / proc pour le processeur uniquement et les moyennes de charge des e/s uniquement, mais personne ne l’a encore créé.,

Nous avons donc besoin d’un outil qui essaie d’émuler le fonctionnement de Load Average, en échantillonnant rapidement cette taille de file d’attente instantanée et en la faisant la moyenne au fil du temps.

présentation de runqstat

runqstat fait cela — c’est un outil de ligne de commande simple écrit en Go qui, par défaut, échantillonne cette taille de file d’attente toutes les 10 ms et la fait en moyenne sur une seconde. L’objectif est une mesure stable et précise de l’occupation du système.,
Il comprend des options pour modifier la fréquence d’échantillonnage et la moyenne du temps, plus de soustraire le nombre de processeurs afin que vous puissiez simplement voir la taille réelle de la file d’attente si vous le souhaitez.

Il a également une option pour calculer le nombre de blocages moyen, que vous pouvez en théorie soustraire de la moyenne de charge pour obtenir une vue différente de la saturation du processeur (et pour voir combien de problèmes la moyenne de charge vous cause).

avec cet outil, les équipes ops ont enfin un bon moyen de surveiller la saturation de leurs serveurs Linux.

trouvez-le sur GitHub-runqstat

Share

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *