kstat

2012/09/09
kstat 構造体はモジュール(ドライバ)の中で自由に定義できるので、kstat 構造体がどのような要素を持つかは、モジュールの実装によるところが大きい。kstat(1M) で表示することができる。kstat コマンドは perl で書かれている。 kstat の要素が何を表しているのかについては資料が無いので、kstat 構造体の初期化、更新ルーチンから調べる。下記のカーネルのメモリ関連の kstat 構造体は、usr/src/uts/common/os/kstat_fr.c で初期化されている。
ksp = kstat_create("unix", 0, "system_pages", "pages", KSTAT_TYPE_NAMED,
        sizeof (system_pages_kstat) / sizeof (kstat_named_t),
        KSTAT_FLAG_VIRTUAL);
if (ksp) {
    ksp->ks_data = (void *) &system_pages_kstat;
    ksp->ks_update = system_pages_kstat_update;
    kstat_install(ksp);
}

kstat 構造体には、ks_update という要素があり、kstat 構造体の情報をアップデートする関数のポインタが格納されている。system_pages_kstat_update() が上記 kstat 構造体をアップデートする関数。
system_pages_kstat_update(kstat_t *ksp, int rw)
{
    kobj_stat_t kobj_stat;

    if (rw == KSTAT_WRITE) {
        return (EACCES);
    }

    kobj_stat_get(&kobj_stat);
    system_pages_kstat.physmem.value.ul    = (ulong_t)physmem;
    system_pages_kstat.nalloc.value.ul    = kobj_stat.nalloc;
    system_pages_kstat.nfree.value.ul    = kobj_stat.nfree;
    system_pages_kstat.nalloc_calls.value.ul = kobj_stat.nalloc_calls;
    system_pages_kstat.nfree_calls.value.ul    = kobj_stat.nfree_calls;
    system_pages_kstat.kernelbase.value.ul    = (ulong_t)KERNELBASE;

#ifdef    __sparc
    /*
     * kstat should REALLY be modified to also report kmem64_base and
     * kmem64_end (see sun4u/os/startup.c), as the virtual address range
     * [ kernelbase .. econtig ] no longer is truly reflective of the
     * kernel's vallocs...
     */
    system_pages_kstat.econtig.value.ul    = (ulong_t)econtig32;
#else    /* !__sparc */
    system_pages_kstat.econtig.value.ul    = (ulong_t)econtig;
#endif    /* __sparc */

    system_pages_kstat.freemem.value.ul    = (ulong_t)freemem;
    system_pages_kstat.availrmem.value.ul    = (ulong_t)availrmem;
    system_pages_kstat.lotsfree.value.ul    = (ulong_t)lotsfree;
    system_pages_kstat.desfree.value.ul    = (ulong_t)desfree;
    system_pages_kstat.minfree.value.ul    = (ulong_t)minfree;
    system_pages_kstat.fastscan.value.ul    = (ulong_t)fastscan;
    system_pages_kstat.slowscan.value.ul    = (ulong_t)slowscan;
    system_pages_kstat.nscan.value.ul    = (ulong_t)nscan;
    system_pages_kstat.desscan.value.ul    = (ulong_t)desscan;
    system_pages_kstat.pagesfree.value.ul    = (ulong_t)freemem;
    system_pages_kstat.pageslocked.value.ul    = (ulong_t)(availrmem_initial -
        availrmem);
    system_pages_kstat.pagestotal.value.ul    = (ulong_t)total_pages;
    /*
     * pp_kernel represents total pages used by the kernel since the
     * startup. This formula takes into account the boottime kernel
     * footprint and also considers the availrmem changes because of
     * user explicit page locking.
     */
    system_pages_kstat.pp_kernel.value.ul   = (ulong_t)(physinstalled -
        obp_pages - availrmem - k_anoninfo.ani_mem_resv -
        anon_segkp_pages_locked - pages_locked -
        pages_claimed - pages_useclaim);

    return (0);
}

