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.c の kstat_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 件のコメント:
コメントを投稿