Linux の sysinfo での load average


http://naoya.g.hatena.ne.jp/naoya/20061026/1161878147

ところで load average って 0.56 とかいう数字になると思ったら sysinfo が返すのは unsigned long な5桁とかの整数でこれをどう処理したらふだん見てる待ちプロセス数を基準にした値になるのかがよくわからない。


こんな感じですかね。

#include <stdio.h>
#include <sys/sysinfo.h>

int main(int argc, char **argv) {
    struct sysinfo info;
    if (sysinfo(&info) == -1) {
        printf("could not get sysinfo\n");
        return 1;
    }
    double av1, av2, av3;
    double shift = (1 << SI_LOAD_SHIFT);
    av1 = info.loads[0] / shift;
    av2 = info.loads[1] / shift;
    av3 = info.loads[2] / shift;
    printf("load average: %.2f, %.2f, %.2f\n", av1, av2, av3);
    return 0;
}

あと、CPANLinux::Statistics っていうモジュールがあった(知らなかった)。

load average とかもとれる。

実装はXSじゃないんだけど、わりと使えるかも。

BSDならBSD::Sysctlかな。


XSは自分でもたまに書くけど(これとか)、罠がいっぱい&マクロとか関数名が直感的にわからないやつが結構あったりと、はまりどころいっぱいで結構めんどいなぁ。


追記

http://b.hatena.ne.jp/naoya/20061027#bookmark-3095398

65536 ってどっから出てくる数字なのかしら。

そらそーだ。。。

サンプル直しました。SI_LOAD_SHIFTはカーネルのソースに書いてありますです。