GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie erhalte ich die gesamte CPU-Auslastung einer Anwendung aus /proc/pid/stat?

Vorbereitung

Um die CPU-Auslastung für einen bestimmten Prozess zu berechnen, benötigen Sie Folgendes:

  1. /proc/uptime
    • #1 Betriebszeit des Systems (Sekunden)
  2. /proc/[PID]/stat
    • #14 utime - CPU-Zeit, die im Benutzercode verbracht wird, gemessen in Takten
    • #15 stime - Für den Kernel-Code aufgewendete CPU-Zeit, gemessen in Uhr-Ticks
    • #16 cutime - Erwartete Kinder In Benutzercode verbrachte CPU-Zeit (in Takten )
    • #17 cstime - Erwartete Kinder Für den Kernel-Code aufgewendete CPU-Zeit (in Takten )
    • #22 starttime - Zeit, zu der der Prozess gestartet wurde, gemessen in Ticks
  3. Hertz (Anzahl der Takte pro Sekunde) Ihres Systems.
    • In den meisten Fällen getconf CLK_TCK kann verwendet werden, um die Anzahl der Takte zurückzugeben.
    • Die sysconf(_SC_CLK_TCK) Der C-Funktionsaufruf kann auch verwendet werden, um den Hertz-Wert zurückzugeben.

Berechnung

Zuerst ermitteln wir die Gesamtzeit, die für den Vorgang aufgewendet wird:

total_time = utime + stime

Wir müssen uns auch entscheiden, ob wir die Zeit von Kinderprozessen einbeziehen wollen. Wenn ja, dann fügen wir diese Werte zu total_time hinzu :

total_time = total_time + cutime + cstime

Als nächstes erhalten wir die verstrichene Gesamtzeit in Sekunden seit Beginn des Prozesses:

seconds = uptime - (starttime / Hertz)

Schließlich berechnen wir den Prozentsatz der CPU-Auslastung:

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

Siehe auch

Top und ps zeigen nicht dasselbe CPU-Ergebnis

So erhalten Sie die gesamte CPU-Auslastung in Linux (c++)

Berechnen der CPU-Auslastung eines Prozesses in Linux


Wenn Sie berechnen müssen, wie viel CPU-% von einem Prozess in den letzten 10 Sekunden verbraucht wurde

  1. gettotal_time (13+14) in Jiffies => t1starttime(22) in Jiffies => s1

- Verzögerung von 10 Sekunden

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

t2-t1 *100 / s2 - s1 würde nicht % ??

geben

Ja, das kann man so sagen. Sie können diese Werte mit der Formel in Sekunden umrechnen:

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

Der HZ-Wert ist konfigurierbar - erfolgt zur Kernel-Konfigurationszeit.


Hier ist meine einfache Lösung, geschrieben in BASH . Es ist ein Linux/Unix-Systemmonitor und Prozessmanager durch Procfs wie "top " oder "ps ". Es gibt zwei Versionen, eine einfache monochrome (schnell) und eine farbige Version (etwas langsam, aber nützlich, insbesondere zum Überwachen des Status von Prozessen). Ich habe die Sortierung nach CPU-Auslastung vorgenommen.

https://github.com/AraKhachatryan/top

  • Zeit , Zeit , Cuttime , cstime , Startzeit Wird verwendet, um die CPU-Auslastung abzurufen und erhalten von /proc/[pid]/stat Datei.

  • Zustand , ppid , Priorität , nett , Anzahl_Threads Parameter erhalten Sie auch von /proc/[pid]/stat Datei.

  • Einwohner und data_and_stack Parameter, die zum Abrufen der Speichernutzung verwendet werden und erhalten von /proc/[pid]/statm Datei.


    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. Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

  2. Linux – Informationen über die Speichernutzung eines Prozesses von /proc/pid/smaps abrufen?

  3. So begrenzen Sie die CPU-Auslastung in einem Anwendungspool in IIS

  4. Wie erhalte ich die Anzahl der CPUs/Kerne in Linux über die Befehlszeile?

  5. Wie bekomme ich die Prozess-ID, um einen Nohup-Prozess zu beenden?

So zeigen Sie die CPU-Auslastung über die Befehlszeile an

So erhalten Sie die CPU-Auslastung eines einzelnen Prozesses in Linux

Die Dateien /proc/mounts, /etc/mtab und /proc/partitions verstehen

So erhalten Sie die CPU-Auslastung

Wie finde ich heraus, aus welchem ​​Ordner ein Prozess läuft?

Wie sind CPU-Zeit und CPU-Auslastung gleich?