anything about Solaris
libkstat の使い方
# ldd /bin/vmstat
libdevinfo.so.1 => /lib/libdevinfo.so.1
libkstat.so.1 => /lib/libkstat.so.1
libc.so.1 => /lib/libc.so.1
libnvpair.so.1 => /lib/libnvpair.so.1
libsec.so.1 => /lib/libsec.so.1
libgen.so.1 => /lib/libgen.so.1
libnsl.so.1 => /lib/libnsl.so.1
libavl.so.1 => /lib/libavl.so.1
libmp.so.2 => /lib/libmp.so.2
libmd.so.1 => /lib/libmd.so.1
libscf.so.1 => /lib/libscf.so.1
libdoor.so.1 => /lib/libdoor.so.1
libuutil.so.1 => /lib/libuutil.so.1
libm.so.2 => /lib/libm.so.2
# head -20 /bin/kstat #!/usr/perl5/bin/perl # # # Copyright 2004 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # #ident "@(#)kstat.pl 1.4 04/11/16 SMI" # require 5.6.1; use strict; use warnings; use locale; use Getopt::Std; use POSIX qw(locale_h ctime); use File::Basename; use Sun::Solaris::Utils qw(textdomain gettext gmatch); use Sun::Solaris::Kstat; #
# kstat -p | grep vminfo unix:0:vminfo:class vm unix:0:vminfo:crtime 0 unix:0:vminfo:freemem 9512127911 unix:0:vminfo:snaptime 77433.828728951 unix:0:vminfo:swap_alloc 4457779140 unix:0:vminfo:swap_avail 48903066506 unix:0:vminfo:swap_free 49891099563 unix:0:vminfo:swap_resv 5445812197
typedef struct kstat_ctl {
kid_t kc_chain_id; /* kstat チェーンの ID */
kstat_t *kc_chain; /* kstat チェーンへのポインタ */
int kc_kd; /* /dev/kstat 記述子 */
} kstat_ctl_t;
typedef struct kstat {
/*
* カーネルとユーザランド両方に関するフィールド
*/
hrtime_t ks_crtime; /* 作成時間 */
struct kstat *ks_next; /* 次のエントリ */
kid_t ks_kid; /* 個別の kstat ID */
char ks_module[KSTAT_STRLEN]; /* モジュール名 */
uchar_t ks_resv; /* 予約 */
int ks_instance; /* インスタンス番号 */
char ks_name[KSTAT_STRLEN]; /* 名前 */
uchar_t ks_type; /* データタイプ */
char ks_class[KSTAT_STRLEN]; /* クラス名 */
uchar_t ks_flags; /* フラグ */
void *ks_data; /* データ領域へのポインタ */
uint_t ks_ndata; /* データの個数 */
size_t ks_data_size; /* データ領域の大きさ */
hrtime_t ks_snaptime; /* 前回のスナップショットの時間 */
/*
* カーネルにのみ関係するフィールド
*/
int (*ks_update)(struct kstat *, int); /* dynamic update */
void *ks_private; /* arbitrary provider-private data */
int (*ks_snapshot)(struct kstat *, void *, int);
void *ks_lock; /* protects this kstat's data */
} kstat_t;
typedef struct kstat_named {
char name[KSTAT_STRLEN]; /* パラメータ名 */
uchar_t data_type; /* データ型 */
union {
char c[16]; /* enough for 128-bit ints */
int32_t i32;
uint32_t ui32;
struct {
union {
char *ptr; /* 文字列 */
#if defined(_KERNEL) && defined(_MULTI_DATAMODEL)
caddr32_t ptr32;
#endif
char __pad[8]; /* 64-bit padding */
} addr;
uint32_t len; /* # bytes for strlen + '\0' */
} str;
#if defined(_INT64_TYPE)
int64_t i64;
uint64_t ui64;
#endif
long l;
ulong_t ul;
/* These structure members are obsolete */
longlong_t ll;
u_longlong_t ull;
float f;
double d;
} value; /* カウンタの値 */
} kstat_named_t;
kstat_ctl_t * kc = kstat_open();
kstat_close(kc);
kstat_chain_update(kc);
kstat_t *ksp = kstat_lookup(kc, "e1000g", -1, NULL);
kstat_named_t *knp = kstat_data_lookup(ksp, "ifspeed"); uint64_t data = knp->value.ui64;
kstat_read(kc, ksp, NULL);
#include <kstat.h>
kstat_ctl_t *kc = kstat_open()
kstat_t *ksp = kstat_lookup(kc, "module", instance_num, "name");
kstat_read(kc, ksp, NULL);
kstat_named_t *knp = kstat_data_lookup(ksp, "parameter"); uint64_t data = knp->value.ui64;
if(kstat_chain_update(kc)) ...
...
kstat_close(kc);
# kstat -p 'e1000g:0:e1000g0:' e1000g:0:e1000g0:brdcstrcv 0 e1000g:0:e1000g0:brdcstxmt 0 e1000g:0:e1000g0:class net e1000g:0:e1000g0:collisions 0 e1000g:0:e1000g0:crtime 25.173112519 e1000g:0:e1000g0:ierrors 0 // 受信エラー数 e1000g:0:e1000g0:ifspeed 1000000000 // リンクスピード e1000g:0:e1000g0:ipackets 73148 // 受信パケット数 e1000g:0:e1000g0:ipackets64 73148 // 受信パケット数 64bit 版 e1000g:0:e1000g0:multircv 0 e1000g:0:e1000g0:multixmt 0 e1000g:0:e1000g0:norcvbuf 0 e1000g:0:e1000g0:noxmtbuf 0 e1000g:0:e1000g0:obytes 2211356 // 送信バイト数 e1000g:0:e1000g0:obytes64 2211356 // 送信バイト数 64bit 版 e1000g:0:e1000g0:oerrors 0 // 送信エラー数 e1000g:0:e1000g0:opackets 32507 // 送信パケット数 e1000g:0:e1000g0:opackets64 32507 // 送信パケット数 64bit 版 e1000g:0:e1000g0:rbytes 101348315 // 受信バイト数 e1000g:0:e1000g0:rbytes64 101348315 // 受信バイト数 64bit 版 e1000g:0:e1000g0:snaptime 18151.778089914 e1000g:0:e1000g0:unknowns 9
# cat e1000g0stat.c
#include <kstat.h>
#define SLEEP_TIME 1
int main() {
kstat_ctl_t *kc;
kstat_t *ksp;
kstat_named_t *knp;
uint64_t obytes, opackets, rbytes, ipackets;
uint32_t oerrors, ierrors;
kc = kstat_open();
ksp = kstat_lookup(kc, "e1000g", 0, "e1000g0");
kstat_read(kc, ksp, NULL);
knp = kstat_data_lookup(ksp, "obytes64");
obytes = knp->value.ui64;
knp = kstat_data_lookup(ksp, "opackets64");
opackets = knp->value.ui64;
knp = kstat_data_lookup(ksp, "oerrors");
oerrors = knp->value.ui64;
knp = kstat_data_lookup(ksp, "rbytes64");
rbytes = knp->value.ui64;
knp = kstat_data_lookup(ksp, "ipackets64");
ipackets = knp->value.ui64;
knp = kstat_data_lookup(ksp, "ierrors");
ierrors = knp->value.ui64;
printf(" ----------- output -----------");
printf(" ----------- input ------------\n");
printf(" Mbps packets errors");
printf(" Mbps packets errors\n");
while(1) {
sleep(SLEEP_TIME);
if(kstat_chain_update(kc)) {
ksp = kstat_lookup(kc, "e1000g", 0, "e1000g0");
}
kstat_read(kc, ksp, NULL);
knp = kstat_data_lookup(ksp, "obytes64");
printf(" %8d", (knp->value.ui64 - obytes) * 8 / 1024 / 1024);
obytes = knp->value.ui64;
knp = kstat_data_lookup(ksp, "opackets64");
printf(" %8d", knp->value.ui64 - opackets);
opackets = knp->value.ui64;
knp = kstat_data_lookup(ksp, "oerrors");
printf(" %8d", knp->value.ui32 - oerrors);
oerrors = knp->value.ui32;
knp = kstat_data_lookup(ksp, "rbytes64");
printf(" %8d", (knp->value.ui64 - rbytes) * 8 / 1024 / 1024);
rbytes = knp->value.ui64;
knp = kstat_data_lookup(ksp, "ipackets64");
printf(" %8d", knp->value.ui64 - ipackets);
ipackets = knp->value.ui64;
knp = kstat_data_lookup(ksp, "ierrors");
printf(" %8d", knp->value.ui32 - ierrors);
ierrors = knp->value.ui32;
puts("");
}
kstat_close(kc);
}
# ifconfig e1000g0
e1000g0: flags=1004843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,IPv4> mtu 1500 index 2
inet 192.168.247.128 netmask ffffff00 broadcast 192.168.247.255
ether 0:c:29:26:ed:fc
# gcc -lkstat e1000g0stat.c -o e1000g0stat
# ./e1000g0stat
----------- output ----------- ----------- input ------------
Mbps packets errors Mbps packets errors
2 4964 0 383 33153 0
2 4927 0 380 32881 0
2 4392 0 332 28702 0
2 4538 0 315 27287 0
2 4415 0 301 26036 0
^C
Posted at 08:08午後 7 09, 2008 by Daisuke Homma in Solaris | 投稿されたコメント[2]
Today's Page Hits: 57
すばらしい情報をありがとうございます。本当に助かりました。
教えて頂いたこと忘れぬよう、関数ライブラリ化してずっと使い続けたいと思います。
Posted by 匿名希望 on 10月月 22日, 2008年 at 09:54 午後 JST #
cool
Posted by wow gold on 11月月 03日, 2008年 at 10:46 午前 JST #