読者です 読者をやめる 読者になる 読者になる

sysinfo(2)でシステム情報の取得

linux

この記事はLinux Advent Calendar 2014の2日目の記事です。

プログラムの中でロードアベレージとかメモリの空き容量を見るのにどうしようかなーと思っていて見つけたのがsysinfo(2)です。 使い方は至って単純でsysinfo構造体のアドレスをsysinfo(2)に渡せば情報が入ってくるのであとはご自由にという感じでいけます。

cだとこんな感じです。SI_LOAD_SHIFTは/usr/include/linux/sysinfo.hにて定義されています。

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

#define LOAD_AVERAGE(x) x / (double)(1 << SI_LOAD_SHIFT)

int main(int argc, char **argv)
{
    struct sysinfo info = { 0  };

    sysinfo(&info);

    printf("load average: 1min(%.3f) 5min(%.3f) 15min(%.3f)\n", 
        LOAD_AVERAGE(info.loads[0]),
        LOAD_AVERAGE(info.loads[1]),
        LOAD_AVERAGE(info.loads[2]));


    printf("Total ram: %lu\n", info.totalram);
    printf("\tfreeram: %lu\n", info.freeram);
    printf("\tsharedram: %lu\n", info.sharedram);
    printf("\tbufferram %lu\n", info.bufferram);
    printf("\ttotalswap %lu\n", info.totalswap);
    printf("\tfreeswap %lu\n", info.freeswap);
    printf("number of processes: %u\n", info.procs);

    return 0;
}

引数一個で使い方も単純なのでrubyとかpythonからも呼びやすいと思います。 rubyの場合はこんな感じですね。

#!/usr/bin/env ruby
require 'dl/import'

module M
  extend DL::Importer
  dlload "libc.so.6"
  extern('int sysinfo(struct sysinfo *)')
  Sysinfo = struct( ["long uptime",
                     "unsigned long loads[3]",
                     "unsigned long totalram",
                     "unsigned long freeram",
                     "unsigned long sharedram",
                     "unsigned long bufferram",
                     "unsigned long totalswap",
                     "unsigned long freeswap",
                     "unsigned short procs",
                     "unsigned long totalhigh",
                     "unsigned long freehigh",
                     "unsigned int mem_unit",
                     "char _f[20-2*sizeof(long)-sizeof(int)]"])
end

sysinfo = M::Sysinfo.malloc
e = M.sysinfo(sysinfo)

if e == 0
    puts("load average")
    3.times { |i| 
        sysinfo.loads[i]/ (1 << 16).to_f
    }
end

あ、rubyだとsysinfoはgemがあったからそれを使う方が早いと思いますが(; ̄ェ ̄)

sysinfoだと/procのファイルを読んだりする必要がないので良さ気ですね。

サーバ/インフラ徹底攻略 (WEB+DB PRESS plus)

サーバ/インフラ徹底攻略 (WEB+DB PRESS plus)