cpu:0:sys:
kstat要素 取得ルーチン 備考
bawrite CPU_STATS_ADDQ(cpup, sys, bawrite, 1) physical block writes (sync+async)
bread CPU_STATS_ADD_K(sys, bread, 1)
CPU_STATS_ADD_K(sys, bread, 1)
CPU_STATS_ADD_K(sys, bread, 1)
physical block reads
bwrite CPU_STATS_ADDQ(cpup, sys, bwrite, 1) physical block writes (sync+async)
canch CPU_STATS_ADDQ(CPU, sys, canch, value) chars handled in canonical mode
cpu_load_intr =cp->cpu_intrload
cpu_nsec_idle =msnsecs[CMS_IDLE]
cpu_nsec_intr =cp->cpu_intrlast
cpu_nsec_kernel =msnsecs[CMS_SYSTEM]
cpu_nsec_user =msnsecs[CMS_USER]
cpu_ticks_idle =NSEC_TO_TICK(csskd-> cpu_nsec_idle.value.ui64)
cpu_ticks_kernel =NSEC_TO_TICK(csskd-> cpu_nsec_kernel.value.ui64)
cpu_ticks_user =NSEC_TO_TICK(csskd-> cpu_nsec_user.value.ui64)
cpu_ticks_wait = 0
cpumigrate incq CPU_STATS_SYS_CPUMIGRATE(%r13)
addl $1, CPU_STATS_SYS_CPUMIGRATE(%esi)
cpu migrations by threads
idlethread CPU_STATS_ADDQ(cp, sys, idlethread, 1) times idle thread scheduled
intr add os1, CPU_STATS_SYS_INTR - 8, os2 デバイス割り込み
intrblk CPU_STATS_ADDQ(cp, sys, intrblk, 1)
cpu_stats.sys.intrblk++
cpu->cpu_stats.sys.intrblk++
intrs blkd/prempted/released (swtch)
intrthread += css->intr[i]
+= CPU_STATS(cp, sys.intr[i])
interrupts as threads (below clock)
inv_swtch CPU_STATS_ADDQ(CPU, sys, inv_swtch, 1) involuntary context switches
iowait atomic_add_64(&cpup->cpu_stats.sys.iowait, 1)
atomic_add_64(&cpup->cpu_stats.sys.iowait, -1)
lread CPU_STATS_ADD_K(sys, lread, 1)
CPU_STATS_ADD_K(sys, lread, 1)
logical block reads
lwrite CPU_STATS_ADDQ(cpup, sys, lwrite, 1)
CPU_STATS_ADD_K(sys, lwrite, 1)
logical block writes
mdmint CPU_STATS_ADDQ(CPU, sys, mdmint, value) UNUSED
modload CPU_STATS_ADDQ(CPU, sys, modload, 1) times loadable module loaded
modunload CPU_STATS_ADDQ(CPU, sys, modunload, 1)
CPU_STATS_ADDQ(CPU, sys, modunload, 1)
CPU_STATS_ADDQ(CPU, sys, modunload, 1)
times loadable module unloaded
msg CPU_STATS_ADDQ(CPU, sys, msg, 1)
CPU_STATS_ADDQ(CPU, sys, msg, 1)
msg count (msgrcv()+msgsnd() calls)
mutex_adenters CPU_STATS_ADDQ(cpup, sys, mutex_adenters, 1) failed mutex enters (adaptive)
namei CPU_STATS_ADDQ(CPU, sys, namei, 1) pathname lookups
nthreads CPU_STATS_ADDQ(CPU, sys, nthreads, 1) thread_create()s
outch CPU_STATS_ADDQ(CPU, sys, outch, value) terminal output characters
phread CPU_STATS_ADD_K(sys, phread, 1)
CPU_STATS_ADD_K(sys, phread, 1)
raw I/O reads
phwrite CPU_STATS_ADD_K(sys, phwrite, 1)
CPU_STATS_ADD_K(sys, phwrite, 1)
raw I/O writes
procovf CPU_STATS_ADDQ(CPU, sys, procovf, 1) proc table overflows
pswitch CPU_STATS_ADDQ(cp, sys, pswitch, 1)
CPU_STATS_ADDQ(cp, sys, pswitch, 1)
CPU_STATS_ADDQ(cp, sys, pswitch, 1)
CPU_STATS_ADDQ(cp, sys, pswitch, 1)
context switches
rawch CPU_STATS_ADDQ(CPU, sys, rawch, value) terminal input characters
rcvint CPU_STATS_ADDQ(CPU, sys, rcvint, value) UNUSED
readch CPU_STATS_ADDQ(cp, sys, readch, (ulong_t)cnt)
CPU_STATS_ADDQ(cp, sys, readch, (ulong_t)bcount)
CPU_STATS_ADDQ(cp, sys, readch, (ulong_t)count)
CPU_STATS_ADDQ(cp, sys, readch, (ulong_t)bcount)
bytes read by rdwr()
rw_rdfails CPU_STATS_ADDQ(CPU, sys, rw_rdfails, 1) rw reader failures
rw_wrfails CPU_STATS_ADDQ(CPU, sys, rw_wrfails, 1) rw writer failures
sema CPU_STATS_ADDQ(CPU, sys, sema, 1) semaphore ops count (semop() calls)
syscall CPU_STATS_ADDQ(CPU, sys.syscall, 1)
CPU_STATS_ADDQ(CPU, sys.syscall, 1)
system calls
sysexec CPU_STATS_ADD_K(sys, sysexec, 1) execs
sysfork CPU_STATS_ADDQ(CPU, sys, sysfork, 1) forks
sysread CPU_STATS_ADDQ(cp, sys, sysread, 1)
CPU_STATS_ADDQ(cp, sys, sysread, 1)
CPU_STATS_ADDQ(cp, sys, sysread, 1)
CPU_STATS_ADDQ(cp, sys, sysread, 1)
read()+readv() system calls
sysvfork CPU_STATS_ADDQ(CPU, sys, sysvfork, 1) vforks
syswrite CPU_STATS_ADDQ(cp, sys, syswrite, 1)
CPU_STATS_ADDQ(cp, sys, syswrite, 1)
CPU_STATS_ADDQ(cp, sys, syswrite, 1)
CPU_STATS_ADDQ(cp, sys, syswrite, 1)
write()+writev() system calls
trap CPU_STATS_ADDQ(CPU, sys, trap, 1)
CPU_STATS_ADDQ(CPU, sys, trap, 1)
traps
ufsdirblk CPU_STATS_ADD_K(sys, ufsdirblk, 1) directory blocks read
ufsiget CPU_STATS_ADD_K(sys, ufsiget, 1) ufs_iget() calls
ufsinopage CPU_STATS_ADDQ(CPU, sys, ufsinopage, 1) inodes taked with no attached pages
ufsipage CPU_STATS_ADDQ(CPU, sys, ufsipage, 1) inodes taken with attached pages
wait_ticks_io =0
writech CPU_STATS_ADDQ(cp, sys, writech, (ulong_t)cnt)
CPU_STATS_ADDQ(cp, sys, writech, (ulong_t)bcount)
CPU_STATS_ADDQ(cp, sys, writech, (ulong_t)count)
CPU_STATS_ADDQ(cp, sys, writech, (ulong_t)bcount)
bytes written by rdwr()
xcalls CPU_STATS_ADDQ(CPU, sys, xcalls, 1) xcalls to other cpus
xmtint CPU_STATS_ADDQ(CPU, sys, xmtint, value) UNUSED

0 件のコメント:

コメントを投稿