Portál AbcLinuxu, 13. května 2024 05:26


Dotaz: CPU vytížení procesu

14.9.2013 15:39 pavel
CPU vytížení procesu
Přečteno: 1326×
Odpovědět | Admin
Dobrý den,

potřebuji získat CPU vytížení procesu, který mi běží několik týdnů, takže příkaz "ps" je pro mně nepoužitelný. Existuje nějaká méně krkolomná konstrukce, než kterou mám teď?
top -b -n 1 -p "$mujprocespid"|grep "$mujprocespid" |awk '{ print $9 }'

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

14.9.2013 19:09 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: CPU vytížení procesu
Odpovědět | | Sbalit | Link | Blokovat | Admin

Ja len ze ten grep je nepotrebny:

top -b -n 1 -p "$pid" | awk '/'"$pid"'/{ print $9 }'

Viem, ze si cakal viac, ale jednoduchsie ako to mas, to ja nepoznam.

14.9.2013 19:59 pavel
Rozbalit Rozbalit vše Re: CPU vytížení procesu
Čekal, přesto díky za odpověď.

Nebylo by možné to získat jinak - mám strach z výběru toho devátého pole - něco jako "vyřízni sloupec, který obsahuje %CPU a z něj vyber to vytížení procesoru". Může se stát, že se změní číslo pole s vytížením procesu.

Jinak to /'"$pid"'/ je pěkné, trochu mi to připomíná konstrukci pro úpravu datumu v mém skriptu:

DATE1=$(echo $USERDATE1 | sed 's|\(.*\)/\(.*\)/\(.*\)|\3-\2-\1|') ...

15.9.2013 19:33 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: CPU vytížení procesu

Nic extra, ale aspon sa netreba spoliehat na 9. pole, co popravde aj mna napadlo este pred odoslanim prveho prispevku.

pid=""; while $(ps "$pid" &>/dev/null); do top -d 0.1 -b -n 1 -p "$pid" | awk '/'%CPU'/{for (i = 1; i <= NF; i++) ( $i ~ "%CPU") && field=i; getline; print $field;}'; done
15.9.2013 19:35 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: CPU vytížení procesu

-d parameter pre top si samozrejme nastav sam, hoc to, co potato spominal, bude zrejme viac davat realne vysledky.

15.9.2013 20:03 potato
Rozbalit Rozbalit vše Re: CPU vytížení procesu
Celé spouštění topu tady dělá to počkání časový interval -d a vydělení jeho délkou.
15.9.2013 22:30 pavel
Rozbalit Rozbalit vše Re: CPU vytížení procesu
Kruci, teď jsem to dosmolil a vidím, že jsem si mohl ušetřit čas. Stejně to tu dám:
#!/bin/bash

myprogram="ipolldevd"
pidmyprogram="$(pgrep -x $myprogram)"
choosecolumn="%CPU"

cpuloadmyprogram=$(top -b -n 1 -p "$pidmyprogram" | awk '
NR==FNR { for(i=1;i<=NF;i++) if ($i ~ "'"$choosecolumn"'") { nrcolumn=""i""; next }}
/'"$pidmyprogram"'/{ print $nrcolumn }')

echo $cpuloadmyprogram
Řešení 1× (mikky)
15.9.2013 10:25 potato
Rozbalit Rozbalit vše Re: CPU vytížení procesu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Dobře definovaná veličina je celkový spotřebovaný čas, tedy položka 14 a další v /proc/PID/stat. Vytížení procesoru v daný okamžik je nějaká vyhlazená derivace. Takže například přečíst jednou, počkat, přečíst podruhé, vydělit časovým intervalem a $(getconf CLK_TCK).
16.9.2013 20:43 pavel
Rozbalit Rozbalit vše Re: CPU vytížení procesu
Takže například přečíst jednou, počkat, přečíst podruhé, vydělit časovým intervalem a $(getconf CLK_TCK).
Proč to ještě dělit getconf CLK_TCK?

Nestačí jenom:
(přečíst_jednou - přečíst_podruhé)/časový_interval 
17.9.2013 17:15 potato
Rozbalit Rozbalit vše Re: CPU vytížení procesu
CPU čas v /proc/PID/stat se měří v jednotkách _SC_CLK_TCK-krát kratších než sekunda -- viz proc(1). Takže samozřejmě stačí vydělit, pokud v těchto jednotkách měříš i časový interval. Počítal jsem, že ho budeš měřit spíš v sekundách...
17.9.2013 18:17 pavel
Rozbalit Rozbalit vše Re: CPU vytížení procesu
Asi zatím zůstanu u toho příkazu "top" ...

Takže asi nějak takto:
#Total time spent for the process: total_time = utime + stime
#If we want to include the time from children processes:
#total_time = total_time + cutime + cstime
#cpu_usage = 100 * ((total_time / Hertz) / seconds)

#!/bin/bash

myprogram="ipolldevd"
pidmyprogram="$(pgrep -x $myprogram)"
seconds="5"
hertz="$(getconf CLK_TCK)"

cputime1=$(cat /proc/$pidmyprogram/stat | awk '{print "(" , $14, " + ", $15, ")"}' | bc)
sleep "$seconds"
cputime2=$(cat /proc/$pidmyprogram/stat | awk '{print "(" , $14, " + ", $15, ")"}' | bc)
cpuload=$(echo "100*(${cputime2} - ${cputime1})/$seconds/$hertz" | bc)
echo $cputime
Díky za radu s tím "getconf CLK_TCK". Podle tohoto "klíčového" slova se už na internetu zobrazí odkazy na měření zátěže CPU. Vyřešeno, díky.
21.9.2013 20:58 pavel
Rozbalit Rozbalit vše Re: CPU vytížení procesu
Ještě bych měl jeden dotaz.

Ten příkaz "getconf CLK_TCK" ve skutečnosti zobrazí počet "tiků" procesoru za sekundu, tedy vlastně kmitočet v Hz.

Ten je vždy stejný během měřeného časového intervalu? Platí to i pro tzv. "beztikové" kernely s nastaveným časovačem "dynamic ticks"?

Pokud ne, neměl by se správně měřit:

"getconf CLK_TCK" pro zadaný časový interval = počet "tiků" kernelu během měřeného časového intervalu / měřený časový interval?

Pokud ano, tak jak to měřit?
18.1.2014 23:55 pavel
Rozbalit Rozbalit vše Re: CPU vytížení procesu
Odpovím si sám. Tady je skript pro výpočet vytížení procesoru programem "ipolldevd".
#!/bin/bash

myprogram="ipolldevd"
pidmyprogram="$(pgrep -x $myprogram)"
seconds="2"
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null)

START=`awk 'BEGIN {sum = 0} /^cpu /{ for (i = 1; i <= NF; ++i) { sum += $i } } END {print sum}' /proc/stat`
cputime1=$(cat /proc/$pidmyprogram/stat | awk '{print "(" , $14, " + ", $15, ")"}' | bc)
sleep "$seconds"
cputime2=$(cat /proc/$pidmyprogram/stat | awk '{print "(" , $14, " + ", $15, ")"}' | bc)
STOP=`awk 'BEGIN {sum = 0} /^cpu /{ for (i = 1; i <= NF; ++i) { sum += $i } } END {print sum}' /proc/stat`
cpuload=$(echo "${CORES} * 100 * (${cputime2} - ${cputime1})/(${STOP} - ${START})" | bc)
echo "Celkova zatez programu = $cpuload procent"

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.