sar

2012/09/08
システム動作の監視 (sar)

sar を引数なしで起動した場合、sadc(データコレクタ) が kstat 構造体から取得し、sa 構造体として記録しておいたファイルから、システム情報を取得する。引数にインターバルを設定した場合は、sadc を子プロセスとして起動して、リアルタイムでシステム情報を取得する。

usr/src/cmd/sa/
if (realtime) {
        /*
         * Get input data from sadc via pipe.
         */
     :
        if (pipe(pipedes) == -1)
            fail(1, "pipe failed");
        if ((childid = fork()\) == 0) {
            /*
             * Child: shift pipedes[write] to stdout,
             * and close the pipe entries.
             */
            (void) dup2(pipedes[1], 1);
            if (pipedes[0] != 1)
                (void) close(pipedes[0]);
            if (pipedes[1] != 1)
                (void) close(pipedes[1]);

            if (execlp("/usr/lib/sa/sadc",
                "/usr/lib/sa/sadc", arg1, arg2, 0) == -1)
                fail(1, "exec of /usr/lib/sa/sadc failed");
     :
     :

sadc が kstat を読むところ。
safe_kstat_read() の先で、usr/src/lib/libkstat/common/kstat.ckstat_read() がコールされる。
static void
all_stat_init(void)
{
    kstat_t *ksp;
 
    /*
     * Initialize global statistics
     */
 
    sysinfo_ksp     = safe_kstat_lookup(kc, "unix", 0, "sysinfo");
    vminfo_ksp      = safe_kstat_lookup(kc, "unix", 0, "vminfo");
    kmem_oversize_ksp = safe_kstat_lookup(kc, "vmem", -1, "kmem_oversize");
    var_ksp         = safe_kstat_lookup(kc, "unix", 0, "var");
    system_misc_ksp = safe_kstat_lookup(kc, "unix", 0, "system_misc");
    file_cache_ksp  = safe_kstat_lookup(kc, "unix", 0, "file_cache");
    ufs_inode_ksp   = kstat_lookup(kc, "ufs", 0, "inode_cache");
 
    safe_kstat_read(kc, system_misc_ksp, NULL);
     :
     :

ファイルアクセス操作(sar -a)
フィールド名 kstat 説明
iget/s ufsiget ディレクトリ名検索キャッシュ(dnlc)内に入っていない i ノードに対して出された要求数
namei/s namei 1 秒当りのファイルシステムパスの検索数。namei で dnlc 内にディレクトリ名が見つからない場合は、iget が呼び出され、ファイルまたはディレクトリの i ノードが取得される。したがって、ほとんどの igets は dnlc が欠落した結果である
dirbk/s ufsdirblk 1 秒間に実行されたディレクトリブロックの読み取り回数

バッファー動作(sar -b)
フィールド名 kstat 説明
bread/s bread ディスクからバッファーキャッシュに投入された 1 秒当りの平均読み取り数
lread/s lread バッファーキャッシュからの 1 秒当りの平均論理読み取り数
%rcache lread バッファーキャッシュ内で見つかった論理読み込み数の小数部 (lread/s に対する bread/s の比を 100% から差し引いた値)
bwrit/s bwrit バッファーキャッシュからディスクに書き込まれた 1 秒当りの平均物理ブロック数 (512 ブロック)
lwrite/s lwrite バッファーキャッシュへの 1 秒当りの平均論理書き込み数
%wcache bwrit バッファーキャッシュ内で見つかった論理書き込み数の小数部 (lwrit/s に対する bwrit/s の比を 100% から差し引いた値)
pread/s phread キャラクタ型デバイスインタフェースを使用する 1 秒当りの平均物理読み取り数
pwrit/s phwrit キャラクタ型デバイスインタフェースを使用する 1 秒当りの平均物理書き込み要求数

システムコール(sar -c)
フィールド名 kstat 説明
scall/s syscall 1 秒当りのすべてのタイプのシステムコール数 (通常は、ビジーな 4 ないし 6 ユーザーのシステム上で 1 秒当り約 30)
sread/s sysread 1 秒当りの read システムコール数
swrit/s syswrite 1 秒当りの write システムコール数
fork/s sysfork+sysvfork 1 秒当りの fork システムコール数 (4 ないし 6 ユーザーのシステム上で毎秒約 0.5)。この数値は、シェルスクリプトの実行中は大きくなる
exec/d sysexec 1 秒当りの exec システムコール数。exec/s を fork/s で割った値が 3 より大きい場合は、効率の悪い PATH 変数を調べる
rchar/s readch readシステムコールによって転送される 1 秒当りの文字 (バイト) 数
wchar/s writech writeシステムコールによって転送される 1 秒当りの文字 (バイト) 数

ブロックデバイス(sar -d)
フィールド名 説明
device 監視中のディスクデバイス名
%busy デバイスが転送要求のサービスに費やす時間の割合
avque 平均待ち時間と平均サービス時間の合計
r+w/s デバイスへの 1 秒当りの読み取り転送数と書き込み転送数
blks/s デバイスに転送される 1 秒当りの 512 バイトブロック数
avwait 待ち行列内でアイドル状態で待機中の要求を転送する平均ミリ秒数 (待ち行列に要求が入っているときのみ計測)
avserv デバイスが転送要求を完了するまでの平均ミリ秒数 (ディスクの場合は、この値にシークタイム、回転待ち時間、データ転送時間が含まれる)

ページアウトとメモリーの解放(sar -g)
フィールド名 kstat 説明
pgout/s pgout 1 秒間にページアウトされた要求数
ppgout/s pgpgout 1 秒間に実際にページアウトされたページ数 (1 つのページアウト要求で複数のページがページアウトされることがある)
pgfree/s dfree 空きリストに配置された 1 秒当りのページ数
pgscan/s scan ページデーモンによって走査された 1 秒当りのページ数。この値が大きい場合は、ページデーモンが空きメモリーのチェックに大量の時間を費やしている。これは、メモリーを増やす必要があることを示す
%ufs_ipf ufsipage ufsがそれに関連付けられた再使用可能ページを持つ iget によって空きリストから取り出された割合。これらのページはフラッシュされ、プロセスが回収できなくなる。したがって、これはページフラッシュを伴う igets の割合である。値が大きければ、i ノードの空きリストがページ境界であり、ufs の i ノード数を増やす必要があることを示す

カーネルメモリーの割り当て(sar -k)
フィールド名 kstat 説明
sml_mem km_mem[KMEM_SMALL] KMA が小メモリー要求プール内で使用できるメモリーのバイト数 (小要求は 256 バイト未満)
alloc km_alloc[KMEM_SMALL] KMA が小メモリー要求プールから小メモリー要求に割り当てたメモリーのバイト数
fail kmi.km_fail[KMEM_SMALL] 小量のメモリーで失敗した要求数
lg_mem km_mem[KMEM_LARGE] KMA が大メモリー要求プール内で使用できるメモリーのバイト数 (大要求は 512 バイトから 4K バイトまで)
alloc km_alloc[KMEM_LARGE] KMA が大メモリー要求プールから大メモリー要求に割り当てたメモリーのバイト数
fail km_fail[KMEM_LARGE] 大メモリーで失敗した要求数
ovsz_alloc km_alloc[KMEM_OSIZE] サイズ超過要求 (4K バイトを超える要求) に割り当てられたメモリーの容量。これらの要求はページアロケータによって満たされるので、プールはない
fail km_fail[KMEM_OSIZE] サイズ超過メモリーで失敗した要求数

プロセス間通信(sar -m)
フィールド名 kstat 説明
msg/s msg 1 秒当りのメッセージ処理 (送受信) 数
sema/s sema 1 秒当りのセマフォ処理数

スワップとディスパッチ(sar -p)
フィールド名 kstat 説明
atch/s pgfrec 現在メモリーに入っているページを回収して満たされる 1 秒当りのページフォルト数 (1 秒当りの付加数)。この例には、空きリストから無効なページを回収し、別のプロセスに現在使用中のテキストページを共有する処理が含まれる (たとえば、複数のプロセスが同じプログラムテキストにアクセスしている場合など)
pgin/s pgin ファイルシステムがページイン要求を受信する 1 秒当りの回数
ppgin/s pgpgin ページインされる 1 秒当りのページ数。ソフトロック要求 (slock/s を参照) などの 1 つのページイン要求や、大型ブロックサイズでは、複数のページがページインされることがある
pflt/s prot_fault+cow_fault 保護エラーによるページフォルト数。保護フォルトの例には、ページへの不正なアクセスや、「書き込み時コピー」などがある。通常、この数値は主に「書き込み時コピー」からなっている
vflt/s hat_fault+as_fault 1 秒当りのアドレス変換ページフォルト数。これは、有効性フォルトと呼ばれ、所定の仮想アドレスに有効なプロセステーブルエントリが存在しないときに発生する
slock/s softlock 物理入出力を要求するソフトウェアロック要求によって発生する 1 秒当りのフォルト数。ソフトロック要求の発生例には、ディスクからメモリーへのデータ転送などがある。システムはデータを受信しないページをロックするので、別のプロセスはそれを回収して使用できない

待ち行列動作(sar -q)
フィールド名 kstat 説明
runq-sz runque/runocc CPU を実行するためにメモリー内で待機中のカーネルスレッド数。通常、この値は 2 未満になる。値が常に 2 より大きい場合は、システムが CPU の限界に到達している可能性がある
%runocc runocc ディスパッチ待ち行列が使用されている時間の割合
swpq-sz swpque/swpocc スワップアウトされた平均軽量プロセス数
%swpocc swpocc 軽量プロセスがスワップアウトされた時間の割合

未使用メモリー(sar -r)
フィールド名 kstat 説明
freemem freemem コマンドによるサンプル収集間隔の間にユーザープロセスに利用できる平均メモリーページ数。ページサイズはマシンに応じて異なる
freeswap swap_avail ページスワップに使用可能な 512 バイトのディスクブロック数

CPU の使用率(sar -u)
フィールド名 kstat 説明
%sys cpu[1] プロセッサがシステムモードになっている時間の割合が表示される
%user cpu[2] プロセッサがユーザーモードになっている時間の割合が表示される
%wio cpu[3] プロセッサがアイドル状態で入出力の完了を待っている時間の割合が表示される
%idle cpu[0] プロセッサがアイドル状態で入出力を待っていない時間の割合が表示される

システムテーブルの状態(sar -v)
フィールド名 kstat 説明
proc-sz szproc mszproc 現在カーネル内で使用されているか、割り当てられているプロセスエントリ (proc 構造) の数
inod-sz szinode mszinode メモリー内の合計 i ノード数とカーネル内で割り当て済みの最大 i ノード数の比。これは厳密な上限ではなく、超えることもできる
file-sz szfile mszfile 開いているシステムファイルテーブルのサイズ。ファイルテーブルには領域が動的に割り当てられるので、sz は 0 として表示される
ov procovf inodeovf fileovf 現在カーネル内で使用されているか割り当てられている共有メモリーレコードテーブルのエントリ数。共有メモリーレコードテーブルには領域が動的に割り当てられるので、sz は 0 として表示される
lock-sz szlckr mszlckr 現在カーネル内で使用されているか割り当てられている共有メモリーレコードテーブルのエントリ数。共有メモリーレコードテーブルには領域が動的に割り当てられるので、sz は 0 として表示される

ボリュームのスワッピングと切り替え(sar -w)
フィールド名 kstat 説明
swpin/s swapin メモリーに転送される 1 秒当りの軽量プロセス数
bswin/s pgswapin メモリーからスワップアウトされる 1 秒当りの平均プロセス数。この数値が 1 より大きい場合は、メモリーを増やす必要がある
swpot/s swapout メモリーからスワップアウトされる 1 秒当りの平均プロセス数。この数値が 1 より大きい場合は、メモリーを増やす必要がある
bswot/s pgswapout スワップアウト用に転送される 1 秒当りのブロック数
pswch/s pswitch 1 秒当りのカーネルスレッド切り替え数

端末動作(sar -y)
フィールド名 kstat 説明
rawch/s rawch 1 秒当りの入力文字数 (raw 待ち行列)
canch/s canch 標準待ち行列で処理される 1 秒当りの文字数
outch/s outch 1 秒当りの出力文字数 (出力待ち行列)
rcvin/s rcvin 1 秒当りの受信側ハードウェア割り込み数
xmtin/s xmtin 1 秒当りの送信側ハードウェア割り込み数
mdmin/s mdmin 1 秒当りのモデム割り込み数

0 件のコメント:

コメントを投稿