ich benötige für einen Linux-Daemon die aktuelle CPU-Last. Kennt jemand eine
C-Library (oder einen anderen Weg) welche die CPU-Last ausliest?
Wäre sehr dankbar und wünsche noch einen schönen Tag,
Paul
Ja. Es geht aber auch zu Fuß.
$ strace vmstat |& grep ^open | tail
open("/proc/11874/stat", O_RDONLY) = 6
open("/proc/11889/stat", O_RDONLY) = 6
open("/proc/11890/stat", O_RDONLY) = 6
open("/proc/11897/stat", O_RDONLY) = 6
open("/proc/11898/stat", O_RDONLY) = 6
open("/proc/11899/stat", O_RDONLY) = 6
open("/proc/11900/stat", O_RDONLY) = 6
open("/proc/meminfo", O_RDONLY) = 5
open("/proc/stat", O_RDONLY) = 6
open("/proc/vmstat", O_RDONLY) = -1 ENOENT (No such file or directory)
man proc
# stat kernel/system statistics. Varies with architecture. Common
# entries include:
# cpu 3357 0 4313 1362393
# The number of jiffies (1/100ths of a second) that the
# system spent in user mode, user mode with low priority
# (nice), system mode, and the idle task, respectively.
# The last value should be 100 times the second entry in
# the uptime pseudo-file.
--
this ad zapped
Was hast du denn für eine Manpage? Bei mir steht in der man proc nichts
davon drin.
Wie kann ich jetzt aber aus den Ticks die Last berechnen?
Gruß
> ich benötige für einen Linux-Daemon die aktuelle CPU-Last.
Falsche Gruppe. Bitte in news:de.comp.os.unix.programming oder einer
anderen Unix- bzw. Linux-Programmiergruppe fragen.
Dein Problem hat mit der Sprache C nichts zu tun.
Gruß. Claus
man fscanf
man fopen
...und zwar in deinem Fall:
double loadavg[3];
FILE* fp = fopen("/proc/loadavg", "r");
if (fscanf(fp, "%lg %lg %lg", loadavg, loadavg+1, loadavg+2) == 3)
{
printf("Last während der letzten Minute war %g\n", loadavg[0]);
}
> Wäre sehr dankbar und wünsche noch einen schönen Tag,
Da nich für. Hey, mit dem 'mc' das procfs erkunden, ist das
erste, was man als angehender Linux-Programmierer tut :-)
Ach ja, Details zum procfs in der Doku, den Kernquellen, oder
einer Linux-Newsgroup.
Stefan
> Paul Ritter <knigh...@yahoo.de> wrote:
>> ich benötige für einen Linux-Daemon die aktuelle CPU-Last. Kennt jemand
>> eine C-Library (oder einen anderen Weg) welche die CPU-Last ausliest?
>
> man fscanf
> man fopen
>
> ...und zwar in deinem Fall:
>
> double loadavg[3];
> FILE* fp = fopen("/proc/loadavg", "r");
> if (fscanf(fp, "%lg %lg %lg", loadavg, loadavg+1, loadavg+2) == 3)
> {
> printf("Last während der letzten Minute war %g\n", loadavg[0]);
> }
> Da nich für. Hey, mit dem 'mc' das procfs erkunden, ist das
> erste, was man als angehender Linux-Programmierer tut :-)
> Ach ja, Details zum procfs in der Doku, den Kernquellen, oder
> einer Linux-Newsgroup.
:) Angeguckt habe ich mir die procfs schon. Nur kann ich mit den Ticks der
CPU im Idle/User/Systemfall nicht viel anfangen, da dies nur ein Counter zu
sein scheint.
Gruß,
Paul
On 02 Dec 2003 10:47:44 GMT you wrote:
> Paul Ritter <knigh...@yahoo.de> wrote:
> > ich benötige für einen Linux-Daemon die aktuelle CPU-Last. Kennt
> > jemand eine C-Library (oder einen anderen Weg) welche die CPU-Last
> > ausliest?
>
> man fscanf
> man fopen
>
> ...und zwar in deinem Fall:
>
> double loadavg[3];
> FILE* fp = fopen("/proc/loadavg", "r");
> if (fscanf(fp, "%lg %lg %lg", loadavg, loadavg+1, loadavg+2) == 3)
> {
> printf("Last während der letzten Minute war %g\n", loadavg[0]);
> }
Warum nicht getloadavg()?
double loadavg[3];
int nums;
if((nums = getloadavg(loadavg,3)) == -1) {
// Fehlerfall
}
else {
printf("Last-Durchschnitt über die letzte Minute: %g\n",loadavg[0]);
}
Ist doch seit 4.3BSD dabei? Noch eine nähere Überprüfung von nums
(getloadavg() gibt die Anzahl der ermittelten Werte zurück) und schon
funktioniert es auch auf z.B. FreeBSD.
Grüße,
CK
--
Everyone was born right-handed. Only the greatest overcome it.
Diese Zahl gibt es nicht.
In der Tat. Gemäß der Fragestellung ist das nämlich vollkommener
Unsinn. 'load average' gibt die Länge der system run queue gemittelt
über die letzten fünf, zehn und fünfzehn Minuten an, dh die Anzahl der
Prozesse, die runnable waren, aber auf die CPU oder auf die Platte
warten mußten.
> Hey, mit dem 'mc' das procfs erkunden, ist das
> erste, was man als angehender Linux-Programmierer tut :-)
s/angehender Linux/hartnäckiger DOS/
Und selbst da kommt man mit Shell besser zurecht, als mit dem 'Norton
Commander' (ich hatte gestern das Mißvergnügen, vier Windosen manuell
zu entblastern und mußte zu meinem großen Erstaunen feststellen, daß
ich auch noch Windows-Shell-Befehle kenne, die ich seit mehr als zehn
Jahren nicht mehr benutzt habe).
static void getstat(jiff *cuse, jiff *cice, jiff *csys, jiff long *cide,
unsigned *pin, unsigned *pout, unsigned *s_in, unsigned *sout,
unsigned *itot, unsigned *i1, unsigned *ct) {
static int Stat;
if ((Stat=open("/proc/stat", O_RDONLY, 0)) != -1) {
char* b;
buff[BUFFSIZE-1] = 0; /* ensure null termination in buffer */
read(Stat,buff,BUFFSIZE-1);
close(Stat);
*itot = 0;
*i1 = 1; /* ensure assert below will fail if the sscanf bombs */
b = strstr(buff, "cpu ");
sscanf(b, "cpu %lu %lu %lu %lu", cuse, cice, csys, cide);
b = strstr(buff, "page ");
sscanf(b, "page %u %u", pin, pout);
b = strstr(buff, "swap ");
sscanf(b, "swap %u %u", s_in, sout);
b = strstr(buff, "intr ");
sscanf(b, "intr %u %u", itot, i1);
b = strstr(buff, "ctxt ");
sscanf(b, "ctxt %u", ct);
}
else {
crash("/proc/stat");
}
}
[Quelle: vmstat.c/ procps, Suchzeit <5min]
Es steht ja viel dummes Zeug in dem 'joelonsoftware'-Artikel (jemand
der 'smart' ist, wird eine unmöglich zu beantwortende nicht durch eine
Rechnung zu lösen versuchen, auch wenn das auf jemanden, der das
definitiv auch nicht ist, vielleicht Eindruck macht), aber nicht nur:
# Not-so-smart candidates think that design is like painting: you get
a blank slate, and you can do whatever you want¹.
<URL:http://www.joelonsoftware.com/articles/fog0000000073.html>, 'Part 6'
> Ach ja, Details zum procfs in der Doku, den Kernquellen, oder
> einer Linux-Newsgroup.
F'up2 dcoup
1) Kurzanleitung 'Wie wird man ein sicherer Viererkandidat in
Sozialkunde?': Man liest und beantwortet die Fragen anstatt alles
hinzuschreiben, was man aus den letzten fünf Monaten noch im Kopf
hat. Kooperative Lehrkräfte ändern den Erwartungshorizont dann so,
daß er zu den Antworten der Schüler paßt, die die guten Noten
'verdient' haben (wegen der Mühe und nicht wegen der
Antwort). Gelegentlich Evaluierungen deuten zwar darauf hin, daß
dieses Verfahren grausam versagt (Pisa), aber deswegen muß es doch
nicht ändern. Schließlich haben wir einen Akademikermangel und keinen
Mangel an qualifizierten Fachkräften. Die gibts ja in Indien.
>On 02 Dec 2003 10:47:44 GMT you wrote:
>> Paul Ritter <knigh...@yahoo.de> wrote:
>>
>>> ich benötige für einen Linux-Daemon die aktuelle CPU-Last. Kennt
>>> jemand eine C-Library (oder einen anderen Weg) welche die CPU-Last
>>> ausliest?
>>
>> man fscanf
>> man fopen
>>
>> ...und zwar in deinem Fall:
>>
>> FILE* fp = fopen("/proc/loadavg", "r");
>
>Warum nicht getloadavg()?
>
>Ist doch seit 4.3BSD dabei? Noch eine nähere Überprüfung von nums
>(getloadavg() gibt die Anzahl der ermittelten Werte zurück) und schon
>funktioniert es auch auf z.B. FreeBSD.
Und wo im Gruppennamen de.comp.lang.c genau steht BSD?
Den Hinweis, daß er hier falsch ist, hat er schon erhalten, und wo er die
Frage besser stellt, konsequent haben alle weiteren Antworten im Rahmen
dessen, was der Standard garantiert zu bleiben.
Gruß, Bodo
--
MS Outlook Express?->[DE: http://piology.org/ILOVEYOU-Signature-FAQ.html]
@@@@@ GEGEN TCG aka. TCPA: @@@@@ [DE: http://www.againsttcpa.com]
> Stefan Reuther wrote:
>> Paul Ritter <knigh...@yahoo.de> wrote:
>>
>> FILE* fp = fopen("/proc/loadavg", "r");
>
> Nur kann ich mit den Ticks der
> CPU im Idle/User/Systemfall nicht viel anfangen, da dies nur ein Counter zu
> sein scheint.
Ich meine, der Wert, den Du brauchst, ist einer der ersten drei aus
/proc/loadavg, diese geben in etwa an, wieviele Prozesse durchschnittlich
permanent lauffähig waren (nicht auf I/O oder ähnliches wartend), und zwar
in unterschiedlich großen Zeiträumen (eine, 5 und 15 Minuten).
Gruß, Bodo
PS: fup2 dcoup, da hier nun wirklich OT.
On Thu, 4 Dec 2003 20:53:30 +0100 you wrote:
> Und wo im Gruppennamen de.comp.lang.c genau steht BSD?
Und wo im Gruppennamen steht proc? ;)
Dass er hier falsch ist mir klar. Worauf ich hinaus wollte war, dass die
Lösung über das Proc-Dateisystem nicht sonderlich portabel ist, weniger
portabel als die getloadavg()-Variante.
Grüße,
CK
--
It will be advantageous to cross the great stream ... the Dragon is on
the wing in the Sky ... the Great Man rouses himself to his Work.
>On Thu, 4 Dec 2003 20:53:30 +0100 you wrote:
>
>> Und wo im Gruppennamen de.comp.lang.c genau steht BSD?
>
> Und wo im Gruppennamen steht proc? ;)
Im Standard steht, daß bei
FILE* fp = fopen("/proc/loadavg", "r");
der Dateiname "/proc/loadavg" implementationsabhängig interpretiert wird.
Und damit ist diese Zeile auf jeder Plattform 100% portabel (und liefert
entweder einen FILE* zurück, über den man Daten lesen kann, oder NULL,
dann kann man natürlich keine Daten lesen).
> Dass er hier falsch ist mir klar. Worauf ich hinaus wollte war, dass die
> Lösung über das Proc-Dateisystem nicht sonderlich portabel ist, weniger
> portabel als die getloadavg()-Variante.
Ach?
$ man getloadavg
Kein Manual-Eintrag für getloadavg vorhanden
Fängt ja schonmal gut an.
$ cat /proc/loadavg
0.63 0.64 0.72 1/158 20545
Na also, geht doch.
(Mein System kennt getloadavg() scheinbar tatsächlich:
$ cat getloadavg.c && gcc -o getloadavg getloadavg.c
int main(void) {
getloadavg();
return 0;
}
$
)