Vorbereitung
Um die CPU-Auslastung für einen bestimmten Prozess zu berechnen, benötigen Sie Folgendes:
/proc/uptime
#1
Betriebszeit des Systems (Sekunden)
/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
- 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.
- In den meisten Fällen
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
- 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 % ??
gebenJa, 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
}