Portál AbcLinuxu, 18. července 2025 19:39


Dotaz: Jak zjistit aktuální zátěž cpu

vogo avatar 28.10.2006 12:53 vogo | skóre: 34 | blog: "Skládat papír"
Jak zjistit aktuální zátěž cpu
Přečteno: 2646×
Odpovědět | Admin
Chtěl bych v jednom skriptu zjišťovat aktuální zátěž CPU, jak na to? Ideální formát by byl v procentech, ale klidně v čemkoli jiném co se dá dále slušně zpracovat. Co spustit aby to na standardní výstup vyplivlo jen tuto informaci?

díky
Nejsem paranoidní, ale to ještě neznamená, že po mě nejdou.
Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

28.10.2006 13:20 Zdeněk Burda | skóre: 61 | blog: Zdendův blog | Praha
Rozbalit Rozbalit vše Re: Jak zjistit aktuální zátěž cpu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Co si představuješ pod pojmem "aktuální zátěž CPU"? Hlavně co od té hodnoty očekáváš?
-- Nezdar není hanbou, hanbou je strach z pokusu.
vogo avatar 28.10.2006 13:27 vogo | skóre: 34 | blog: "Skládat papír"
Rozbalit Rozbalit vše Re: Jak zjistit aktuální zátěž cpu
očekávám hodnotu která vyjadřuje vytížení CPU, kterou třeba zobrazuje gkrellm, nebo cokoli jiného co monitoruje zátěž, prostě hodnotu v procentech (nebo desetinné číslo, or some think like this) vyjadřující využití od posledního měření (?), User Kernel a Nice dohromady, nebo zvlášť - já už si to klidně sečtu :)

Myslel jsem že to bude někde v /proc (nebo /sys?) ale nic jsem nenašel - asi neumím hledat.
Nejsem paranoidní, ale to ještě neznamená, že po mě nejdou.
Luboš Doležel (Doli) avatar 28.10.2006 14:29 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Jak zjistit aktuální zátěž cpu
Je to v /proc/stat
vogo avatar 28.10.2006 14:39 vogo | skóre: 34 | blog: "Skládat papír"
Rozbalit Rozbalit vše Re: Jak zjistit aktuální zátěž cpu
to je sice hezké, ale jak to z toho dostat? :)
Nejsem paranoidní, ale to ještě neznamená, že po mě nejdou.
28.10.2006 19:26 hanzz | skóre: 19 | blog: hanzz
Rozbalit Rozbalit vše Re: Jak zjistit aktuální zátěž cpu
Po chvilce hledani jsem nasel tohle.. :) http://www.abclinuxu.cz/forum/show/78392#6
28.10.2006 19:37 hanzz | skóre: 19 | blog: hanzz
Rozbalit Rozbalit vše Re: Jak zjistit aktuální zátěž cpu
Nebo to jde vzit primo z topu, ale tam je vysledek trochu zkresleny tim, ze start topu si taky neco vezme...
top -b -n 1 | awk '/Cpu\(s\)/ {print $2}'
nebo pouzit mpstat...
28.10.2006 21:34 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Jak zjistit aktuální zátěž cpu
Pokud vám jde o procento non-idle stavů, bude možná jednodušší počítat to z /proc/uptime - první číslo je uptime systému v sekundách, druhé čas, po který procesor zahálel.
28.10.2006 14:12 diverman | skóre: 32 | blog: život s tučňáčkem
Rozbalit Rozbalit vše Re: Jak zjistit aktuální zátěž cpu
Odpovědět | | Sbalit | Link | Blokovat | Admin
zkus programek iostat z balicky sysstat
deb http://ftp.cz.debian.org/debian jessie main contrib non-free
David Watzke avatar 28.10.2006 16:09 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Jak zjistit aktuální zátěž cpu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tenhle démon každejch 5 minut zapíše zátěž CPU do souboru /var/log/cpuload. Mám to pro MRTG. Trochu jsem v tom hrabal, snad je to OK...
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

struct Cpustat
{
        unsigned long u, n, s, i, w, x, y;
};

void GetStat(Cpustat* pStat)
{
        FILE* file = fopen("/proc/stat", "r");
        fscanf(file, "cpu %Lu %Lu %Lu %Lu %Lu %Lu %Lu", &pStat->u, &pStat->n,
		&pStat->s, &pStat->i, &pStat->w, &pStat->x, &pStat->y);
        fclose(file);
}

void sigterm(int trm) // co delat pri SIGTERMu
{
        unlink("/var/run/cpuload.pid");
        unlink("/var/log/cpuload");
        exit(0);
}

