8

Linuxでは、CPUごとの統計を取得するために呼び出す「C」APIを知りた​​いです。

私は自分のアプリについて知っており/proc/loadavg、アプリ内から読み取ることができますが、これはシステム全体の負荷平均であり、CPUごとの情報ではありません。個々のCPUまたはコアを区別したいと思います。

これを行うアプリケーションの例として、実行topして「1」を押すと、次のような4つまたは8つのプロセッサ/コアが表示されます。

Cpu0  :  4.5%us,  0.0%sy,  0.0%ni, 95.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  : 42.2%us,  6.2%sy,  0.5%ni, 51.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  3.0%us,  1.5%sy,  0.0%ni, 94.5%id,  0.0%wa,  0.0%hi,  1.0%si,  0.0%st
Cpu3  :  7.0%us,  4.7%sy,  0.0%ni, 88.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

私はしようとしましstrace topたが、これはネズミの巣につながりました。

4

3 に答える 3

6

必要なファイルはです/proc/statfs/proc/stat.c( Linuxカーネルソースで参照することをお勧めします。)

于 2010-01-24T20:14:40.360 に答える
2

これは本当の答えではありませんが、topのソースコードを見てみましょう。

于 2010-01-23T12:54:52.313 に答える
0

このシナリオでは、負荷の平均を計算するために、カーネルファイルtimer.cがある程度重要になると思います。ファイルtimer.c関数からcalc_load()

unsigned long avenrun[3];

static inline void calc_load(unsigned long ticks) 
{

    unsigned long active_tasks; /* fixed-point */
    static int count = LOAD_FREQ;

    count -= ticks;
    if (count < 0) {
        count += LOAD_FREQ;
        active_tasks = count_active_tasks();
        CALC_LOAD(avenrun[0], EXP_1, active_tasks);
        CALC_LOAD(avenrun[1], EXP_5, active_tasks);
        CALC_LOAD(avenrun[2], EXP_15, active_tasks);
    }
}
于 2010-01-23T18:04:41.263 に答える