CプログラムからCPU使用率統計を取得する

CプログラムからCPU使用率統計を取得する

CプログラムからCPU使用率統計を読みたいです。 CPU使用率に興味があります。時間を盗むなど。これらの統計はtopコマンドの3行目に表示されます。

()を使用して出力を解析してみましたが、top正しい統計を表示する前に常に同じ「偽」値を提供しているようです。awktop -n 1 -b | awk '{print $0}'top

コード内または一部のコマンドの出力を解析してCPU使用率統計を取得する方法はありますか?

編集する:

プラットフォームはLinux

ありがとうございます。

答え1

読みたい最初の数行/proc/stat。測定された時間だけ分離して2回読み、次に2番目の数値セットから最初の数値セットを減算する必要があります。行は次のとおりです

cpu  1526724 408013 600675 541100340 2861417 528 14531 0 0 0
cpu0 344507 77818 251244 134816146 1119991 324 13283 0 0 0
cpu1 502614 324065 179301 133991407 1631824 136 906 0 0 0
cpu2 299080 3527 79456 136144067 103208 59 255 0 0 0
cpu3 380521 2602 90672 136148719 6393 7 86 0 0 0
intr 2111239193 344878476 16943 ...

最初の行はすべてのコアのセットです。次の数行は各コアを示しています。で始まる行が表示されたら、intr解析を停止する必要があることを知っています。

各数字は、CPUが特定の状態で消費する時間である。単位は通常100分の1秒です。これらのフィールドはuser、、、、、、、、、、、およびです。​​​nicesystemidleiowaitirqsoftirqstealguestguest_nice

信頼できる文書はもちろん、ソースコードです。 Linuxカーネルのソースコードのコピーがある場合は、fs/proc/stat.c特にshow_stat関数を見てください。

答え2

持ついくつかの例/proc/pid/statWebからC言語で読む方法を示します。

utime2 つの異なる時間に OR 値を読み込み、必要なstimeCPU 使用率統計を計算できます。 (topこの生データも使用したいです。)

(忘れました。これはLinux専用です。)

答え3

私は次のsysinfoを使ってこれをしました。ここにスニペットがあります。

#include "sysinfo.h"

getstat(cpu_use,cpu_nic, cpu_sys, cpu_idl, cpu_iow, cpu_xxx, cpu_yyy, cpu_zzz, pgpgin, pgpgout, pswpin, pswpout, intr, ctxt, &running,&blocked, &dummy_1, &dummy_2);

float cpuconsumption = (float) ((   (float) ((*cpu_use) + (*cpu_sys)) / (float)((*cpu_use)+(*cpu_sys)+(*cpu_idl)))*100);

答え4

誰もがacアプリケーション内の上部から直接高速CPU使用率値を取得したい場合、このコードスニペットは単にパイプを開き、CPU情報とともに最上位プロセスの最後の行を返します。

/**
 * Get last cpu load as a string (not threadsafe)
 */
static char* getCpuLoadString()
{
    /*
     * Easiest seems to be just to read out a line from top, rather than trying to calc it ourselves through /proc stuff
     */
    static bool started = false;
    static char buffer[1024];
    static char lastfullline[256];
    static int bufdx;
    static FILE *fp;

    if(!started) {
        /* Start the top command */

        /* Open the command for reading. */
        fp = popen("top -b  -d1", "r");
        if (fp == NULL) {
          printf("Failed to run top command for profiling\n" );
          exit(1);
        }

        /* Make nonblocking */
        int flags;
        flags = fcntl(fileno(fp), F_GETFL, 0);
        flags |= O_NONBLOCK;
        fcntl(fileno(fp), F_SETFL, flags);

        started = true;
    }


    /*
     * Read out the latest info, and remember the last full line
     */
    while( fgets (buffer + bufdx, sizeof(buffer) - bufdx, fp)!=NULL ) {
        /* New data came in. Iteratively shift everything until a newline into the last full line */
        char *newlinep;
        while((newlinep = strstr(buffer, "\n"))) {
            int shiftsize = (newlinep - buffer + 1);
            *newlinep = 0; /* Nullterminate it for strcpy and strstr */
            /* Check if the line contained "cpu" */
            if(strstr(buffer, "Cpu")) {
                strncpy(lastfullline, buffer, sizeof(lastfullline) - 1); /* Copy full line if it contained cpu info */
            }
            memmove(buffer, buffer + shiftsize, shiftsize); /* Shift left (and discard) the line we just consumed */
        }
    }

    /*
     * Return the last line we processed as valid output
     */
    return lastfullline;
}

printf(" %s\n", getCpuLoadString());それから毎秒電話をかけました。

関連情報