int main(void)
{
        daemon(0,0); // po startu se urve od shellu
        signal(SIGTERM, sigterm);

        Cpustat before, now, diff;
        unsigned long total;
        float scale;
        FILE *mrtg, *pid;

        pid = fopen("/var/run/cpuload.pid", "w");
        fputs(pid, getpid()); // zapisem si PID
        fclose(pid);

        for (;;) {
                GetStat(&before);
                sleep(300); // 5 minut = 300
                GetStat(&now);

                diff.u = now.u - before.u;
                diff.n = now.n - before.n;
                diff.s = now.s - before.s;
                diff.i = now.i - before.i;
                diff.w = now.w - before.w;
                diff.x = now.x - before.x;
                diff.y = now.y - before.y;

                total = diff.u+diff.n+diff.s+diff.i+diff.w+diff.x+diff.y;
                scale = 100.0f / (float) total;

                mrtg = fopen("/var/log/cpuload", "w");
                fprintf(mrtg, "%d\n", (int) 100-diff.i*scale);
                fclose(mrtg);
        }
}
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
David Watzke avatar 28.10.2006 16:12 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Jak zjistit aktuální zátěž cpu
Jen taková poznámka: zapíše tam průměr za těch 5 minut. Zátěž CPU se nedá jakoby vypsat hned, musí to být za určitou dobu...
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
David Watzke avatar 28.10.2006 18:57 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Jak zjistit aktuální zátěž cpu
Sorry, tak tohle zrovna nejde zkompilovat. Nicméně pokud se v tom vyznáš, dá se z toho pochopit, jak se to dá spočítat...
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
vogo avatar 29.10.2006 02:00 vogo | skóre: 34 | blog: "Skládat papír"
Rozbalit Rozbalit vše Re: Jak zjistit aktuální zátěž cpu
tak přesně něco takového jsem měl na mysli :) super
Nejsem paranoidní, ale to ještě neznamená, že po mě nejdou.
Dalibor Smolík avatar 28.10.2006 19:01 Dalibor Smolík | skóre: 54 | blog: Postrehy_ze_zivota | 50°5'31.93"N,14°19'35.51"E
Rozbalit Rozbalit vše Re: Jak zjistit aktuální zátěž cpu
Odpovědět | | Sbalit | Link | Blokovat | Admin
příkazem uptime
Rozdíly v řeči a ve zvyklostech neznamenají vůbec nic, budeme-li mít stejné cíle a otevřená srdce.
1.8.2008 16:43 bob@income.cz
Rozbalit Rozbalit vše Re: Jak zjistit aktuální zátěž cpu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Používám uptime, beru z něj zátěž každou minutu a ukládám ji do souboru pomocí php skriptu.

Postup:

1. Stáhnout php-cli (php pro příkazovou řádku), v debianu 'apt-get install php5-cli'

2. Uložit níže uvedený skript do nového souboru cpuload, např. pomocí 'cat > /home/bob/cpuload'

3. 'chmod +x /home/bob/cpuload'

4. 'crontab -e', měl výsledně by vypadat takto:
# m h  dom mon dow   command
* * * * * /home/bob/cpuload
No a pak už jen koukat jak přibývají řádky, třeba 'tail -fn50 /home/bob/zatez.txt'

*********************************************
#!/usr/bin/php
<\?

function dtu()
{
  $temp=explode(' ', microtime());
  return date('d.m.Y G:i:s.', $temp[1]).substr($temp[0],2,6)." ";
}

function radek($n=1)
{
  while ($n--) echo "\n";
}


//********************************************************************************************************//
//********************************************************************************************************//
//*************************** MAIN ***********************************************************************//
//********************************************************************************************************//
//********************************************************************************************************//

radek();
echo "prg='", $argv[0], "'\n";
echo "dir='", getcwd(), "'\n";
echo "arg='", $argv[1], "'\n";
for ($i=2; $i<10; $i++) if (strlen($argv[$i])) echo "arg".$i."='", $argv[$i], "'\n"; else break;
radek();

$out=dtu();
$eregstr_load='load average: 0.([0-9]{2})';
$aa=exec("uptime");
if (!ereg($eregstr_load, $aa, $pom)) $out.="Nevidim zatez, nekde je chybka :))\n";
else $out.=sprintf("%2d%%\n", $pom[1]);
echo $out;
file_put_contents("/home/bob/zatezcpu.txt", $out, FILE_APPEND);

\?>
Fakt nevim jak sem dostat otazník bez \?, takže musíte ty backslashe na těch dvou místech vymazat. Jinak je to ok. Nemám rád html :))

Enjoy!

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.