GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je obtenir l'utilisation totale du processeur d'une application à partir de /proc/pid/stat ?

Préparation

Pour calculer l'utilisation du processeur pour un processus spécifique, vous aurez besoin des éléments suivants :

  1. /proc/uptime
    • #1 disponibilité du système (secondes)
  2. /proc/[PID]/stat
    • #14 utime - Temps CPU passé dans le code utilisateur, mesuré en tic d'horloge
    • #15 stime - Temps CPU passé dans le code du noyau, mesuré en tic d'horloge
    • #16 cutime - Enfants attendus Temps CPU passé dans le code utilisateur (en tic d'horloge )
    • #17 cstime - Enfants attendus Temps CPU passé dans le code du noyau (en tic d'horloge )
    • #22 starttime - Heure à laquelle le processus a commencé, mesurée en tickets d'horloge
  3. Hertz (nombre de tops d'horloge par seconde) de votre système.
    • Dans la plupart des cas, getconf CLK_TCK peut être utilisé pour renvoyer le nombre de ticks d'horloge.
    • Le sysconf(_SC_CLK_TCK) L'appel de la fonction C peut également être utilisé pour renvoyer la valeur en hertz.

Calcul

Nous déterminons d'abord le temps total passé pour le processus :

total_time = utime + stime

Nous devons également décider si nous voulons inclure le temps des processus enfants. Si c'est le cas, nous ajoutons ces valeurs à total_time :

total_time = total_time + cutime + cstime

Ensuite, nous obtenons le temps total écoulé en secondes depuis le début du processus :

seconds = uptime - (starttime / Hertz)

Enfin, nous calculons le pourcentage d'utilisation du processeur :

cpu_usage = 100 * ((total_time / Hertz) / seconds)

Voir aussi

Top et ps n'affichent pas le même résultat CPU

Comment obtenir l'utilisation totale du processeur sous Linux (c++)

Calcul de l'utilisation du processeur d'un processus sous Linux


Si besoin de calculer le pourcentage de CPU utilisé par un processus au cours des 10 dernières secondes

  1. gettotal_time (13+14) en jiffies => t1starttime(22) en jiffies => s1

--délai de 10 secondes

total_time (13+14) en jiffies => t2starttime(22) en jiffies => s2

t2-t1 *100 / s2 - s1ne donnerait pas le % ??


Oui, vous pouvez le dire. Vous pouvez convertir ces valeurs en secondes à l'aide de la formule :

      sec = jiffies / HZ ; here - HZ = number of ticks per second

La valeur HZ est configurable - effectuée au moment de la configuration du noyau.


Voici ma solution simple écrite en BASH . Il s'agit d'un moniteur système Linux/Unix et d'un gestionnaire de processus via procfs, comme "top " ou "ps ". Il existe deux versions simple monochrome (rapide) et une version colorée (un peu lente, mais utile surtout pour surveiller l'état des processus). J'ai fait un tri par utilisation du processeur.

https://github.com/AraKhachatryan/top

  • utime , temps , cutime , cstime , heure de début utilisé pour obtenir l'utilisation du processeur et obtenu depuis /proc/[pid]/stat fichier.

  • état , ppid , priorité , sympa , num_threads paramètres obtenus également à partir de /proc/[pid]/stat fichier.

  • résident et data_and_stack paramètres utilisés pour obtenir l'utilisation de la mémoire et obtenu depuis /proc/[pid]/statm fichier.


    function my_ps
    {
        pid_array=`ls /proc | grep -E '^[0-9]+$'`
        clock_ticks=$(getconf CLK_TCK)
        total_memory=$( grep -Po '(?<=MemTotal:\s{8})(\d+)' /proc/meminfo )

        cat /dev/null > .data.ps

        for pid in $pid_array
        do
            if [ -r /proc/$pid/stat ]
            then
                stat_array=( `sed -E 's/(\([^\s)]+)\s([^)]+\))/\1_\2/g' /proc/$pid/stat` )
                uptime_array=( `cat /proc/uptime` )
                statm_array=( `cat /proc/$pid/statm` )
                comm=( `grep -Po '^[^\s\/]+' /proc/$pid/comm` )
                user_id=$( grep -Po '(?<=Uid:\s)(\d+)' /proc/$pid/status )

                user=$( id -nu $user_id )
                uptime=${uptime_array[0]}

                state=${stat_array[2]}
                ppid=${stat_array[3]}
                priority=${stat_array[17]}
                nice=${stat_array[18]}

                utime=${stat_array[13]}
                stime=${stat_array[14]}
                cutime=${stat_array[15]}
                cstime=${stat_array[16]}
                num_threads=${stat_array[19]}
                starttime=${stat_array[21]}

                total_time=$(( $utime + $stime ))
                #add $cstime - CPU time spent in user and kernel code ( can olso add $cutime - CPU time spent in user code )
                total_time=$(( $total_time + $cstime ))
                seconds=$( awk 'BEGIN {print ( '$uptime' - ('$starttime' / '$clock_ticks') )}' )
                cpu_usage=$( awk 'BEGIN {print ( 100 * (('$total_time' / '$clock_ticks') / '$seconds') )}' )

                resident=${statm_array[1]}
                data_and_stack=${statm_array[5]}
                memory_usage=$( awk 'BEGIN {print( (('$resident' + '$data_and_stack' ) * 100) / '$total_memory'  )}' )

                printf "%-6d %-6d %-10s %-4d %-5d %-4s %-4u %-7.2f %-7.2f %-18s\n" $pid $ppid $user $priority $nice $state $num_threads $memory_usage $cpu_usage $comm >> .data.ps

            fi
        done

        clear
        printf "\e[30;107m%-6s %-6s %-10s %-4s %-3s %-6s %-4s %-7s %-7s %-18s\e[0m\n" "PID" "PPID" "USER" "PR" "NI" "STATE" "THR" "%MEM" "%CPU" "COMMAND"
        sort -nr -k9 .data.ps | head -$1
        read_options
    }


Linux
  1. Comment obtenir l'utilisation totale du processeur sous Linux en utilisant C++

  2. Comment obtenir le nombre de CPU/cœurs sous Linux depuis la ligne de commande ?

  3. Comment obtenir l'utilisation du processeur

  4. Comment obtenir l'ID de processus pour tuer un processus nohup ?

  5. Comment savoir à partir de quel dossier un processus est en cours d'exécution ?

Comment afficher l'utilisation du processeur à partir de la ligne de commande

Comment obtenir l'utilisation du processeur d'un seul processus sous Linux

Comprendre les fichiers /proc/mounts, /etc/mtab et /proc/partitions

Comment obtenir le chemin d'un processus sous Unix / Linux

Comment calculer l'utilisation CPU d'un processus par PID sous Linux à partir de C ?

En quoi le temps CPU et l'utilisation du CPU sont-ils identiques ?