Välkommen till linuxportalen.se!

Linuxportalen.se är Sveriges största och aktivaste webbplats för användare av öppen- och fri programvara.

Du besöker Linuxportalen.se som gäst vilket begränsar din möjlighet att använda webbplatsens alla funktioner. Genom att registera dig som medlem får du inte bara möjlighet att söka bland webbplatsens innehåll, skapa nya och delta i befintliga diskussioner, skapa din egen blogg, kommunicera med andra medlemmar genom privata meddelanden och delta i omröstningar. Du får också tillgång till Veckans Kadavro - en seriestrip unikt skapad för Linuxportalen.se!

Registeringen sker snabbt och är helt kostnadsfri - tveka inte, bli medlem idag!

Hard to kill

Just nu är det filmen "Hard to kill" på TV (6:an). Jag minns när filmen var ny och en recensent sammanfattade: "Filmen börjar med att Steven Segal ligger i koma i sju år, en roll han passar för...".

När det gäller Linux så spenderade jag halva fredagen med att lista ut vad siffrorna betyder i outputen från /proc/[pid-nummer]/stat. Nu har jag äntligen fått kläm på det. Man kan läsa informationen och parsa den med hjälp av en gigantisk sscanf(). Vilka formattecken som behövs finns beskrivet i "man 5 proc". Jag var ute efter att räkna ut hur mycket kräm en process tar. Med top ser man bara ett genomsnitt ner till sekundnivå, jag vill ha noggrannare info. Och det lyckades. Genom att addera utime + stime + cutime + cstime. Det ger en siffra på hur många jiffies en process tagit sedan starten. I en loop kan man se efter hur många jiffies som går mellan varje varv totalt och sedan jämföra med hur många jiffies en specifik process tagit under samma tid för att få ett mått på hur mycket processen lastar ned processorn samt hur belastningen varierar med tiden.

Alternativ för kommentarvisning

Välj ditt önskade sätt att visa kommentarerna och klicka på "Spara" för att verkställa dina ändringar.

ein.anderssons bild

Lust å lägga upp en kopia på ditt script, alt. kommando rad
-

Denna text får användas enligt CCommons BY-ND 2.5 med undantag från att den inte får kopieras, sändas eller distribueras utan att informera mig

alberts bild

Eftersom jag gjorde det på jobbet så kan jag inte lägga ut nån kod utan att fråga först.

Men jag kan berätta hur jag gjorde. Först utgick jag från följande kod för att få en fil /proc/jiffies:

  http://www.cs.usfca.edu/~cruse/cs326f04/jiffies.c

Jiffies är en global variabel inne i linuxkärnan som talar om hur många timerinterrupt som skett efter att man bootat. Antal jiffies per sekund bestäms av HZ som man kan ändra på när man kompilerar en egen kärna.

Sen läste jag som sagt ut värdena från /proc/[nummer]/stat för att få reda på hur många jiffies den enskilda processen har konsumerat. Med hjälp av dessa värden kan man räkna ut hur många procent av processorn en process tar. Jag antar att programmen ps och top gör något liknande när de räknar ut dessa värden.

För att parsa informationen i stat filen så kan man använda sscanf enligt beskrivning i "man 5 proc". Det är alltså C-kod det rör sig om.

alberts bild

Men jag kan lägga ut följande perl-script som motsvarar den inre loopen i mitt C-program:

#!/usr/bin/perl -w

# Hämta processnummer från kommandoraden
$pid = @ARGV && shift or die "Ange pid på kommandoraden";

# Läs jiffies
open(JIFFIES, "< /proc/jiffies") or die "/proc/jiffies: $! (är jiffies.ko laddad?)";
while (<JIFFIES>) {
    chomp;
    $jiffies = $_;
}
close JIFFIES;

# Läs process info
open(STAT, "< /proc/$pid/stat") or die "/proc/$pid/stat: $!";
while (<STAT>) {
    @vals = split;
}
close STAT;

# Skriv ut kärnans jiffies och processens jiffies
print $jiffies . " ";
# Processens jiffies = summan av fält 13-16
print $vals[13] + $vals[14] + $vals[15] + $vals[16] . "\n";

Och ja. För att bygga jiffies.ko, spara jiffies.c från länken i föregående inlägg, och kompilera med bifogad Makefile (spara Makefile i samma katalog som jiffies.c och skriv make).

Nedan är Makefile kodad med base64. Pipa t ex genom openssl base64 -d för att avkoda och få fram Makefile.

b2JqLW0gKz0gamlmZmllcy5vCgphbGw6CgltYWtlIC1DIC9saWIvbW9kdWxlcy8k
KHNoZWxsIHVuYW1lIC1yKS9idWlsZCBNPSQoUFdEKSBtb2R1bGVzCgpjbGVhbjoK
CW1ha2UgLUMgL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIpL2J1aWxkIE09
JChQV0QpIGNsZWFuCglybSAtZiBNb2R1bGVzLnN5bXZlcnMKCg==