Quel est le moyen le plus équitable de surveiller le temps total de calcul – par utilisateur?

Sur un système multi-utilisateur, je souhaite mesurer l’utilisation du processeur de chaque utilisateur en secondes. Pour les besoins de cette mesure, je suppose que si un PID appartient à un utilisateur, cet utilisateur est à l’origine du temps CPU, c’est-à-dire que j’ignore les démons et le kernel.

Actuellement, je le fais toutes les cinq secondes:

  1. Obtenez chaque utilisateur et les PID qu’ils exécutent via ps aux
  2. Pour chaque PID, obtenez x , la sum de l’ utime, du cutime, du temps et du cstime à partir de /proc/[pid]/stat
  3. calculer t = x / interval (l’intervalle n’est pas toujours exactement 5 secondes lorsqu’il y a une charge élevée)

Si je lance ceci, j’obtiens des valeurs recherchées. Par exemple: Un utilisateur de ce système tournait en python ( while True: pass ) et le système affichait environ 750 millisecondes de temps processeur par seconde. Lorsque le système s’est arrêté pendant un instant, il a signalé 1 600 ms pour un inverval d’une seconde. Ce qui semble à peu près correct, mais je comprends que ces valeurs peuvent être trompeuses, surtout si je ne les comprends pas vraiment .

Voici donc ma question:

Quelle est la manière juste et correcte de mesurer la charge du processeur utilisateur par utilisateur?

La méthode doit être assez précise. Il peut y avoir plusieurs centaines d’utilisateurs sur ce système. L’extraction de pourcentages de ps aux ne sera donc pas assez précise, en particulier pour les threads éphémères que de nombreux logiciels aiment générer.

Bien que cela puisse être compliqué, je sais absolument que c’est possible. C’était mon sharepoint départ:

Le kernel garde trace du temps de création d’un processus ainsi que du temps CPU qu’il utilise au cours de sa vie. Chaque fois que le temps passe, le kernel met à jour le temps que le processus actuel a passé en mode système et en mode utilisateur. – (à partir du projet de documentation Linux )

La valeur que je suis après correspond au nombre de secondes (ou de jiffies) qu’un utilisateur a dépensées pour le processeur, et non à un pourcentage de la charge du système ou de l’utilisation du processeur.

Il est important de mesurer le temps CPU lorsque les processus sont toujours en cours d’exécution. Certains processus ne durent qu’une demi-seconde, certains durent plusieurs mois. Nous devons capturer les deux types afin de pouvoir comptabiliser le temps de calcul des utilisateurs avec une granularité fine.

On dirait que vous avez besoin d’une comptabilité de processus.

http://www.faqs.org/docs/Linux-mini/Process-Accounting.html

Sur Ubuntu, les outils de comptabilité des processus sont dans le paquet acct Installer acct

Pour obtenir un rapport par utilisateur, exécutez

 sa -m 

Une des réponses les plus évidentes consiste simplement à étendre ce que vous faites actuellement.

Je suis tombé sur ce processus de moniteur pour utiliser les scripts bash et mysql pour suivre le temps processeur des utilisateurs, mais il s’étalait sur une période beaucoup plus longue que celle dont vous parlez.

J’espère que cela vous donnera plus d’idées sur la direction que vous souhaitez prendre.

http://www.dba-oracle.com/t_oracle_unix_linux_vmstat_capture.htm

Cela donnera une ligne pour chaque utilisateur indiquant le nom d’utilisateur et leur temps total de calcul:

 ps -w -e --no-header -o uid,user \ | sort -u \ | while read uid user; do echo -e "$user\t"$( ps --no-headers -u $uid --cumulative -o time \ | sed -es/:/*3600+/ -es/:/*60+/ \ | paste -sd+ \ | bc ); done 

Cela permettra également de gérer les processus qui ont fonctionné pendant des jours .. vous ne savez pas comment développer des semaines / mois / années ..

 ps -w -e --no-header -o uid,user \ | sort -u \ | while read uid user; do echo -e "$user\t"$( ps --no-headers -u $uid --cumulative -o time \ | sed -es/-/*86400+/ -es/:/*3600+/ -es/:/*60+/ | paste -sd+ \ | bc ); done