Solaris のシステム管理

パート XV システム性能の管理

このパートでは、システム性能を管理する方法について説明します。次の章が含まれます。

第 62 章「システム性能の概要」

システム性能についての概要を説明します。 

第 63 章「プロセスの管理手順」

プロセスコマンドを使用してシステム性能を向上する手順を説明します。 

第 64 章「性能の監視手順」

vmstatsar、およびディスク利用状態をチェックするコマンドを使用して性能を監視する手順を説明します。

第 65 章「ネットワーク性能の監視手順」

ネットワーク性能を監視する手順を説明します。 

第 66 章「カーネルパラメタの調整手順」

カーネルパラメータを調整する手順を説明します。 

第 67 章「スケジューラの参照情報」

SunOS 5.x スケジューラの概要を説明します。 

第 62 章 システム性能の概要

コンピュータやネットワークの性能を十分発揮させることは、システム管理作業の重要な仕事です。この章では、コンピュータシステムの性能の維持と管理に影響する要素について簡単に説明します。

この章の内容は次のとおりです。

システム性能における新機能

この節では、Solaris 2.6 リリースのシステム性能の新しい機能について説明します。

スケジューラ起動

スケジューラ起動は、特定のスケジューリングが必要なアプリケーション (データベースやマルチスレッド化されたアプリケーションなど) に、カーネルのスケジューリング機能を使用できるようにします。スケジューラ起動のマルチスレッド化サポートの変更は、カーネルと libthread ライブラリ間の専用インタフェースとして実装されています。libthread インタフェースは変更されていません。更に、アプリケーションは、カーネルにスケジューリングヒントを提供することによって、性能を向上させることができます。詳細については、libsched(3X) のマニュアルページを参照してください。

psrset コマンド

もう 1 つの新しい機能は、1 つまたは複数のアプリケーション専用に、プロセッサのグループを割り当てることができることです。/usr/sbin/psrset コマンドを使用すれば、システム管理者は、プロセッサセットの作成および管理を制御できます。詳細については、psrset(1M) のマニュアルページを参照してください。

UFS 直接入出力

直接入出力は、バルク入出力操作を向上させます。バルク入出力操作とは、大量のバッファサイズを使用して、大きなファイル (物理メモリーより大きなファイル) を転送することです。

バルク入出力操作の例は、衛星から転送されるデータのダウンロードです。これは、大量のデータをファイルに書き込みます。直接入出力データは、オペレーティングシステムのページキャッシング機構のオーバーヘッドを使用しないで、メモリーから読み取られたり、書き込まれたりします。

直接入出力の起動は、場合によっては制限があります。入出力が要求されたファイルがすでに他のアプリケーションによってマップされていた場合、そのページは、直接入出力操作が始まる前に、メモリーからフラッシュされなければなりません。

詳細については、directio(3C) のマニュアルページを参照してください。

mount コマンドに forcedirectio オプションを指定することによっても、ファイルシステムについて直接入出力を使用できます。ファイルシステムが大量の順次データを転送する場合のみ、直接入出力の効果が性能に現れます。

このオプションでファイルシステムをマウントすると、データはユーザーのアドレス空間とディスク間を直接転送されます。ファイルシステムに対して直接入出力を強制的に使用できない場合、ユーザーのアドレス空間とディスクとの間で転送されるデータは、まずカーネルアドレス空間に入れられます。

UFS ファイルシステムにおけるデフォルトの動作は、非強制直接入出力です。詳細は、mount_ufs のマニュアルページを参照してください。

UFS ファイルシステムに対し強制直接入出力を使用する方法

  1. スーパーユーザーになります。

  2. forcedirectio マウントオプションを指定してファイルシステムをマウントします。

        # mount -F ufs -o forcedirectio /dev/dsk/c0t3d0s7 /datab
    
  3. マウントされたファイルシステムで強制直接入出力が使用できるかを確認します。

        # mount
                        .
                        .
                        .
    /export/home on /dev/dsk/c0t3d0s7 forcedirectio/setuid/read/write/largefiles
    on Mon May 12 13:47:55 1997

/proc ファイルシステムの拡張とウォッチポイント

以前のフラットな /proc ファイルシステムは、状態情報と制御機能のためのサブディレクトリが追加されたディレクトリ階層に再構築されました。

また、/proc ファイルシステムは、ウォッチポイント機能も提供します。この機能は、プロセスのアドレス領域の個々のページの読み取り権または書き込み権を再マップするために使用されます。この機能は制限がなく、MT-安全です。

新しい /proc ファイル構造は、古い /proc インターフェースと完全なバイナリ互換を提供します。ただし、新しいウォッチポイント機能は、古いインターフェースでは使用できません。

デバッグ用ツールは、/proc の新しいウォッチポイント機能を使用するように変更されています。つまり、ウォッチポイントプロセス全体がより高速になったためです。

dbx デバッグ用ツールを使用してウォッチポイントを設定するときの次の制限は取り除かれました。

詳細については、proc(4)、core(4)、および adb(4) のマニュアルページを参照してください。

システム性能についての参照先

システム性能を監視する手順については、次を参照してください。

システム性能とシステム資源

コンピュータシステムの性能は、システムがその資源をどのように使用して割り当てるかによって左右されます。したがって、通常の条件下でどのように動作するかを知るために、システム性能を定期的に監視することが重要になります。期待できる性能についてよく把握し、問題が発生したときにそれを分析できなければなりません。

性能に影響を及ぼすシステム資源は次のとおりです。

コンピュータシステムの動作と性能に関する統計情報を表示するツールについては、第 64 章「性能の監視手順」を参照してください。

その他の関連情報

性能の問題は多岐にわたる要素が含まれるため、ここではすべてを詳しく説明することができません。システムやネットワークの性能の改善と調整のさまざまな側面については、書籍が出版されています。次の 3 冊が役立ちます。

プロセスとシステムの性能

表 62-1 に、プロセスに関連する用語を示します。

表 62-1 プロセスに関連する用語

用語 

説明 

プロセス 

実行中のプログラムの実体 

軽量プロセス (LWP) 

仮想 CPU または実行資源。LWP は、利用できる CPU 資源をスケジュールクラスと優先順位に基づいて使用するように、カーネルによってスケジュールされる。LWP には、メモリーに常駐する情報が入ったカーネルスレッドと、スワップ可能な情報が入った LWP が含まれる。 

アプリケーションスレッド 

ユーザーのアドレス空間内で独立して実行できる別個のスタックを持った一連の命令。LWP の最上部で多重化できる。 

1 つのプロセスは、複数の LWP と複数のアプリケーションスレッドで構成できます。カーネルはカーネルスレッド構造をスケジュールします。この構造は、SunOS 5.x 環境内をスケジュールする実体です。表 62-2 に各種プロセス構造体を示します。

表 62-2 プロセス構造体

構造体 

説明 

proc

プロセス全体に関連し、メインメモリーに常駐しなければならない情報が入っている。 

kthread

1 つの LWP に関連し、メインメモリーに常駐しなければならない情報が入っている。 

user

スワップ可能な、プロセス単位の情報が入っている。 

klwp

スワップ可能な、LWP プロセス単位の情報が入っている。 

図 62-1 に、これらの構造体の関係を示します。

図 62-1 プロセス構造体

Graphic

プロセス内のすべてのスレッドは、ほとんどのプロセス資源にアクセスできます。ほとんどすべてのプロセスの仮想メモリーが共有されます。あるスレッドが共有データを変更すると、その変更結果をプロセス内の他のスレッドが利用できます。

プロセスコマンド

表 62-3 に、プロセスを管理するためのコマンドを説明します。

表 62-3 プロセスを管理するためのコマンド

使用するコマンド 

目的 

ps

システム上のアクティブなプロセスの状態をチェックする。また、プロセスについての詳細な情報を表示する。 

dispadmin

デフォルトのスケジューリングポリシーをリストする。 

priocntl

プロセスに優先順位クラスを割り当てて、プロセスの優先度を管理する。 

nice

タイムシェアリングプロセスの優先度を変更する。 

プロセスを管理するコマンドの詳細については、第 63 章「プロセスの管理手順」を参照してください。

また、/usr/proc/bin 内のプロセスツールを使用すると、/proc にあるプロセスに関して詳細情報を表示できます。/proc はプロセスファイルシステム (PROCFS) とも呼ばれます。アクティブなプロセスのイメージは、そのプロセス ID 番号を使って /proc に格納されます。

プロセスツールは ps コマンドの一部のオプションに似ていますが、このツールから提供される出力の方が詳細です。一般に、プロセスツールには次の機能があります。

表 62-4 に、新しい /usr/proc/bin ユーティリティを示します。

表 62-4 プロセスツール

プロセスを制御するツール 

ツールの機能 

 

/usr/proc/bin/pstop pid

プロセスを停止する。 

/usr/proc/bin/prun pid

プロセスを再開する。 

/usr/proc/bin/ptime pid

microstate アカウントを使用してプロセスの時間を測定する。 

/usr/proc/bin/pwait [-v] pid

指定されたプロセスが終了するのを待つ。 

 

プロセスの詳細を表示するツール 

表示内容 

 

/usr/proc/bin/pcred pid

資格 

/usr/proc/bin/pfiles pid

開いたファイルの fstat 情報と fcntl 情報

/usr/proc/bin/pflags pid

/proc の追跡フラグ、保留シグナルと保持シグナル、lwp ごとの他の状態情報

/usr/proc/bin/pldd pid

各プロセスにリンクされた動的ライブラリ 

/usr/proc/bin/pmap pid

アドレス空間マップ 

/usr/proc/bin/psig pid

シグナルの動作 

/usr/proc/bin/pstack pid

lwp ごとの 16 進数 + 記号スタックトレース

/usr/proc/bin/ptree pid

指定した pid が入ったプロセスツリー 

/usr/proc/bin/pwdx pid

現在の作業ディレクトリ 

上記のコマンドで、pid はプロセス識別番号です。この番号は ps -ef コマンドを使用して表示できます。

プロセスの詳細を表示する、プロセスを開始して停止するなど、プロセスツールコマンドを使用してシステム管理作業を実行する方法については、第 63 章「プロセスの管理手順」を参照してください。

プロセスが無限ループ内でトラップされた場合や、実行時間が長すぎる場合は、プロセスを終了 (キル) できます。kill コマンドを使用してプロセスを終了する方法については、第 63 章「プロセスの管理手順」を参照してください。

プロセスのスケジュールングクラスと優先レベル

プロセスには、スケジュールクラスと優先レベルに従って CPU 時間が割り当てられます。デフォルトでは、SunOS 5.x オペレーティングシステムにはリアルタイム、システム、タイムシェアリング、対話型という 4 つのプロセス優先レベルがあります。

スケジュールポリシーによって、各プロセスの実行順序が決まります。

リアルタイムプロセスの優先順位は固定されています。リアルタイムプロセスを実行する準備ができている場合は、システムプロセスやタイムシェアリングプロセスを実行できません。

システムプロセスの優先順位は、開始時にカーネルによって確立され固定されています。システムクラス内のプロセスはカーネルによって制御されるので変更できません。

タイムシェアリングプロセスと対話型プロセスは、その優先順位を動的に割り当てるスケジューラによって制御されます。このクラスのプロセスの優先順位は操作できます。

ディスク入出力とシステム性能

ディスクは、コンピュータシステムに使用されるデータと命令を格納するために使用されます。ディスクアクセス動作と端末の動作を調べると、ディスク上のデータへのシステムのアクセス効率を検査できます。ディスク動作に関する統計情報を表示する iostat コマンドと sar コマンドについては、第 64 章「性能の監視手順」を参照してください。ディスク容量の管理と割り当て、ディスクをスライスに分割する方法については、第 21 章「ディスク管理の概要」を参照してください。

CPU が入出力の完了を待っている場合は、ディスクが低速化していることになります。ディスクの低速化を防ぐには、次のような方法があります。

メモリーとシステム性能

システム上で実行中のプログラムに、使用可能な容量よりも大きな物理メモリーが必要になると、性能が低下します。この問題が発生すると、オペレーティングシステムはページングとスワッピングを開始し、ディスクと CPU のオーバーヘッドを増加させます。

ページングでは、最近参照されていないページが使用可能なメモリーページの空きリストに移動されます。カーネルのほとんどの部分はメインメモリーに常駐しており、ページングできません。

スワッピングは、ページングデーモンがメモリーの需要に追いつけなくなると発生します。スワッパは、休眠中または停止した軽量プロセス (LWP) をスワップアウトしようとします。休眠中または停止した LWP がなければ、スワッパは実行可能プロセスをスワップアウトします。そして優先順位に基づいて LWP をスワップバックします。スワッパは実行可能なプロセスをメモリーに戻します。ページのページングとスワッピングが発生すると、ディスクと CPU のオーバーヘッドが増加します。

スワップ空間

スワップ空間は、実際にはスワッピングに使用されるファイルシステムです。スワップ空間のサイズは、アプリケーションの要件に基づいて設定する必要があります。購入先にアプリケーションの要件を問い合わせてください。

表 62-5 は、Solaris 2.x のインストールプログラムで、デフォルトのスワップ空間のサイズ設定に使用する計算式を示しています。スワップ空間のサイズを設定する方法がわからない場合は、これらのデフォルトのスワップサイズから始めるとよいでしょう。

表 62-5 デフォルトのスワップサイズ

物理メモリーのサイズ 

デフォルトのスワップサイズ 

16 〜 64M バイト 

32M バイト 

64 〜 128M バイト 

64M バイト 

128 〜 512M バイト 

128M バイト 

512M バイトを超える場合 

256M バイト 

スワップ空間の管理については、第 30 章「スワップ空間の追加構成の手順」を参照してください。

バッファー資源

read システムコールと write システムコール用のバッファーキャッシュは、カーネルアドレス空間内で一定の範囲の仮想アドレスを使用します。1 ページ分のデータがカーネルのアドレス空間に対応づけられ、プロセスが要求したデータ量がプロセスのアドレス空間に物理的にコピーされます。次に、ページはカーネル内で対応づけを解除されます。物理ページは、ページデーモンによって開放されるまでメモリー内に残ります。

これは、少数の入出力集中型プロセスによってメインメモリーが独占されたり、他のプロセスが排除される可能性があることを意味します。メインメモリーの独占を防ぐには、スクリプト内で並列に、または at コマンドを使用して、入出力集中型のプロセスの実行負荷を調整します。プログラマは、mmap(2)madvise(3) を使用して、プログラムが使用していないときに必ずメモリーを開放するように設定できます。

カーネルパラメタとシステム性能

カーネル内の多数の基本的なパラメタ (またはテーブル) は、maxusers パラメタの値から計算されます。テーブルには領域が動的に割り当てられます。ただし、これらのテーブルの最大値を設定して、アプリケーションが大量のメモリーを占めないようにすることができます。

デフォルトでは、maxusers はシステム上の物理メモリーのメガバイト数と同程度に設定されています。ただし、システムが 1024 を超える maxusers を設定することはありません。maxusers の最大値は 2048 であり、これは /etc/system ファイルを変更して設定できます。

カーネルパラメタについての詳細は、第 66 章「カーネルパラメタの調整手順」system(3S) のマニュアルページを参照してください。

表 62-6 のように、maxusers の他にも多数のカーネルパラメタが、システム上の物理メモリーの容量に基づいて動的に割り当てられます。

表 62-6 カーネルパラメタ

カーネルパラメタ 

説明 

ufs_ninode

i ノードテーブルの最大サイズ 

ncsize

ディレクトリ名検索キャッシュのサイズ 

max_nprocs

プロセスの最大サイズ 

ndquot

ディスク割り当て構造体の数 

maxuprc

1 ユーザー ID 当たりのユーザープロセスの最大数 

表 62-7 は、maxusers に割り当てられた値の影響を受けるカーネルパラメタのデフォルト設定を示しています。

表 62-7 カーネルパラメタのデフォルト設定

カーネルテーブル 

変数 

デフォルト設定 

i ノード 

ufs_ninode

max_nprocs + 16 + maxusers + 64

名前キャッシュ 

ncsize

max_nprocs + 16 + maxusers + 64

プロセス 

max_nprocs

10 + 16 * maxusers

割り当てテーブル 

ndquot

(maxusers * NMOUNT) / 4 + max_nprocs

ユーザープロセス 

maxuprc

max_nprocs - 5

カーネルパラメタの説明とデフォルト値を変更する方法については、第 66 章「カーネルパラメタの調整手順」を参照してください。

性能の監視

コンピュータの稼働中は、各種のシステム動作を追跡するためにオペレーティングシステムのカウンタが増分されます。追跡されるシステム動作は次のとおりです。

監視ツール

Solaris 2.x システムソフトウェアには、システム性能を追跡できるように複数のツールが提供されています。次のような監視ツールがあります。

表 62-8 性能監視ツール

ツール 

目的 

参照先 

sar ユーティリティと sadc ユーティリティ

システム動作データを収集および報告する。 

第 64 章「性能の監視手順」

ps コマンド

アクティブなコマンドについての情報を表示する。 

第 63 章「プロセスの管理手順」

パフォーマンスメーター 

ネットワーク上のシステムの状態をグラフィカルに表示する。 

第 64 章「性能の監視手順」

vmstat コマンドと iostat コマンド

システム動作データの要約。仮想メモリーの統計、ディスクの使用率、CPU の動作など。 

第 64 章「性能の監視手順」

swap コマンド

ユーザーのシステムで利用可能なスワップ領域についての情報を表示する。 

第 30 章「スワップ空間の追加構成の手順」

netstat コマンドと nfsstat コマンド

ネットワーク性能についての情報を表示する。 

第 65 章「ネットワーク性能の監視手順」

Solstice System Monitor (symon) 

UltraTM EnterpriseTM 3000、4000、5000、および 6000 のシステム上で、システム動作データを収集する。

Solstice System Monitor User's Guide

第 63 章 プロセスの管理手順

この章では、システムプロセスを管理する手順について説明します。この章で説明する手順は次のとおりです。

プロセスに関する情報の表示

この節では、プロセス情報を管理するために使用されるコマンドについて説明します。

ps コマンド

ps コマンドを使用すると、システム上でアクティブなプロセスの状態をチェックできます。また、プロセスについての技術的な情報も表示できます。このデータは、プロセスの優先順位をどのように設定するという判断や、ハングしていたりアクティブでないプロセスをどのように終了するかを決定するなどの管理作業に利用できます。

ps コマンドを使用すると、システム上でアクティブなプロセスの状態をチェックできます。使用するオプションに応じて、次の情報が表示されます。

表 63-1 は、ps コマンドで表示されるフィールドの一部を示しています。どのフィールドが表示されるかは、選択するオプションによって異なります。使用可能なすべてのオプションについては、ps(1) のマニュアルページを参照してください。

表 63-1 ps により出力されるフィールド

フィールド 

説明 

UID

プロセス所有者の実効ユーザー ID 

PID

プロセスの識別番号 

PPID

親プロセスの識別番号 

C

スケジューリングのためのプロセッサ使用率。このフィールドは -c オプションを使用すると表示されない。

CLS

プロセスが所属するスケジューリングクラス。リアルタイム、システム、またはタイムシェアリングのいずれか。このフィールドは、-c オプションを指定した場合にのみ表示される。

PRI

カーネルスレッドのスケジューリング優先順位。番号が大きいほど優先順位が高い。 

NI

プロセスの nice 番号。これは、スケジュール優先順位に影響する。プロセスの nice 番号を大きくすると、その優先順位が下がる。

ADDR

proc 構造体のアドレス。

SZ

プロセスの仮想アドレスサイズ 

WCHAN

プロセスが休眠中のイベントまたはロックのアドレス 

STIME

プロセスの起動時刻 (時、分、秒) 

TTY

プロセス (またはその親プロセス) が起動された端末。疑問符は、制御端末がないことを示す。 

TIME

プロセスの起動以降に使用した合計 CPU 時間 

CMD

プロセスを生成したコマンド 

プロセスを表示する方法

システム上で実行中のすべてのプロセスを表示するには、ps コマンドを使用します。

$ ps [-ef]

ps

ログインセッションに関連するプロセスのみを表示する。 

-ef

システム上で実行中のすべてのプロセスに関する詳細情報を表示する。 

例 - プロセスを表示する

次の例は、オプションを指定しないときの ps コマンドからの出力を示します。

$ ps
   PID TTY      TIME COMD
  1664 pts/4    0:06 csh
  2081 pts/4    0:00 ps

次の例は、ps -ef の出力を示します。この例は、システムのブート時に最初に実行されたプロセスが sched (スワッパ) であり、それに続いて init プロセス、pageout の順に実行されたことを示しています。

$ ps -ef
     UID   PID  PPID  C    STIME TTY     TIME CMD
    root     0     0  0   May 05 ?       0:04 sched
    root     1     0  0   May 05 ?      10:48 /etc/init -
    root     2     0  0   May 05 ?       0:00 pageout
    root     3     0  0   May 05 ?      43:21 fsflush
    root   238     1  0   May 05 ?       0:00 /usr/lib/saf/sac -t 300
    root   115     1  0   May 05 ?       0:10 /usr/sbin/rpcbind
    root   158     1  0   May 05 ?       0:00 /usr/lib/autofs/autom...
    root   134     1  0   May 05 ?       0:12 /usr/sbin/inetd -s
    root   107     1  0   May 05 ?      11:49 /usr/sbin/in.routed -q
    root   117     1  5   May 05 ?     899:32 /usr/sbin/keyserv
    root   125     1  0   May 05 ?       0:00 /usr/sbin/kerbd
    root   123     1  0   May 05 ?       4:17 /usr/sbin/nis_cachemgr
    root   137     1  0   May 05 ?       0:00 /usr/lib/nfs/statd
    root   139     1  0   May 05 ?       0:02 /usr/lib/nfs/lockd
    root   159     1 50   May 05 ?    8243:36 /usr/sbin/automount
    root   199   191  0   May 05 ?       0:00 lpNet
    root   162     1  0   May 05 ?       0:07 /usr/sbin/syslogd
    root   181     1  0   May 05 ?       0:03 /usr/sbin/nscd... 
    root   169     1  0   May 05 ?       5:09 /usr/sbin/cron
    root   191     1  0   May 05 ?       0:00 /usr/lib/lpsched
    root   210     1  0   May 05 ?       0:01 /usr/sbin/vold
    root   200     1  0   May 05 ?       0:08 /usr/lib/sendmail -bd -q1h
    root  4942     1  0   May 17 console 0:00 /usr/lib/saf/ttymon...
    root   208     1  0   May 05 ?       0:00 /usr/lib/utmpd
    root   241   238  0   May 05 ?       0:00 /usr/lib/saf/ttymon
    root  5748   134  0 17:09:49 ?       0:01 in.rlogind
    root  5750  5748  0 17:09:52 pts/0   0:00 -sh
    root  5770  5750  2 17:23:39 pts/0   0:00 ps -ef

プロセスに関する情報の表示 (/proc ツール)

/usr/proc/bin に入っているプロセスツールコマンドを使用すると、アクティブなプロセスに関する詳細な技術情報を表示できます。表 63-2 は、これらのプロセスツールを示しています。詳細は proc(1) のマニュアルページを参照してください。

表 63-2 情報を表示する /usr/proc/bin のプロセスツール

プロセスツール 

表示される内容 

pcred

資格 

pfiles

プロセス内で開いているファイルに関する fstat 情報と fcntl 情報

pflags

/proc 追跡フラグ、保留状態のシグナルと保持状態のシグナル、他の状態情報

pldd

プロセスにリンクされた動的ライブラリ 

pmap

アドレス空間マップ 

psig

シグナルの動作 

pstack

16 進 + シンボリックスタックトレース 

ptime

microstate アカウンティングを使用するプロセス時間 

ptree

プロセスが入っているプロセスツリー 

pwait

プロセス終了後の状態情報 

pwdx

プロセスの現在の作業ディレクトリ 


注 -

長いコマンド名を入力しなくてもすむように、プロセスツールディレクトリを PATH 変数に追加してください。これにより、各ファイル名の最後の部分 (たとえば、/usr/proc/bin/pwdx ではなく pwdx) を入力するだけで、プロセスツールを実行できます。


プロセスに関する情報を表示する方法

  1. (省略可能) ps コマンドからの出力を使用して、詳細情報を表示したいプロセスの識別番号を調べます。

        # ps -e | grep process
    

    process

    詳細情報を表示したいプロセスの名前 

    プロセス識別番号は、出力の第 1 列目に表示されます。

  2. 適切な /usr/bin/proc コマンドを使用して必要な情報を表示します。

        # /usr/proc/bin/pcommand pid
    

    pcommand

    実行したいプロセスツールコマンド。表 63-2 を参照。

    pid

    プロセスの識別番号 

例 - プロセスに関する情報を表示する

次の例は、プロセスツールコマンドを使用して lpsched プロセスに関する詳細情報を表示する方法を示しています。まず、長いプロセスツールコマンドを入力しなくてもすむように、/usr/proc/bin path パスが定義されています。次に、lpsched の識別番号が表示されています。最後に、3 つのプロセスツールコマンドからの出力が表示されています。

1# PATH=$PATH:/usr/proc/bin
 # export PATH
2# ps -e | grep lpsched
   191 ?        0:00 /usr/lib/lpsched
3# pwdx 191

191:    /
4# ptree 191

183   /usr/lib/lpsched
5# pfiles 191
210:    /usr/lib/lpsched
  Current rlimit: 1024 file descriptors
   0: S_IFIFO mode:0000 dev:165,0 ino:83 uid:0 gid:0 size:0
      O_RDWR
   1: S_IFIFO mode:0000 dev:165,0 ino:83 uid:0 gid:0 size:0
      O_RDWR
   3: S_IFCHR mode:0666 dev:32,24 ino:34307 uid:0 gid:3 rdev:21,0
      O_WRONLY FD_CLOEXEC
   4: S_IFDOOR mode:0444 dev:171,0 ino:4124226512 uid:0 gid:0 size:0
      O_RDONLY|O_LARGEFILE FD_CLOEXEC  door to nscd[200]
   5: S_IFREG mode:0664 dev:32,24 ino:311 uid:71 gid:8 size:0
      O_WRONLY

1. /usr/proc/bin ディレクトリを PATH 変数に追加します。

2. lpsched のプロセス識別番号を表示します。

3. lpsched の現在の作業ディレクトリを表示します。

4. lpsched が入っているプロセスツリーを表示します。

5. fstatfcntl の情報を表示します。

次の例は、pwait コマンドからの出力を示しています。このコマンドは、プロセスが終了するまで待ってから、発生した処理に関する情報を表示します。次の例は、コマンドツールウィンドウを閉じた後の pwait コマンドからの出力を示しています。

$ ps -e | grep cmdtool
  273 console 0:01 cmdtool
  277 console 0:01 cmdtool
  281 console 0:01 cmdtool
$ pwait -v 281
281: terminated, wait status 0x0000

プロセスの制御 (/proc ツール)

/usr/proc/bin に入っているプロセスツールを使用すると、プロセスの一部を制御できます。表 63-3 に、これらのプロセスツールを示します。詳細は、proc(1) のマニュアルページを参照してください。

表 63-3 制御を行う /usr/proc/bin のプロセスツール

プロセスツール 

機能 

pstop

プロセスを停止する。 

prun

プロセスを再開する。 


注 -

長いコマンド名を入力しなくてもすむように、プロセスツールディレクトリを PATH 変数に追加してください。これにより、各ファイル名の最後の部分 (たとえば、/usr/proc/bin/prun ではなく prun) を入力するだけで、プロセスツールを実行できます。


プロセスを制御する方法

  1. (省略可能) ps コマンドからの出力を使用して、詳細情報を表示したいプロセスの識別番号を調べます。

        # ps -e | grep process
    

    process

    詳細情報を表示したいプロセスの名前 

    プロセス識別番号は、出力の第 1 列目に表示されます。

  2. 適切な /usr/proc/bin コマンドを使用してプロセスを制御します。

        # /usr/proc/bin/pcommand PID
    

    pcommand

    実行したいプロセスツールコマンド。これらのコマンドについては、表 63-3 を参照。

    PID

    プロセスの識別番号 

  3. ps コマンドで、プロセスの状態を確認します。

        # ps | grep PID
    

例 - プロセスを制御する

次の例は、プロセスツールを使用して印刷ツールを停止したり、再起動したりする方法を示しています。

1# PATH=$PATH:/usr/proc/bin
 # export PATH
2# ps -e | grep print*
264 console 0:03 printtool
3# pstop 264
4# prun 264
 # ps | grep 264
264 console 0:03 printtool

1. /usr/proc/bin ディレクトリを PATH 変数に追加します。

2. 印刷ツールのプロセス識別番号を表示します。

3. 印刷ツールプロセスを停止します。

4. 印刷ツールプロセスを再開します。

プロセスの終了 (kill)

プロセスを強制的に終了 (kill) させなければならない場合があります。プロセスが無限ループに入っていたり、大きいジョブを開始したが完了する前に停止したい場合があります。所有しているプロセスであれば、どれでも終了できます。また、スーパーユーザーはプロセス ID が 01234 のものを除き、システム上のどんなプロセスでも終了できます。

詳細は、kill(1) のマニュアルページを参照してください。

プロセスを終了させる方法

  1. (省略可能) 別のユーザーが所有するプロセスを終了させるには、スーパーユーザーになります。

  2. (省略可能) ps コマンドからの出力を使用して、詳細情報を表示したいプロセスの識別番号を表示します。

        $ ps -e | grep process
    

    process

    詳細情報を表示したいプロセスの名前 

    プロセスの識別番号は、出力の第 1 列目に表示されます。

  3. kill コマンドを使用してプロセスを終了させます。

        $ kill [-9]PID ...

    -9

    プロセスを確実に終了させる。 

    PID . . .

    停止する 1 つ以上のプロセスの ID  

  4. ps コマンドを使用して、プロセスが停止したことを確認してください。

        $ ps -ef | grep PID ...

プロセスクラス情報の管理

次のリストは、システム上で構成されるクラスと、タイムシェアリングクラスのユーザー優先順位の範囲です。クラスの種類は次のとおりです。

priocntl を使用してプロセスのスケジュール優先順位を変更する

プロセスのスケジュール優先順位とは、プロセススケジューラによって割り当てられる優先順位のことです。これらの優先順位は、スケジューラのスケジュールポリシーに従って割り当てられます。dispadmin コマンドを使用すると、デフォルトのスケジュールポリシーを表示できます。dispadmin コマンドの使用方法については、「スケジューラの構成」を参照してください。

priocntl コマンドを使用すると、プロセスを優先順位クラスに割り当て、プロセスの優先順位を管理できます。プロセスを管理するための priocntl コマンドの使用方法については、「優先順位を指定する方法」を参照してください。

プロセスクラスに関する基本情報を表示する方法

priocntl -l コマンドを使用すると、プロセスクラスとスケジューリングパラメタを表示できます。

$ priocntl -l

例 - プロセスクラスに関する基本情報を表示する

次の例に priocntl -l コマンドからの出力を示します。

$ priocntl -l
CONFIGURED CLASSES
==================

SYS (System Class)

TS (Time Sharing)
	Configured TS User Priority Range: -20 through 20

プロセスのグローバル優先順位を表示する方法

ps コマンドを使用して、プロセスのグローバル優先順位を表示できます。

$ ps -ecl

グローバル優先順位は、PRI カラムの下に表示されます。

例 - プロセスのグローバル優先順位を表示する

次の例は、ps -ecl からの出力を示しています。PRI カラム内のデータは、pageout が最上位の優先順位を持ち、sh が最下位の優先順位であることを示しています。

$ ps -ecl
 F S UID PID  PPID CLS PRI  ADDR      SZ  WCHAN    TTY      TIME   COMD
19 T 0   0    0    SYS 96   f00d05a8   0           ?        0:03  sched
 8 S 0   1    0    TS  50   ff0f4678 185  ff0f4848 ?       36:51   init
19 S 0   2    0    SYS 98   ff0f4018   0  f00c645c ?        0:01 pageout
19 S 0   3    0    SYS 60   ff0f5998   0  f00d0c68 ?      241:01 fsflush
 8 S 0   269  1    TS  58   ff0f5338 303  ff49837e ?        0:07    sac
 8 S 0   204  1    TS  43   ff2f6008  50  ff2f606e console  0:02     sh

優先順位を指定する方法

  1. スーパーユーザーになります。

  2. 指定した優先順位を持つプロセスを起動します。

        # priocntl -e -c class-muserlimit-p pri command_name
    

    -e

    コマンドを実行する。 

    -c class

    プロセスを実行する範囲のクラスを指定する。デフォルトのクラスは TS (タイムシェアリング) または RT (リアルタイム) 。

    -m userlimit

    -p オプションを使用するときに、優先順位を上下できる最大範囲を指定する。

    -p pri command_name

    リアルタイムスレッド用に RT クラス内で相対優先順位を指定できるようにする。タイムシェアリングプロセスの場合は、-p オプションを使用すると -20 から +20 までのユーザー提供の優先順位を指定できる。

  3. ps -ecl コマンドで、プロセスの状態を確認します。

        # ps -ecl | grep command_name
    

例 - 優先順位を指定する

次の例では、ユーザーが提供する最上位の優先順位を使用して find コマンドを起動します。

# priocntl -e -c TS -m 20 -p 20 find . -name core -print
# ps -ecl | grep find

タイムシェアリングプロセスのスケジューリングパラメタを変更する方法

  1. スーパーユーザーになります。

  2. 実行中のタイムシェアリングプロセスのスケジューリングパラメタを変更します。

        # priocntl -s -m userlimit [-p userpriority] -i idtype idlist
    

    -s

    ユーザー優先順位の範囲の上限を設定し、現在の優先順位を変更できる。 

    -m userlimit

    -p オプションを使用するときに、優先順位を上下できる最大範囲を指定する。

    -p userpriority

    優先順位を指定できる。 

    -i idtype idlist

    「idtype」と「idlist」の組み合わせを使用してプロセスを識別する。「idtype」では PIDUID など、ID のタイプを指定する。

  3. ps -ecl コマンドで、プロセスの状態を確認します。

        # ps -ecl | grep idlist

例 - タイムシェアリングプロセスのスケジューリングパラメタを変更する

次の例では、500 ミリ秒のタイムスライス、クラス RT 内の優先順位 20、グローバル優先順位 120 を指定して、コマンドを実行します。

# priocntl -e -c RT -t 500 -p 20 myprog
# ps -ecl | grep myprog

プロセスのクラスを変更する方法

  1. (省略可能) スーパーユーザーになります。


    注 -

    プロセスをリアルタイムプロセスに変更したり、リアルタイムプロセスから変更したりするには、ユーザーはリアルタイムシェル内でスーパーユーザーであるか、または作業中でなければなりません。


  2. プロセスのクラスを変更します。

        # priocntl -s -c class -i idtype idlist
    

    -s

    ユーザー優先順位の範囲について上限を設定し、現在の優先順位を変更できる。 

    -c class

    クラス TS またはクラス RT を指定して、プロセスのクラスを変更する。

    -i idtype idlist

    idtypeidlist の組み合わせを使用してプロセスを識別する。idtype では PIDUID など、ID のタイプを指定する。

  3. ps -ecl コマンドで、プロセスの状態を確認します。

        # ps -ecl | grep idlist
    

例 - プロセスのクラスを変更する

次の例では、ユーザー 15249 が所有するすべてのプロセスをリアルタイムプロセスに変更します。

# priocntl -s -c RT -i uid 15249
# ps -ecl | grep 15249

注 -

スーパーユーザーとしてユーザープロセスをリアルタイムクラスに変更すると、その後ユーザーはリアルタイムのスケジューリングパラメタを (priocntl -s を使用して) 変更できません。


nice を使用してタイムシェアリングプロセスの優先順位を変更する

nice コマンドは、SunOS の旧バージョンとの下位互換性を保つためにのみサポートされます。priocntl コマンドを使用する方がプロセスを柔軟に管理できます。

プロセスの優先順位は、そのスケジュールクラスポリシーと nice number 番号によって決定されます。各タイムシェアリングプロセスは、ユーザーが与えた優先順位を加算して計算されるグローバル優先順位を持っています。これは、nice コマンドまたは priocntl コマンド、およびシステムによって計算される優先順位の影響を受けます。

プロセスの実行優先順位番号は、オペレーティングシステムによって割り当てられ、スケジュールクラス、使用される CPU 時間、nice 値 (タイムシェアリングプロセスの場合) などの複数の要素によって決定されます。

各タイムシェアリングプロセスは、親プロセスから継承したデフォルトの nice 番号で起動します。nice 値は、ps レポートの NI カラムに表示されます。

ユーザーは、自分が与える nice 番号優先順位を大きくしてプロセスの優先順位を下げることができます。ただし、nice 番号を小さくしてプロセスの優先順位を上げることができるのは、スーパーユーザー (または root) だけです。これは、ユーザーが各自のプロセスの優先順位を大きくして CPU の独占比率を高めるのを防ぐためです。

nice 番号の範囲は 0 から +40 までで、0 は最上位の優先順位を与えます。デフォルト値は 20 です。nice コマンドには利用できるバージョンが 2 つあり、一方は標準バージョンの /usr/bin/nice で、他方は C シェルの一部となっているバージョンです。

プロセスの優先順位を変更する方法

nice 番号を変更して、コマンドやプロセスの優先順位を変更できます。プロセスの優先順位を下げるには、次のコマンドを使用します。

/usr/bin/nice command_name

nice 番号を 4 単位で増やす (デフォルト)。

/usr/bin/nice +4 command_name

nice 番号を 4 単位で増やす。

/usr/bin/nice -10 command_name

nice 番号を 10 単位で増やす。

第 1 と第 2 のコマンドは、nice 番号を 4 単位で増やします (デフォルト)。第 3 のコマンドは、nice を 10 単位で増やしていますが負数の増分なのでプロセスの優先順位を下げます。

次のコマンドは、nice 番号を小さくしてコマンドの優先順位を上げます。

プロセスの優先順位を上げるには、次のコマンドを使用します。

/usr/bin/nice -10 command_name

nice 番号を小さくしてコマンドの優先順位を上げる。

/usr/bin/nice - -10 command_name

nice 番号を小さくしてコマンドの優先順位を上げる。最初のマイナス記号はオプションの記号で、第 2 のマイナス記号は負の数を示す。

上記のコマンドでは、nice 番号を小さくしてコマンド command_name の優先順位を上げます。第 2 のコマンドでは、2 つのマイナス記号が必要なので注意してください。

プロセスの問題解決方法

すでに判明している問題の解決方法のヒントを次に示します。

第 64 章 性能の監視手順

この章では、vmstatiostatdfsar コマンドを使用してシステム性能を監視する手順について説明します。この章で説明する手順は次のとおりです。

仮想メモリーの統計情報の表示 (vmstat)

vmstat コマンドを使用すると、仮想メモリーの統計情報と、CPU の負荷、ページング、コンテキスト切替え数、デバイス割り込み、システムコールなどのシステムイベントに関する情報を表示できます。また、vmstat コマンドを使用すると、スワップ、キャッシュフラッシュ、割り込みに関する統計情報も表示できます。

詳細は vmstat(1M) のマニュアルページを参照してください。

仮想メモリーの統計情報を表示する方法 (vmstat)

時間間隔を指定して vmstat コマンドを使用すると、仮想メモリーの統計情報を収集します。

$  vmstat n

n

レポート間の間隔を秒単位で表した値 

表 64-1vmstat の出力内のフィールドを示します。

表 64-1 vmstat コマンドからの出力

カテゴリ 

フィールド名 

説明 

procs

 

次の状態を報告する。 

 

r

ディスパッチ待ち行列内のカーネルスレッド数 

 

b

資源を待機中のブロックされたカーネルスレッド 

 

w

資源処理の完了を待機中のスワップアウトされた軽量プロセス数 

memory

 

実メモリーと仮想メモリーの使用状況を表示する。 

 

swap

使用可能なスワップ空間 

 

free

空きリストのサイズ 

page

 

ページフォルトとページング動作を 1 秒当りの単位数として表示する。 

 

re

回収されたページ数 

 

mf

軽度のフォルトと重大なフォルト 

 

pi

ページインされたキロバイト数 

 

po

ページアウトされたキロバイト数 

 

fr

解放されたキロバイト数 

 

de

最後にスワップインされたプロセスに必要だと予想されるメモリー 

 

sr

ページデーモンによって走査されたページ数 (現在は使用されていない)。sr が 0 以外の値であれば、ページデーモンは実行されている。

disk

 

最高 4 台のディスク上のデータを示す、1 秒当りのディスク処理数を表示する。 

faults

 

トラップ/割り込み率 (1 秒当り) を表示する。 

 

in

1 秒当りの割り込み数 

 

sy

1 秒当りのシステムコール数 

 

cs

CPU のコンテキスト切替え率 

cpu

 

CPU 時間の使用状況を表示する。 

 

us

ユーザー時間 

 

sy

システム時間 

 

id

アイドル時間

例 - 仮想メモリーの統計情報を表示する

次の例に、5 秒間隔で収集された統計情報に関する vmstat の表示を示します。

$ vmstat 5
 procs    memory            page             disk      faults     cpu
r b w  swap free re  mf  pi  po  fr de sr f0 s3 -- --  in  sy  cs us sy  id
0 0 8 28312  668  0   9   2   0   1  0  0  0  1  0  0  10  61  82  1  2  97
0 0 3 31940  248  0  10  20   0  26  0 27  0  4  0  0  53 189 191  6  6  88
0 0 3 32080  288  3  19  49   6  26  0 15  0  9  0  0  75 415 277  6 15  79
0 0 3 32080  256  0  26  20   6  21  0 12  1  6  0  0 163 110 138  1  3  96
0 1 3 32060  256  3  45  52  28  61  0 27  5 12  0  0 195 191 223  7 11  82
0 0 3 32056  260  0   1   0   0   0  0  0  0  0  0  0   4  52  84  0  1  99

システムイベント情報を表示する方法

vmstat -s を実行すると、システムを前回ブートした後に発生した各種システムイベントの合計が表示されます。

$ vmstat -s      0 swap ins
       0 swap outs
       0 pages swapped in
       0 pages swapped out 
 1329913 total address trans. faults taken
   25270 page ins
    3787 page outs
   38082 pages paged in
   13417 pages paged out
    3034 total reclaims
    3033 reclaims from free list
  335879 micro (hat) faults
  994034 minor (as) faults
   24210 major faults
  300634 copy-on-write faults
  141744 zero fill page faults
   34341 pages examined by the clock daemon
       5 revolutions of the clock hand
   28134 pages freed by the clock daemon
   11174 forks
    1259 vforks
    9086 execs 
11479519 cpu context switches 
95234544 device interrupts 
 1426943 traps 
 9100502 system calls
 1939346 total name lookups (cache hits 88%)
     496 toolong
  185566 user cpu
  977189 system cpu
92045953 idle cpu 
  130914 wait cpu

スワップの統計情報を表示する方法

vmstat -S を実行すると、スワップの統計情報が表示されます。

$ vmstat -S
 procs   memory       page              disk       faults        cpu
 r b w swap free si so pi po fr de sr f0 s1 s3 -- in sy cs     us sy id
 0 0 0 6224  5536 0  0  0 0  0  0  0  0  0  0  0  2  9  12     0  1  99

表 64-2 に上記以外のフィールドを示します。

表 64-2 vmstat -S コマンドからの出力

フィールド 

説明 

si

1 秒当りにスワップされた平均軽量プロセス数 

so

スワップアウトされた全プロセス数 


注 -

vmstat コマンドは、これらの両フィールドを出力しません。スワップ統計情報の詳細情報を表示するには、sar コマンドを使用してください。


キャッシュフラッシュの統計情報を表示する方法

vmstat -c を実行すると、仮想キャッシュのキャッシュフラッシュ統計情報が表示されます。

$ vmstat -c
flush statistics: (totals)
    usr      ctx     rgn    seg     pag     par
  14512    20201       0   1811 1857286  815505

このコマンドを実行すると、前回のブート後に発生したキャッシュフラッシュの合計数が表示されます。表 64-3 にキャッシュタイプを示します。

表 64-3 vmstat -c コマンドからの出力

キャッシュ名 

キャッシュタイプ 

usr

ユーザー 

ctx

コンテキスト 

rgn

領域 

seg

セグメント 

pag

ページ 

par

ページの一部 

各デバイス当りの割り込み数を表示する方法

vmstat -i を実行すると、各デバイス当りの割り込み数が表示されます。

$ vmstat -i

例 - 各デバイス当りの割り込み数を表示する

次の例は、vmstat -i コマンドからの出力を示します。

$ vmstat -i
interrupt         total     rate
---------------------------------
clock         104638405      100
esp0            2895003        2
fdc0                  0        0
---------------------------------
Total         107533408      102

ディスク使用状況の表示

iostat コマンドを使用すると、ディスクの入出力に関する統計情報を表示し、スループット、使用率、待ち行列の長さ、トランザクション率、サービス時間の計測結果を表示できます。このコマンドの詳細については、iostat(1M) のマニュアルページを参照してください。

ディスクの使用状況を表示する方法

時間間隔を指定して iostat コマンドを使用すると、ディスク動作情報を表示できます。

$ iostat 5
      tty     fd0     sd1     sd3     cpu
tin tout Kps tps serv Kps tps serv Kps tps serv us sy wt id
  0    0   0   0    0   1   0   79   0   0   58  0  1  0 99

出力の 1 行目は、前回のブート以降の統計情報を示します。2 行目以降は、時間間隔ごとの統計情報を示します。デフォルトでは、端末 (tty)、ディスク (fdsd)、CPU (cpu) の統計情報が表示されます。

表 64-4iostat コマンド出力内のフィールドを示します。

表 64-4 iostat n コマンドからの出力

統計情報の対象 

フィールド 

説明 

端末 

 

 

 

tin

端末の入力待ち行列内の文字数 

 

tout

端末の出力待ち行列内の文字数 

ディスク 

 

 

 

bps

1 秒当りのブロック数 

 

tps

1 秒当りのトランザクション数 

 

serv

ミリ秒単位の平均サービス時間 

CPU  

 

 

 

us

ユーザーモード 

 

sy

システムモード 

 

wt

入出力待機中 

 

id

アイドル状態 

例 - ディスクの使用状況を表示する

次の例は、5 秒間隔で収集されるディスク統計情報を示します。

$ iostat 5
      tty          fd0           sd3       cpu
 tin tout bps tps serv  bps tps serv  us sy wt  id
   0    1   0   0    0    1   0 5640   0  1  0  98
   0   10   0   0    0    0   0    0   0  1  0  99
   0   10   0   0    0    0   0    0   0  1  0  99
   0   10   0   0    0   27   3  319   0  4  9  88
   0   10   0   0    0    2   0 5061   0  0  0  99
   0   10   0   0    0    0   0    0   0  0  0 100
   0   10   0   0    0    0   0    0   0  0  0 100
   0   10   0   0    0    0   0    0   0  0  0 100
   0   10   0   0    0    0   0    0   0  0  0 100

拡張ディスク統計情報を表示する方法

iostat -xtc を実行すると、拡張ディスク統計情報が表示されます。

$ iostat -xtc
               extended disk statistics               tty          cpu
disk  r/s w/s Kr/s Kw/s wait actv  svc_t  %w %b  tin tout us sy  wt id
sd0   0.2 1.7  1.0  9.7  0.0  0.1   39.8   0  3   0   9   1  6   9  85
sd1   0.5 2.5 10.6 21.0  0.0  0.1   26.6   0  5      
sd2   0.0 0.2  0.1  0.0  0.0  0.0  157.7   0  0

このコマンドは、ディスクごとに 1 行ずつ出力を表示します。表 64-5 は、出力フィールドを示します。

表 64-5 iostat -xtc コマンドからの出力

フィールド名 

説明 

r/s

1 秒当りの読み取り数 

w/s

1 秒当りの書き込み数 

Kr/s

1 秒当りの読み取りキロバイト数 

Kw/s

1 秒当りの書き込みキロバイト数 

wait

サービス (待ち行列の長さ) を待機中の平均トランザクション数 

actv

サービス中の平均トランザクション数 

svc_t

ミリ秒単位で表した平均サービス時間 

%w

待ち行列が空でない時間の割合 

%b

ディスクがビジーである時間の割合 

ディスク使用統計の表示

df コマンドを使用すると、マウントされている各ディスク上の空きディスク容量が表示されます。レポート用の統計情報では使用可能容量の合計の内先頭に 10% の空き容量を残しておくので、df から報告される「使用可能」ディスク容量は全容量の 90% のみに相当します。この先頭の空き容量は、性能を高めるために常に空になっています。

実際に df からレポートされるディスク容量の割合は、使用済み容量を使用可能容量で割った値です。

ファイルシステムの容量が 90% を超える場合は、cp を使用して、空いているディスクにファイルを転送するか、tar または cpio を使用してテープに転送するか、ファイルを削除してください。

このコマンドについての詳細は、df(1M) のマニュアルページを参照してください。

ファイルシステム情報を表示する方法

df -k コマンドを使用すると、ファイルシステム情報がキロバイト単位で表示されます。

$ df -kFilesystem         kbytes   used   avail capacity  Mounted on
/dev/dsk/c0t3d0s0   192807   19980  153547    12%    /

表 64-6 は、df -k コマンドの出力を示します。

表 64-6 df -k コマンドからの出力

フィールド名 

説明 

kbytes

ファイルシステム内の使用可能容量の合計 

used

使用されている容量 

avail

使用可能容量 

capacity

使用されている容量が全容量に占める割合 

mounted on

マウントポイント 

例 - ファイルシステム情報を表示する

次の例に、df -k コマンドからの出力を示します。

$ df -kFilesystem        kbytes    used   avail capacity  Mounted on
/dev/dsk/c0t3d0s0   192807   19980  153547    12%    /
/dev/dsk/c0t3d0s6   384871  184385  162006    54%    /usr
/proc                    0       0       0     0%    /proc
fd                       0       0       0     0%    /dev/fd
/dev/dsk/c0t3d0s5   192807   54502  119025    32%    /opt
swap                184672     200  184472     1%    /tmp

システム動作の監視 (sar)

sar コマンドは、次の目的で使用します。

このコマンドについての詳細は、sar(1) のマニュアルページを参照してください。

ファイルアクセスをチェックする方法 (sar)

sar -a コマンドを使用すると、ファイルアクセス操作の統計情報が表示されます。

$ sar -a
SunOS venus 5.6 Generic sun4c 08/20/96
14:28:12    iget/s namei/s dirbk/s
14:29:12         0       2       1 
14:30:12         0       4       1 
14:31:12         0       3       1
Average          0       3       1 

表 64-7 に、レポートされるオペレーティングシステムのルーチンを示します。

表 64-7 sar -a コマンドからの出力

フィールド名 

説明 

iget/s

ディレクトリ名検索キャッシュ (dnlc) 内に入っていない i ノードに対して出された要求数

namei/s

1 秒当りのファイルシステムパスの検索数。nameidnlc 内にディレクトリ名が見つからない場合は、iget が呼び出され、ファイルまたはディレクトリの i ノードが取得される。したがって、ほとんどの igetsdnlc が欠落した結果である。

dirbk/s

1 秒間に実行されたディレクトリブロックの読み取り回数 

表示される値が大きいほど、カーネルはユーザーファイルへのアクセスに長い時間を費やしています。この時間には、プログラムとアプリケーションによるファイルシステムの使用量が反映されます。-a オプションを使用すると、アプリケーションのディスク依存度を表示できるので便利です。

バッファー動作をチェックする方法 (sar)

sar -b コマンドを使用すると、バッファー動作の統計情報が表示されます。

バッファーは、i ノード、シリンダグループブロック、間接ブロックなどのメタデータをキャッシュに書き込むために使用されます。

$ sar -b
SunOS venus 5.6 Generic sun4m    08/20/96
0:0:03 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s
1:0:02     0       0     100       0       0      57       0   0

表 64-8 は、-b オプションを指定したときに表示されるバッファー動作を示します。最も重要なエントリは、キャッシュヒット率 %rcache%wcache です。この 2 つのエントリは、システムバッファーリングの効率を測定します。%rcache が 90 未満の場合や、%wcache が 65 未満の場合は、バッファー領域を大きくすれば性能を改善できる可能性があります。

表 64-8 sar -b コマンドからの出力

フィールド名 

説明 

bread/s

ディスクからバッファーキャッシュに投入された 1 秒当りの平均読み取り数 

lread/s

バッファーキャッシュからの 1 秒当りの平均論理読み取り数 

%rcache

バッファーキャッシュ内で見つかった論理読み込み数の小数部 (lread/s に対する bread/s の比を 100% から差し引いた値)

bwrit/s

バッファーキャッシュからディスクに書き込まれた 1 秒当りの平均物理ブロック数 (512 ブロック) 

lwrite/s

バッファーキャッシュへの 1 秒当りの平均論理書き込み数 

%wcache

バッファーキャッシュ内で見つかった論理書き込み数の小数部 (lwrit/s に対する bwrit/s の比を 100% から差し引いた値)

pread/s

キャラクタ型デバイスインタフェースを使用する 1 秒当りの平均物理読み取り数 

pwrit/s

キャラクタ型デバイスインタフェースを使用する 1 秒当りの平均物理書き込み要求数 

例 - バッファー動作をチェックする

次の sar -b 出力の例は、すべてのデータは許容範囲に収まっているので、%rcache バッファーと %wcache バッファーが処理速度低下の原因ではないことを示します。

$ sar -b
SunOS venus 5.6 Generic sun4m    08/20/96
14:28:12 bread/s lread/s %rcache bwrit/s lwrit/s %wcache pread/s pwrit/s
14:29:12       0      14     100       6      17      67       0       0
14:30:12       0      12      99       6      16      65       0       0
14:31:12       0      12     100       6      16      65       0       0

Average        0      12     100       6      16      66       0       0

システムコールの統計情報をチェックする方法 (sar)

sar -c コマンドを使用すると、システムコールの統計情報が表示されます。

$ sar -c
SunOS venus 5.6 Generic sun4m    08/20/96
00:00:03 scall/s sread/s swrit/s fork/s exec/s rchar/s wchar/s
01:00:02       9       0       0   0.01   0.01      33       9

表 64-9 に、-c オプションでレポートされる次のシステムコールのカテゴリを示します。一般に、readswrites はシステムコール合計の約半分ですが、割合はシステムで実行中の動作によって大幅に変動します。

表 64-9 sar -c コマンドからの出力

フィールド名 

説明 

scall/s

1 秒当りのすべてのタイプのシステムコール数 (通常は、ビジーな 4 ないし 6 ユーザーのシステム上で 1 秒当り約 30) 

sread/s

1 秒当りの read システムコール数

swrit/s

1 秒当りの write システムコール数

fork/s

1 秒当りの fork システムコール数 (4 ないし 6 ユーザーのシステム上で毎秒約 0.5)。この数値は、シェルスクリプトの実行中は大きくなる。

exec/d

1 秒当りの exec システムコール数。exec/sfork/s で割った値が 3 より大きい場合は、効率の悪い PATH 変数を調べる。

rchar/s

read システムコールによって転送される 1 秒当りの文字 (バイト) 数

wchar/s

write システムコールによって転送される 1 秒当りの文字 (バイト) 数

例 - システムコールの統計情報をチェックする

次の例に、sar -c コマンドからの出力を示します。

$ sar -c
Solaris mysys Solaris sun4c    08/22/96
14:28:12 scall/s sread/s swrit/s  fork/s  exec/s rchar/s wchar/s
14:29:12      17       2       2    0.28    0.28    2527    1542
14:30:12      25       2       1    0.50    0.47    1624     295
14:31:12      21       2       2    0.35    0.35    1812     703

Average       21       2       2    0.38    0.37    1987     847

ディスク動作をチェックする方法 (sar)

sar -d コマンドを使用すると、ディスク動作の統計情報が表示されます。

$ sar -d
SunOS venus 5.6 Generic sun4m    08/20/96
00:00:02 device %busy avque r+w/s blks/s avwait avserv
01:00:02 fd0        0   0.0     0      0    0.0    0.0
         sd1        0   0.0     0      0   19.6   35.4
         sd3        0   0.0     0      0   10.8   55.6

表 64-10 は、-d オプションを使用したときに表示されるディスクデバイス動作を示します。待ち行列内に何かがあるときは、待ち行列の長さと待ち時間が計測されるので注意してください。%busy の値が小さい場合に、待ち行列とサービス時間が大きければ、変更されたブロックをディスクに随時書き込むために、システムが定期的に処理していることを示す場合があります。

表 64-10 sar -d コマンドからの出力

フィールド名 

説明 

device

監視中のディスクデバイス名 

%busy

デバイスが転送要求のサービスに費やす時間の割合 

avque

平均待ち時間と平均サービス時間の合計 

r+w/s

デバイスへの 1 秒当りの読み取り転送数と書き込み転送数 

blks/s

デバイスに転送される 1 秒当りの 512 バイトブロック数 

avwait

待ち行列内でアイドル状態で待機中の要求を転送する平均ミリ秒数 (待ち行列に要求が入っているときのみ計測) 

avserv

デバイスが転送要求を完了するまでの平均ミリ秒数 (ディスクの場合は、この値にシークタイム、回転待ち時間、データ転送時間が含まれる) 

例 - ディスク動作をチェックする

次の 2 つの例は、sar -d コマンドの例を示します。第 1 の例は、SCSI (Small Computer System Interface、「スカジー」と発音します) 以外の統合ディスク、つまり SCSI インタフェースを使用しないディスクを持つコンピュータからのものです。この例は、データをハードディスク (hdsk-0) からフロッピーディスク (fdsk-0) に転送中であることを示します。

$ sar -d
SunOS venus 5.6 Generic sun4m    08/20/96
13:46:28  device %busy avque r+w/s blks/s  avwait  avserv
13:46:58  hdsk-0    6   1.6     3      5    13.8    23.7
          fdsk-0   93   2.1     2      4   467.8   444.0
13:47:28  hdsk-0   13   1.3     4      8    10.8    32.3
          fdsk-0  100   3.1     2      5   857.4   404.1
13:47:58  hdsk-0   17    .7     2     41      .6    48.1
          fdsk-0  100   4.4     2      6  1451.9   406.5
Average   hdsk-0   12   1.2     3     18     8.4    34.7
          fdsk-0   98   3.2     2      5   925.7   418.2

次の例は、SCSI 統合ディスク、つまり SCSI インタフェースを使用するディスクを持つコンピュータからのものです。この例は、ある SCSI ハードディスク (sd00-0) から別の SCSI 統合ディスク (sd00-1) にデータを転送中であることを示します。

$ sar -d
SunOS venus 5.6 Generic sun4m    08/20/96
14:16:24  device %busy avque r+w/s blks/s  avwait  avserv
14:16:52 sd00-0      2   1.0     1      3     0.0    17.9
         sd00-1      6   1.1     3      5     2.0    23.9
14:17:21 sd00-0      2   1.0     1      2     0.0    19.6
         sd00-1      6   1.1     3      5     0.2    24.3
14:17:48 sd00-0      3   1.0     1      3     0.3    18.3
         sd00-1      7   1.1     3      5     1.3    25.4
14:18:15 sd00-0      3   1.0     1      3     0.0    17.2
         sd00-1      5   1.0     2      5     0.0    21.6
Average  sd00-0      2   1.0     1      3     0.1    18.2
         sd00-1      6   1.0     3      5     0.9    23.0

ページアウトとメモリーをチェックする方法 (sar)

sar -g オプションを使用すると、ページアウトとメモリー解放動作が (平均値として) 表示されます。

$ sar -g
SunOS venus 5.6 Generic sun4m    08/20/96
00:00:03 pgout/s ppgout/s pgfree/s pgscan/s %ufs_ipf
01:00:02    0.00     0.00     0.00     0.00     0.00

sar -g で表示される出力は、より多くのメモリーが必要かどうかを判断するのに役立ちます。ps -elf コマンドを使用すると、ページデーモンに使用される CPU サイクル数が表示されます。サイクル数が大きく、pgfree/spgscan/s の値が大きければ、メモリー不足を示します。

また、sar -g を使用すると、i ノードの再利用間隔が短すぎるために、再利用可能なページが失われているかどうかも表示されます。

表 64-11 に、-g オプションからの出力を示します。

表 64-11 sar -g コマンドからの出力

フィールド名 

説明 

pgout/s

1 秒間にページアウトされた要求数 

ppgout/s

1 秒間に実際にページアウトされたページ数 (1 つのページアウト要求で複数のページがページアウトされることがある) 

pgfree/s

空きリストに配置された 1 秒当りのページ数 

pgscan/s

ページデーモンによって走査された 1 秒当りのページ数。この値が大きい場合は、ページデーモンが空きメモリーのチェックに大量の時間を費やしている。これは、メモリーを増やす必要があることを示す。

%ufs_ipf

ufs がそれに関連付けられた再使用可能ページを持つ iget によって空きリストから取り出された割合。これらのページはフラッシュされ、プロセスが回収できなくなる。したがって、これはページフラッシュを伴う igets の割合である。値が大きければ、i ノードの空きリストがページ境界であり、ufs の i ノード数を増やす必要があることを示す。

例 - ページアウトとメモリーをチェックする

次の例に、sar -g コマンドからの出力を示します。

$ sar -g
SunOS skisun 5.6 Generic sun4m    08/20/96
14:28:12  pgout/s ppgout/s pgfree/s pgscan/s %ufs_ipf
15:29:13     0.00     0.00     0.35     8.18   0.00
16:29:12     1.20     2.20     3.35     3.40   0.00

カーネルメモリーの割り当てをチェックする方法 (sar)

sar -k コマンドを使用すると、Kernel Memory Allocator (KMA) に関して次の動作が表示されます。

KMA を使用すると、カーネルサブシステムは必要に応じてメモリーを割り当て、解放できます。最大量のメモリーを静的に割り当てるのではなく、ピークを下回る負荷を要求するのが予想されるため、KMA はメモリー要求を「小」 (256 バイト未満)、「大」 (512 バイト〜 4K バイト)、「サイズ超過」 (4K バイト超) という 3 つのカテゴリに分けます。また、2 つのメモリープールを管理して、「小」要求と「大」要求を満たします。「サイズ超過」要求は、システムページアロケータからメモリーを割り当てることで満たされます。

KMA 資源を使用するドライブや STREAMS の作成に使用中のシステムを調査する場合は、sar -k を使用すると便利です。それ以外の場合は、このコマンドで提供される情報は不要なはずです。KMA 資源を使用するが、終了前には特に資源を返さないドライバやモジュールがあると、メモリーのリークが生じることがあります。メモリーリークが発生すると、KMA によって割り当てられるメモリーは時間が経つにつれて増大します。したがって、sar -kalloc フィールドの値が時間が経つにつれ増える場合は、メモリーリークの可能性があります。メモリーリークのもう 1 つの兆候は、要求が失敗することです。この問題が発生した場合は、メモリーリークのために KMA がメモリーを予約したり割り当てたりできなくなっている可能性があります。

メモリーリークが発生した場合は、KMA からメモリーを要求したが返していないドライバや STREAMS がないかどうかをチェックする必要があります。

$ sar -k
SunOS venus 5.6 Generic sun4m    08/20/96
00:00:03  sml_mem   alloc  fail   lg_mem    alloc  fail  ovsz_alloc  fail
01:00:02  1245184  955332     0  3661824  2786336    0      2412544     0

表 64-12 に、-k オプションからの出力を示します。

表 64-12 sar -k コマンドからの出力

フィールド名 

説明 

sml_mem

KMA が小メモリー要求プール内で使用できるメモリーのバイト数 (小要求は 256 バイト未満) 

alloc

KMA が小メモリー要求プールから小メモリー要求に割り当てたメモリーのバイト数 

fail

小量のメモリーで失敗した要求数 

lg_mem

KMA が大メモリー要求プール内で使用できるメモリーのバイト数 (大要求は 512 バイトから 4K バイトまで) 

alloc

KMA が大メモリー要求プールから大メモリー要求に割り当てたメモリーのバイト数 

fail

大メモリーで失敗した要求数 

ovsz_alloc

サイズ超過要求 (4K バイトを超える要求) に割り当てられたメモリーの容量。これらの要求はページアロケータによって満たされるので、プールはない。 

fail

サイズ超過メモリーで失敗した要求数 

例 - カーネルメモリーの割り当てをチェックする(sar)

次の例は、sar -k 出力を示します。

$ sar -k
SunOS skisun 5.6 Generic sun4m    08/20/96

14:28:12  sml_mem  alloc  fail  lg_mem  alloc  fail ovsz_alloc fail
14:29:12   95232   73472     0  311296  198656    0     180224    0
14:30:12   95232   75120     0  311296  198656    0     180224    0
14:31:12   95232   73600     0  311296  197632    0     180224    0

Average    95232   74064     0  311296  198314    0     180224    0

プロセス間通信をチェックする方法 (sar)

sar -m コマンドを使用すると、プロセス間通信の動作が表示されます。

$ sar -m 
SunOS venus 5.6 Generic sun4m    08/20/96
 00:00:03   msg/s  sema/s 
01:00:02    0.00    0.05 

通常、これらの数字は、メッセージやセマフォを使用するアプリケーションを実行していない限りゼロ (0.00) です。

表 64-13 に、-m オプションからの出力を示します。

表 64-13 sar -m コマンドからの出力

フィールド名 

説明 

msg/s

1 秒当りのメッセージ処理 (送受信) 数 

sema/s

1 秒当りのセマフォ処理数 

例 - プロセス間通信をチェックする

次の例は、sar -m コマンドからの出力を示します。

$ sar -m
SunOS venus 5.6 Generic sun4m    08/20/96
14:28:12   msg/s  sema/s
14:29:12    0.00    0.00
14:30:12    0.00    0.00
14:31:12    0.00    0.00

Average     0.00    0.00

ページイン動作をチェックする方法 (sar)

sar -p コマンドを使用すると、保護フォルトや変換フォルトを含むページイン動作が表示されます。

$ sar -p
SunOS venus 5.6 Generic sun4m    08/20/96
00:00:03 atch/s pgin/s ppgin/s pflt/s vflt/s slock/s
01:00:02   0.00   0.00    0.00   0.49   1.20    0.00

表 64-14 は、-p オプションを指定したときに表示される統計情報を示します。

表 64-14 sar -p コマンドからの出力

フィールド名 

説明 

atch/s

現在メモリーに入っているページを回収して満たされる 1 秒当りのページフォルト数 (1 秒当りの付加数)。この例には、空きリストから無効なページを回収し、別のプロセスに現在使用中のテキストページを共有する処理が含まれる (たとえば、複数のプロセスが同じプログラムテキストにアクセスしている場合など)。 

pgin/s

ファイルシステムがページイン要求を受信する 1 秒当りの回数 

ppgin/s

ページインされる 1 秒当りのページ数。ソフトロック要求 (slock/s を参照) などの 1 つのページイン要求や、大型ブロックサイズでは、複数のページがページインされることがある。

pflt/s

保護エラーによるページフォルト数。保護フォルトの例には、ページへの不正なアクセスや、「書き込み時コピー」などがある。通常、この数値は主に「書き込み時コピー」からなっている。 

vflt/s

1 秒当りのアドレス変換ページフォルト数。これは、有効性フォルトと呼ばれ、所定の仮想アドレスに有効なプロセステーブルエントリが存在しないときに発生する。 

slock/s

物理入出力を要求するソフトウェアロック要求によって発生する 1 秒当りのフォルト数。ソフトロック要求の発生例には、ディスクからメモリーへのデータ転送などがある。システムはデータを受信しないページをロックするので、別のプロセスはそれを回収して使用できない。 

例 - ページイン動作をチェックする

次の例は、sar -p からの出力を示します。

$ sar -p
SunOS venus 5.6 Generic sun4m    08/20/96

14:28:12  atch/s  pgin/s ppgin/s  pflt/s  vflt/s slock/s
14:29:12    1.17   12.87   12.87    5.67   11.28    1.15
14:30:12    1.67    7.08    7.08    9.12    6.33    0.67
14:31:12    1.37   12.48   12.48    6.83   10.78    1.03

Average     1.40   10.81   10.81    7.21    9.46    0.95

待ち行列動作をチェックする方法 (sar)

sar -q コマンドを使用すると、待ち行列に要求が入っている平均待ち行列の長さと、その間の時間の割合が表示されます。

$ sar -q
SunOS venus 5.6 Generic sun4m    08/20/96
00:00:03 runq-sz %runocc swpq-sz %swpocc
01:00:02     1.1       0

注 -

システムに空きメモリーが十分ない場合でも、スワップアウトされた軽量プロセス数が 0 より大きい場合があります。この状態は、休眠中の軽量プロセスがスワップアウトされ処理されない場合 (プロセスや軽量プロセスが休眠中であり、キーボードやマウスの入力を待機中の場合など) に発生します。


表 64-15 は、-q オプションを指定する場合の出力を示します。

表 64-15 sar -q コマンドの出力

フィールド名 

説明 

runq-sz

CPU を実行するためにメモリー内で待機中のカーネルスレッド数。通常、この値は 2 未満になる。値が常に 2 より大きい場合は、システムが CPU の限界に到達している可能性がある。 

%runocc

ディスパッチ待ち行列が使用されている時間の割合 

swpq-sz

スワップアウトされた平均軽量プロセス数 

%swpocc

軽量プロセスがスワップアウトされた時間の割合 

例 - 待ち行列動作をチェックする

次の例は、sar -q コマンドからの出力を示します。%runocc の値が大きく (90 パーセント超)、runq-sz が 2 より大きい場合は、CPU の負荷が大きく、応答速度が低下しています。この場合は、CPU の容量を増やしてシステムの応答速度を適正化する必要があります。

$ sar -q
SunOS venus 5.6 Generic sun4m    08/20/96
14:28:12 runq-sz %runocc swpq-sz %swpocc
14:29:12     1.2      53    1       100
14:30:12     1.3      38
14:31:12     1.1      37

Average      1.2      43

未使用のメモリーをチェックする方法 (sar)

sar -r コマンドを使用すると、現在使用されていないメモリーページ数とスワップファイルのディスクブロック数が表示されます。

$ sar -r
SunOS venus 5.6 Generic sun4m    08/20/96
00:00:03 freemem freeswap
01:00:02     983   187590

表 64-16 は、-r オプションを使用する場合の出力を示します。

表 64-16 sar -r コマンドからの出力

フィールド名 

説明 

freemem

コマンドによるサンプル収集間隔の間にユーザープロセスに利用できる平均メモリーページ数。ページサイズはマシンに応じて異なる。 

freeswap

ページスワップに使用可能な 512 バイトのディスクブロック数 

例 - 未使用のメモリーをチェックする

次の例は、sar -r コマンドからの出力を示します。

$ sar -r
SunOS venus 5.6 Generic sun4m    08/20/96
14:28:12 freemem freeswap
14:29:12     268    3034
14:30:12     351    3009
14:31:12     297    3033

Average      306    3025

CPU の使用状況をチェックする方法 (sar)

sar -u コマンドを使用すると、CPU の使用状況が表示されます。

$ sar -u
SunOS venus 5.6 Generic sun4m    08/20/96
00:00:03    %usr    %sys    %wio %idle
01:00:02       0       1       0    99

(オプションを指定しない sar コマンドは、sar -u と同じです)。所定の瞬間に、プロセッサはビジー状態またはアイドル状態になっています。ビジー状態のときは、プロセッサはユーザーモードまたはシステムモードになっています。アイドル状態のときは、プロセッサは入出力の完了を待っているか、または何も処理することがないので「待機」している状態です。

表 64-17 は、-u オプションを使用する場合の出力を示します。

表 64-17 sar -u コマンドからの出力

フィールド名 

説明 

%sys

プロセッサがシステムモードになっている時間の割合が表示される。 

%user

プロセッサがユーザーモードになっている時間の割合が表示される。 

%wio

プロセッサがアイドル状態で入出力の完了を待っている時間の割合が表示される。 

%idle

プロセッサがアイドル状態で入出力を待っていない時間の割合が表示される。 

一般に、%wio の値が大きい場合は、ディスクの処理速度が低下していることを意味します。

例 - CPU の使用状況をチェックする

次の例は、sar -u コマンドからの出力を示します。

$ sar -u
SunOS venus 5.6 Generic sun4m    08/20/96
14:28:12    %usr    %sys    %wio   %idle
14:29:12      22      27      18      32
14:30:12       6      24      13      57
14:31:12       8      28      19      45

Average       12      27      17      45

システムテーブルの状態をチェックする方法 (sar)

sar -v コマンドを使用すると、プロセステーブル、i ノードテーブル、ファイルテーブル、共有メモリーレコードテーブルの状態が表示されます。

$ sar -v
SunOS venus 5.6 Generic sun4m    08/20/96
00:00:03 proc-sz      ov   inod-sz   ov  file-sz ov  lock-sz
01:00:02  56/426       0  1311/1311   0  372/372  0   0/0 

表 64-18 は、-v オプションを使用する場合の出力を示します。

表 64-18 sar -v コマンドからの出力

フィールド名 

説明 

proc-sz

現在カーネル内で使用されているか、割り当てられているプロセスエントリ (proc 構造) の数

inod-sz

メモリー内の合計 i ノード数とカーネル内で割り当て済みの最大 i ノード数の比。これは厳密な上限ではなく、超えることもできる。 

file-sz

開いているシステムファイルテーブルのサイズ。ファイルテーブルには領域が動的に割り当てられるので、sz0 として表示される。

ov

現在カーネル内で使用されているか割り当てられている共有メモリーレコードテーブルのエントリ数。共有メモリーレコードテーブルには領域が動的に割り当てられるので、sz0 として表示される。

lock-sz

現在カーネル内で使用されているか割り当てられている共有メモリーレコードテーブルのエントリ数。共有メモリーレコードテーブルには領域が動的に割り当てられるので、sz0 として表示される。

例 - システムテーブルの状態をチェックする

次の例は、sar -v コマンドからの出力を示します。この例は、すべてのテーブルに十分なサイズがあり、オーバーフローは発生しないことを示します。これらのテーブルには、いずれも物理メモリーの容量に基づいて領域が動的に割り当てられます。

$ sar -v
SunOS venus 5.6 Generic sun4m    08/20/96
14:28:12 proc-sz ov inod-sz ov file-sz ov lock-sz
14:29:12  28/200  0 297/300  0  63/0    0  6/0
14:30:12  30/200  0 297/300  0  65/0    0  6/0
14:31:12  28/200  0 296/300  0  63/0    0  6/0

スワップ動作をチェックする方法 (sar)

sar -w コマンドを使用すると、スワッピングと切り替え動作が表示されます。

$ sar -w
SunOS venus 5.6 Generic sun4m    08/20/96
00:00:03  swpin/s  bswin/s  swpot/s  bswot/s  pswch/s
01:00:02     0.00      0.0     0.00      0.0       12

表 64-19 は、目標の値と規則を示します。

表 64-19 sar -w コマンドからの出力

フィールド名 

説明 

swpin/s

メモリーに転送される 1 秒当りの軽量プロセス数 

bswin/s

メモリーからスワップアウトされる 1 秒当りの平均プロセス数。この数値が 1 より大きい場合は、メモリーを増やす必要がある。 

swpot/s

メモリーからスワップアウトされる 1 秒当りの平均プロセス数。この数値が 1 より大きい場合は、メモリーを増やす必要がある。 

bswot/s

スワップアウト用に転送される 1 秒当りのブロック数 

pswch/s

1 秒当りのカーネルスレッド切り替え数 


注 -

すべてのプロセスのスワップインには、プロセスの初期化が含まれます。


例 - スワップ動作をチェックする

次の例は、sar -w コマンドからの出力を示します。

$ sar -w
SunOS venus 5.6 Generic sun4m    08/20/96
14:28:12 swpin/s pswin/s swpot/s pswot/s pswch/s
14:29:12    0.00     0.0    0.00     0.0      22
14:30:12    0.00     0.0    0.00     0.0      12
14:31:12    0.00     0.0    0.00     0.0      18

Average     0.00     0.0    0.00     0.0      18

端末動作をチェックする方法 (sar)

sar -y コマンドを使用すると、端末デバイスの動作を監視できます。

$ sar -y
SunOS saturn 5.6 prefcs3 sun4c   08/20/96
00:00:03 rawch/s canch/s outch/s rcvin/s xmtin/s mdmin/s
01:00:02       0       0       0       0       0       0

大量の端末入出力がある場合は、このレポートを使用して不良な行がないかどうかを判別できます。表 64-20 は、記録される動作の定義を示します。

表 64-20 sar -y コマンドからの出力

フィールド名 

説明 

rawch/s

1 秒当りの入力文字数 (raw 待ち行列) 

canch/s

標準待ち行列で処理される 1 秒当りの文字数 

outch/s

1 秒当りの出力文字数 (出力待ち行列) 

rcvin/s

1 秒当りの受信側ハードウェア割り込み数 

xmtin/s

1 秒当りの送信側ハードウェア割り込み数 

mdmin/s

1 秒当りのモデム割り込み数 

1 秒当りのモデム割り込み数 (mdmin/s) は 0 に近く、1 秒当りの送受信割り込み数 (xmtin/srcvin/s) は、それぞれ着信または発信文字数以下になるはずです。そうでない場合は、不良回線がないかどうかをチェックしてください。

例 - 端末動作をチェックする

次の例は、sar -y コマンドからの出力を示します。

$ sar -y
SunOS venus 5.6 Generic sun4m    08/20/96
14:28:12 rawch/s canch/s outch/s rcvin/s xmtin/s mdmin/s
14:29:12       0       1     157       1       3       0
14:30:12       0       2      34       2       2       0
14:31:12       0       1      11       1       2       0

Average        0       1      67       1       2       0

システム全体の性能をチェックする方法 (sar)

sar -A コマンドを使用すると、システム全体の性能が表示されます。

このコマンドを使用すると、全体像を把握できます。複数のタイムセグメントからのデータが表示される場合は、レポートに平均値が含まれます。

システム動作データの自動収集 (sar)

システム動作データを自動的に収集するには、sadcsa1sa2 という 3 つのコマンドを使用します。

sadc データ収集ユーティリティは、システム動作に関するデータを定期的に収集し、24 時間ごとに 1 つのファイルに 2 進形式で保存します。sadc を定期的に (通常は 1 時間ごとに) 実行するだけでなく、システムがマルチユーザーモードでブートするときにも実行するように設定できます。データファイルは、ディレクトリ /usr/adm/sa に格納されます。各ファイルには sadd という名前が与えられます。この場合、dd は現在の日付です。このコマンドの書式は次のとおりです。

/usr/lib/sa/sadc [t n] [ofile]

このコマンドは、t 秒 (t は 5 秒より長くする必要があります) 間隔で サンプルデータを n 回収集します。次に、ファイル ofile または標準出力に 2 進形式で書き込みます。tn を省略すると、特殊ファイルに 1 度だけ書き込まれます。

ブート時に sadc を実行する

カウンタが 0 にリセットされるときから統計情報を記録するために、sadc コマンドをシステムのブート時に実行する必要があります。sadc をブート時に確実に実行するには、日ごとのデータファイルにレコードを書き込むコマンド行を /etc/init.d/perf ファイルに入れなければなりません。

コマンドエントリの書式は次のとおりです。

su sys -c "/usr/lib/sa/sadc /usr/adm/sa/sa`date +5d`"

sa1 を使用して sadc を定期的に実行する

定期的にレコードを生成するには、sadc を定期的に実行する必要があります。そのためには、シェルスクリプト sa1 を呼び出す 1 行を /var/spool/cron/sys ファイルに挿入するのが最も簡単な方法です。このスクリプトは sadc を起動し、日ごとのデータファイル /var/adm/sa/sadd に書き込みます。書式は次のとおりです。

/usr/lib/sa/sa1 [t n]

引数 tn を指定すると、レコードは t 秒間隔で n 回書き込まれます。この 2 つの引数を省略すると、レコードは 1 度しか書き込まれません。

sa2 を使用してレポートを生成する

もう 1 つのシェルスクリプト sa2 は、2 進データファイルではなくレポートを生成します。sa2 コマンドは sar コマンドを呼び出して、レポートファイルに ASCII 出力を書き込みます。

システム動作データを収集する (sar)

sar コマンドを使用すると、システム動作データそのものを収集するか、または sadc で作成された日ごとの動作ファイルに収集された情報をレポートできます。

sar コマンドの書式は次のとおりです。

sar [-aAbcdgkmpqruvwy] [-o file] t [n] 
sar [-aAbcdgkmpqruvwy] [-s time] [-e time] [-i sec] [-f file]

次の sar コマンドは、オペレーティングシステム内の累積動作カウンタから t 秒間隔で n 回データを収集します (t が 5 秒ないし 5 秒以上の値でないと、コマンドそのものがサンプルに影響を与えることがあります)。サンプルの収集間隔を指定しなければなりません。指定しないと、このコマンドは第 2 の書式に従って動作します。n のデフォルト値は 1 です。次の例では、10 秒間隔で 2 つのサンプルが収集されます。-o オプションを指定すると、サンプルは 2 進形式でファイルに保存されます。

$ sar -u 10 2

その他に、sar コマンドについては次の点に注意する必要があります。

表 64-21sar コマンドのオプションとその動作を示します。

表 64-21 sar コマンドのオプション

オプション 

動作 

-a

ファイルアクセス操作をチェックする。 

-b

バッファー動作をチェックする。 

-c

システムコールをチェックする。 

-d

各ブロックデバイスの動作をチェックする。 

-g

ページアウトとメモリーの解放をチェックする。 

-k

カーネルメモリーの割り当てをチェックする。 

-m

プロセス間通信をチェックする。 

-p

スワップとディスパッチ動作をチェックする。 

-q

待ち行列動作をチェックする。 

-r

未使用メモリーをチェックする。 

-u

CPU の使用率をチェックする。 

-v

システムテーブルの状態をチェックする。 

-w

ボリュームのスワッピングと切り替えをチェックする。 

-y

端末動作をチェックする。 

-A

システム全体の性能をリポートする (すべてのオプションを入力した場合と同じです)。 

オプションを使用しなければ、-u オプションを指定してコマンドを呼び出すのと同じです。

自動データ収集を設定する方法

  1. スーパーユーザーになります。

  2. エディタを使用して、/etc/init.d/perf ファイルを開きます。このファイルには、sadc 起動命令が入っています。次の行がコメント解除されていることを確認します。

        MATCH=`who -r|grep -c "[234][		 ]*0[	 ]*[S1]"`  if [ ${MATCH} -eq 1 ]
        then su sys -c "/usr/lib/sa/sadc /var/adm/sa/sa`date +%d`"  fi

    このバージョンの sadc コマンドは、カウンタが 0 にリセットされる時間 (ブート時) を示す特殊なレコードを書き込みます。sadc の出力はファイル sadd に格納されます (この場合、dd は現在の日付です)。このファイルは、システム動作の日レコードとして機能します。

  3. エディタを使用して、/var/spool/cron/crontabs/sys ファイル (システムの crontab ファイル) を開きます。次の行をコメント解除します。

        # 0 * * * 0-6 /usr/lib/sa/sa1
        # 20,40 8-17 * * 1-5 /usr/lib/sa/sa1

    第 1 のエントリは、時間に関するレコードを、1 週 7 日間の 1 時間ごとに /var/adm/sa/sadd に書き込みます。

    第 2 のエントリは、月曜から金曜の午前 8 時から午後 5 時までのピーク作業時間中に、各正時から 20 分過ぎと 40 分過ぎの 2 度ずつレコードを /var/adm/sa/sadd に書き込みます。

    したがって、この 2 つの crontab エントリによって、月曜から金曜までは午前 8 時から午後 5 時まで 20 分ごとに、それ以外の曜日は 1 時間ごとに、レコードが /var/adm/sa/sadd に書き込まれます。これらのデフォルトは、必要に応じて変更できます。

第 65 章 ネットワーク性能の監視手順

この章では、ネットワーク性能を監視する方法について説明します。この章で説明する手順は次のとおりです。

ネットワーク性能の監視

表 65-1 は、ネットワーク性能の監視に使用できるコマンドを示しています。

表 65-1 ネットワーク監視コマンド

コマンド 

用途 

ping

ネットワーク上でホストの応答を調べる。 

spray

パケットサイズの信頼性をテストする。パケットが遅延またはドロップされていないかどうかを判別できる。 

snoop

ネットワークからパケットを取り込み、各クライアントから各サーバーへのコールを追跡する。 

netstat

TCP/IP トラフィックに使用されるインタフェース、IP ルーティングテーブル、UDPTCPICMPIGMP に関するプロトコルごとの統計情報など、ネットワークの状態が表示される。

nfsstat

NFS の問題の分析に使用できるサーバーとクライアントの統計情報の集計が表示される。 

ネットワーク上のホストの応答をチェックする方法

ping コマンドを使用して、ネットワーク上のホストの応答をチェックします。

$ ping hostname

物理的な問題があると思われる場合は、ping を使用してネットワーク上の複数のホストの応答時間を調べることができます。あるホストからの応答が期待したとおりでない場合は、そのホストを調査できます。物理的な問題は、次の原因で発生することがあります。

このコマンドについての詳細は、ping(1M) のマニュアルページを参照してください。

例 - ネットワーク上のホストの応答をチェックする

ping の最も単純なバージョンは、ネットワーク上のホストにパケットを 1 つ送信します。正しい応答を受信すると、メッセージ「host is alive」を出力します。

$ ping elvis
elvis is alive

-s オプションを指定すると、ping は 1 秒ごとに 1 つずつデータグラムをホストに送信します。その後で、次のように各応答と往復の所要時間を出力します。

$ ping -s pluto
64 bytes from pluto (123.456.78.90): icmp_seq=0. time=10. ms
64 bytes from pluto (123.456.78.90): icmp_seq=5. time=0. ms
64 bytes from pluto (123.456.78.90): icmp_seq=6. time=0. ms
^C
----pluto PING Statistics----
8 packets transmitted, 8 packets received, 0% packet loss

round-trip (ms) min/avg/max = 0/2/10

ネットワーク上のホストにパケットを送信する方法

spray コマンドを使用すると、パケットサイズの信頼性をテストできます。

$ spray [ -c count -d interval -l packet_size] hostname
-c count

送信するパケット数 

-d interval

パケットを送信するたびに一時停止するマイクロ秒数。遅延を使用しないと、バッファーを使い果たす可能性がある。 

-l packet_size

パケットサイズ 

hostname

パケットを送信するシステム 

このコマンドについての詳細は、spray(1M) のマニュアルページを参照してください。

例 - ネットワーク上のホストにパケットを送信する

次の例では、それぞれが 2048 バイト (-l 2048) のパケット 100 個 (-c 100) がホストに送信されます 。パケットは、各バースト間で 20 マイクロ秒の遅延時間 (-d 20) ごとに送信されます。

$ spray -c 100 -d 20 -l 2048 pluto
sending 100 packets of length 2048 to pluto ...
no packets dropped by pluto
279 packets/sec, 573043 bytes/sec

ネットワークからパケットを取り込む方法

ネットワークからパケットを取り込み、各クライアントから各サーバーへのコールを追跡するには、snoop を使用します。このコマンドは、ネットワーク性能の問題を素早く発見できるように正確なタイムスタンプを提供します。詳細は、snoop(1M) のマニュアルページを参照してください。

# snoop

パケットがドロップされる場合は、バッファー領域不足または CPU の過負荷が原因となっていることがあります。

ネットワークの状態をチェックする方法

netstat コマンドを使用すると、ネットワークインタフェース、ルーティングテーブル、各種プロトコルの状態に統計情報など、ネットワークの状態に関する情報を表示できます。

$ netstat [-i] [-r] [-s]

-i

TCP/IP インタフェースの状態を表示する。 

-r

IP ルーティングテーブルを表示する。 

-s

UDPTCPICMPIGMP プロトコルの統計情報を表示する。

詳細は、netstat(1M) のマニュアルページを参照してください。

例 - ネットワークの状態をチェックする

次の例は、netstat -i コマンドからの出力を示しています。このコマンドは、TCP/IP トラフィックに使用されるインタフェースの状態を表示します。

$ netstat -i
Name  Mtu  Net/Dest    Address      Ipkts  Ierrs Opkts  Oerrs Collis Queue
lo0   8232 software    localhost     1280   0     1280     0       0    0
le0   1500 loopback    venus      1628480   0   347070    16   39354    0

この表示画面は、マシンが各インタフェース上で送受信したパケット数を示しています。有効なネットワークトラフィックがあるマシンは、IpktsOpkts が絶えず増加し続けるはずです。

衝突カウント (Collis) を発信パケット数 (Opkts) で割ると、ネットワーク衝突率を計算できます。上記の例では、衝突率は 3.5 パーセントです。ネットワーク全体の衝突率が 5 ないし 10 パーセントを超える場合は、問題が発生していることがあります。

入力エラー数を合計入力パケット数で割ると (Ierrs/Ipkts)、入力パケットエラー率を計算できます。出力パケットエラー率は、出力エラー数を合計出力パケット数で割った値 (Oerrs/Opkts) です。入力エラー率が高い (0.25 パーセントを超える) 場合は、ホストがパケットをドロップしている可能性があります。

次の例は、netstat -s コマンドからの出力を示しています。このコマンドは、UDPTCPICMPIGMP プロトコルに関してプロトコルごとの統計情報を表示します。

UDP
	udpInDatagrams      =196543	udpInErrors         =     0
	udpOutDatagrams     =187820

TCP	
 tcpRtoAlgorithm     =     4	tcpRtoMin           =   200
	tcpRtoMax           = 60000	tcpMaxConn          =    -1
	tcpActiveOpens      = 26952	tcpPassiveOpens     =   420
	tcpAttemptFails     =  1133	tcpEstabResets      =     9
	tcpCurrEstab        =    31	tcpOutSegs          =3957636
	tcpOutDataSegs      =2731494	tcpOutDataBytes     =1865269594
	tcpRetransSegs      = 36186	tcpRetransBytes     =3762520
	tcpOutAck           =1225849	tcpOutAckDelayed    =165044
	tcpOutUrg           =     7	tcpOutWinUpdate     =   315
	tcpOutWinProbe      =     0	tcpOutControl       = 56588
	tcpOutRsts          =   803	tcpOutFastRetrans   =   741
	tcpInSegs           =4587678
	tcpInAckSegs        =2087448	tcpInAckBytes       =1865292802
	tcpInDupAck         =109461	tcpInAckUnsent      =     0
	tcpInInorderSegs    =3877639	tcpInInorderBytes   =-598404107
	tcpInUnorderSegs    = 14756	tcpInUnorderBytes   =17985602
	tcpInDupSegs        =    34	tcpInDupBytes       = 32759
	tcpInPartDupSegs    =   212	tcpInPartDupBytes   =134800
	tcpInPastWinSegs    =     0	tcpInPastWinBytes   =     0
	tcpInWinProbe       =   456	tcpInWinUpdate      =     0
	tcpInClosed         =    99	tcpRttNoUpdate      =  6862
	tcpRttUpdate        =435097	tcpTimRetrans       = 15065
	tcpTimRetransDrop   =    67	tcpTimKeepalive     =   763
	tcpTimKeepaliveProbe=     1	tcpTimKeepaliveDrop =     0

IP	
 ipForwarding        =     2	ipDefaultTTL        =   255
	ipInReceives        =11757234	ipInHdrErrors       =     0
	ipInAddrErrors      =     0	ipInCksumErrs       =     0
	ipForwDatagrams     =     0	ipForwProhibits     =     0
	ipInUnknownProtos   =     0	ipInDiscards        =     0
	ipInDelivers        =4784901	ipOutRequests       =4195180
	ipOutDiscards       =     0	ipOutNoRoutes       =     0
	ipReasmTimeout      =    60	ipReasmReqds        =  8723
	ipReasmOKs          =  7565	ipReasmFails        =  1158
	ipReasmDuplicates   =     7	ipReasmPartDups     =     0
	ipFragOKs           = 19938	ipFragFails         =     0
	ipFragCreates       =116953	ipRoutingDiscards   =     0
	tcpInErrs           =     0	udpNoPorts          =6426577
	udpInCksumErrs      =     0	udpInOverflows      =   473
	rawipInOverflows    =     0

ICMP	
 icmpInMsgs          =490338	icmpInErrors        =     0
	icmpInCksumErrs     =     0	icmpInUnknowns      =     0
	icmpInDestUnreachs  =   618	icmpInTimeExcds     =   314
	icmpInParmProbs     =     0	icmpInSrcQuenchs    =     0
	icmpInRedirects     =   313	icmpInBadRedirects  =     5
	icmpInEchos         =   477	icmpInEchoReps      =    20
	icmpInTimestamps    =     0	icmpInTimestampReps =     0
	icmpInAddrMasks     =     0	icmpInAddrMaskReps  =     0
	icmpInFragNeeded    =     0	icmpOutMsgs         =   827
	icmpOutDrops        =   103	icmpOutErrors       =     0
	icmpOutDestUnreachs =    94	icmpOutTimeExcds    =   256
	icmpOutParmProbs    =     0	icmpOutSrcQuenchs   =     0
	icmpOutRedirects    =     0	icmpOutEchos        =     0
	icmpOutEchoReps     =   477	icmpOutTimestamps   =     0
	icmpOutTimestampReps=     0	icmpOutAddrMasks    =     0
	icmpOutAddrMaskReps =     0	icmpOutFragNeeded   =     0
	icmpInOverflows     =     0
IGMP:
        0 messages received
        0 messages received with too few bytes
        0 messages received with bad checksum
        0 membership queries received
        0 membership queries received with invalid field(s)
        0 membership reports received
        0 membership reports received with invalid field(s)
        0 membership reports received for groups to which we belong
        0 membership reports sent

次の例は、netstat -r コマンドからの出力を示しています。このコマンドは、IP ルーティングテーブルを表示します。

Routing Table:
  Destination          Gateway           Flags  Ref   Use    Interface
-------------------- -------------------- ----- ----- ------ ---------
localhost            localhost             UH       0   2817  lo0
earth-bb             pluto                 U        3  14293  le0
224.0.0.0            pluto                 U        3      0  le0
default              mars-gate             UG       0  14142  

表 65-2 は、netstat -r レポート内のフィールドを示しています。

表 65-2 netstat -r コマンドからの出力

フィールド名 

 

説明 

Flags

U

G

H

D

ルートが動作している。 

ルートはゲートウェイを経由する。 

ルートはホスト宛てである。 

ルートはリダイレクトを使用して動的に作成された。 

Ref

 

同じリンク層を共有する現在のルート数を示す。 

Use

 

送信されたパケット数を示す。 

Interface

 

ルートに使用されるネットワークインタフェースを表示する。 

NFS サーバーとクライアントの統計情報を表示する方法

NFS 分散ファイルサービスは、ローカルコマンドをリモートホストへの要求に変換するリモートプロシージャコール (RPC) 機能を使用します。リモートプロシージャコールは同期しています。つまり、クライアントアプリケーションは、サーバーがコールを完了して結果を返すまでブロックまたは中断されます。NFS の性能に影響を及ぼす重要な要素の 1 つは再伝送率です。

ファイルサーバーがクライアントの要求に応答できない場合、クライアントは指定された回数だけ要求を再伝送して終了します。再伝送されるたびにシステムにオーバーヘッドがかかり、ネットワークトラフィックが増大します。再伝送率が高すぎると、ネットワーク性能が低下します。再伝送率が高い場合は、次のことを調べます。

表 65-3 に、クライアントとサーバーの統計情報を表示するための nfsstat オプションを説明します。

表 65-3 クライアント/サーバー統計情報を表示するためのコマンド

nfsstat のオプション 

表示されるもの 

nfsstat -c

クライアントの統計情報 

nfsstat -s

サーバーの統計情報 

netstat -m

ファイルシステムごとのネットワーク統計情報 

nfsstat -c を使用するとクライアントの統計情報が表示され、nfsstat -s を使用するとサーバーの統計情報が表示されます。また、netstat -m を使用すると各ファイルシステムのネットワーク統計情報が表示されます。詳細は、nfsstat(1M) のマニュアルページを参照してください。

例 - NFS サーバーとクライアントの統計情報を表示する

次の例は、クライアント pluto に関する RPC と NFS のデータを示しています。

$ nfsstat -c

        Client rpc:
Connection oriented:
calls    badcalls  badxids  timeouts newcreds  badverfs   timers     
1595799  1511      59       297      0         0          0          
cantconn nomem     interrupts 
1198      0         7          
Connectionless:
calls    badcalls  retrans  badxids  timeouts  newcreds   badverfs   
80785    3135      25029    193      9543      0          0          
timers   nomem     cantsend   
17399    0         0          

Client nfs:
calls    badcalls  clgets   cltoomany  
1640097  3112      1640097  0          
Version 2: (46366 calls)
null     getattr   setattr  root     lookup     readlink  read       
0 0%     6589 14%  2202 4%  0 0%     11506 24%  0 0%      7654 16%   
wrcache  write     create   remove   rename     link      symlink    
0 0%     13297 28% 1081 2%  0 0%     0 0%       0 0%      0 0%       
mkdir    rmdir     readdir  statfs     
24 0%    0 0%      906 1%   3107 6%    
Version 3: (1585571 calls)
null    getattr    setattr  lookup     access     readlink  read     
0 0%    508406 32% 10209 0% 263441 16% 400845 25% 3065 0%   117959 7%  
write    create     mkdir    symlink    mknod    remove   rmdir 
69201 4% 7615 0%    42 0%    16 0%      0 0%     7875 0%  51 0%      
rename   link       readdir  readdir+   fsstat   fsinfo   pathconf   
929 0%   597 0%     3986 0%  185145 11% 942 0%   300 0%   583 0%     
commit     
4364 0%    

Client nfs_acl:
Version 2: (3105 calls)
null       getacl     setacl     getattr    access     
0 0%       0 0%       0 0%       3105 100%  0 0%       
Version 3: (5055 calls)
null       getacl     setacl     
0 0%       5055 100%  0 0%    

表 65-4 は、nfsstat -c コマンドの出力を示しています。

表 65-4 nfsstat -c コマンドの出力

フィールド名 

説明 

calls

送信された合計コール数 

badcalls

RPC によって拒否された合計コール数 

retrans

再伝送の合計回数。このクライアントの場合、再伝送回数は 1 パーセント未満 (6888 回のコールのうち 10 回のタイムアウト)。これは、一時的な障害が原因で発生することがある。1 パーセント以上の値は、問題が発生している場合がある。 

badxid

1 つの NFS 要求に対して重複する承認を受信した回数 

timeout

タイムアウトになったコール数 

wait

クライアントハンドルを利用できないためにコールが待機せざるを得なかった回数 

newcred

認証情報を再表示しなければならなかった回数 

timers

タイムアウト値がコールに対して指定されたタイムアウト値以上になった回数 

readlink

シンボリックリンクに対して読み込まれた回数。この数が大きすぎる (10 パーセントを超える) ときは、シンボリックリンクが多すぎることを示す場合がある。 

次の例は、nfsstat -m コマンドからの出力を示しています。

pluto$ nfsstat -m
/usr/man from pluto:/export/svr4/man
Flags: vers=2,proto=udp,auth=unix,hard,intr,dynamic,
        rsize=8192, wsize=8192,retrans=5
 Lookups: srtt=13 (32ms), dev=10 (50ms), cur=6 (120ms)
 All:     srtt=13 (32ms), dev=10 (50ms), cur=6 (120ms)

表 65-5 は、この nfsstat -m コマンドのミリ秒単位で表示された出力を示しています。

表 65-5 nfsstat -m コマンドの出力

フィールド名 

説明 

srtt

平準化された平均往復時間 

dev

平均偏差 

cur

現在の「予想」応答時間 

ネットワークのハードウェア構成要素が問題の原因と思われる場合は、ケーブルとコネクタを慎重に調べる必要があります。

第 66 章 カーネルパラメタの調整手順

この章では、カーネルパラメタを調整する手順について説明します。この章で説明する手順は以下のとおりです。

カーネルパラメタを表示する

sysdef -i コマンドを使用して、現在のカーネルパラメタの値を表示します。

# sysdef -i
* Hostid
  53001b80
*
* sun4m Configuration
* Devices
	packages (driver not attached)
		disk-label (driver not attached)
	   deblocker (driver not attached)
  	obp-tftp (driver not attached)
              .
              .
              .
options, instance #0
aliases (driver not attached)
openprom (driver not attached)
iommu, instance #0
	sbus, instance #0
		espdma, instance #0
			esp, instance #0
				sd (driver not attached)
				st (driver not attached)
				      .
               .
               .

カーネルパラメタの値を変更する方法

  1. スーパーユーザーになります。

  2. 次の 1 行を /etc/system ファイルに追加します。

        set parameter=value
    
  3. カーネルパラメタの変更を確認します。

        # grep parameter /etc/system
    
  4. システムをリブートします。

    カーネルは自動構成中に /etc/system ファイルを構文解析し、このファイル内で指定されたパラメタでデフォルト値を上書きします。

例 - カーネルパラメタの値を変更する

/etc/system ファイル内の次の行は、max_nprocs パラメタの値を 500 に設定します。

set max_nprocs=500

カーネルモジュール変数の値を設定する方法

  1. スーパーユーザーになります。

  2. 次の 1 行を /etc/system ファイルに追加します。

        set module_name:variable=value
    
  3. カーネルモジュール変数の変更を確認します。

        # grep module_name /etc/system
    
  4. システムをリブートします。

    カーネルは自動構成中に /etc/system ファイルを構文解析し、このファイル内で指定されたパラメタでデフォルト値を上書きします。

例 - カーネルモジュール変数の値を設定する

/etc/system ファイル内の次の行は、msgsys モジュール内の msginfo_msgmap パラメタの値を 150 に設定します。

set msgsys:msginfo_msgmap=150  

バッファーキャッシュパラメタ

bufhwm パラメタでは、バッファーキャッシュメモリーの最大サイズを 1K バイト単位で指定します。デフォルトは物理メモリーの 2% です。sar(1M) を使用して、バッファーキャッシュの統計情報を表示します。

UFS ファイルシステムパラメタ

表 66-1 は、調整可能な UFS パラメタを示します。

表 66-1 UFS ファイルシステムパラメタ

パラメタ 

説明 

ufs_ninode

i ノードテーブルの最大サイズ (デフォルト = max_nprocs + 16 + maxusers + 64)

ncsize

dnlc エントリ数 (デフォルト = max_nprocs + 16 + maxusers + 64)。dnlc はディレクトリ名検索キャッシュ。

STREAMS パラメタ

表 66-2 は、調整可能な STREAMS パラメタを示します。

表 66-2 STREAMS パラメタ

パラメタ 

デフォルト 

説明 

nstrpush

9

STREAMS プッシュの最大許容数 

strmsgsz

0

ユーザーが作成できる STREAMS メッセージの最大サイズ。値 0 は上限がないことを示す。このパラメタは、今後のリリースからは削除される可能性がある。

strctlsz

1024

メッセージの ctl 部分の最大サイズ

strthresh

0

STREAMS サブシステムが消費できる動的メモリーの最大バイト数。このしきい値を超えると、root プロセス以外での STREAMS デバイス上のプッシュ、オープン、書き込みは失敗する。値 0 は無制限を意味する。

sadcnt

16

sad デバイス数

プロセス間通信 (IPC) パラメタ

表 66-3 は、調整可能なプロセス間通信パラメタを示します。

表 66-3 プロセス間通信パラメタ

パラメタ 

デフォルト 

説明 

メッセージ待ち行列 

msginfo_msgmap

100 

message マップ内のエントリ数 

msginfo_msgmax

2048 

メッセージの最大サイズ 

msginfo_msgmnb

4096 

待ち行列上の最大バイト数 

msginfo_msgmni

50 

メッセージ待ち行列識別子の数 

msginfo_msgssz

メッセージのセグメントサイズ (ワードサイズの倍数) 

msginfo_msgtql

40

システムメッセージのヘッダ数 

msginfo_msgseg

1024

メッセージセグメント数 (必ず 32768 未満であること) 

セマフォ機能 

seminfo_semmap

10

セマフォマップ内のエントリ数 

seminfo_semmni

10

セマフォ識別子の数 

seminfo_semmns

60

システム内のセマフォ数 

seminfo_semmnu

30

システム内の undo 構造体の数

seminfo_semmsl

25

id ごとの最大セマフォ数

seminfo_semopm

10

セマフォコールごとの最大操作数 

seminfo_semume

10

プロセスごとの最大 undo エントリ数

注: システムに割り当てられている undo 構造体の合計数は次のとおりです。

seminfo_semmnu * seminfo_semume

seminfo_semvmx

32767

セマフォの最大値 

seminfo_semaem

16384

終了時の最大調整値 

共有メモリー 

shminfo_shmmax

1048576

共有メモリーセグメントの最大サイズ 

shminfo_shmmin

1

共有メモリーセグメントの最小サイズ 

shminfo_shmmni

100

共有メモリー識別子の数 

shminfo_shmseg

6

プロセスごとのセグメント数 

プロセス間通信パラメタを調整する方法

  1. スーパーユーザーになります。

  2. 表 66-4 の構文を使用して 1 行を /etc/system ファイルに追加します。

    表 66-4 プロセス間通信パラメタの調整

    パラメタのタイプ 

    パラメタ 

    調整構文 

    Message Queue

    msgsys

    set msgsys:msginfo_variable = value
    

    Semaphore Facility

    semsys

    set semsys:seminfo_variable=value
    

    Shared Memory

    shmsys

    set shmsys:shminfo_variable=value
    

  3. カーネルパラメタの変更を確認します。

        # grep parameter /etc/system
    
  4. システムをリブートします。

    カーネルは自動構成中に /etc/system ファイルを構文解析し、このファイル内で指定されたパラメタでデフォルト値を上書きします。

メモリー管理パラメタ

表 66-5 は、調整可能なメモリー管理パラメタを示します。

表 66-5 メモリー管理パラメタ

パラメタ 

デフォルト 

説明 

lotsfree

物理メモリーに基づいて調整 

freememlotsfree を下回ると、システムはプロセスからページを取り始める。

tune_t_fsflushr

30

fsflush の実行速度を表す秒数

tune_t_minarmem

25

デッドロックを防ぐために必要な最小使用可能 (スワップ可能ではなく) 常駐メモリーのページ数 

tune_t_minasmem

25

デッドロックを防ぐために必要な最小スワップ可能メモリーのページ数 

tune_t_flckrec

512

有効な frlocks の最大数


注 -

Solaris 2.4 リリース以降では、tune_t_gpgslo パラメタは、実行可能スレッド数に基づくスワッピングのために、より複雑な基準に置き換えられています。


freemem パラメタはページ単位で定義されます。vmstat などのユーティリティは、freemem をページ数からバイト数に変換します。

メモリー管理パラメタを調整する方法

  1. スーパーユーザーになります。

  2. 次の構文を使用して /etc/system ファイルに 1 行を追加します。

        set tune:variable=value
    
  3. カーネルパラメタの変更を確認します。

        # grep parameter /etc/system
    
  4. システムをリブートします。

    カーネルは自動構成中に /etc/system ファイルを構文解析し、このファイル内で指定されたパラメタでデフォルト値を上書きします。

その他のパラメタ

表 66-6 は、調整可能なその他のパラメタを示します。

表 66-6 Miscellaneous パラメタ

パラメタ 

デフォルト 

説明 

lwp_default_stksize

8192

lwps のカーネルスタックのサイズ。カーネルのオーバーフローが発生した場合以外は、この値を調整しないこと。この値はバイト数で表され、PAGESIZE バイトの倍数でなければならない。

npty

48

構成済みの 4.x の疑似 tty の合計数 

pt_cnt

48

構成済みの 5.x の疑似 tty の合計数

その他のパラメタを調整する方法

  1. スーパーユーザーになります。

  2. 次の構文を使用して /etc/system ファイルに 1 行を追加します。

        set parameter=value
    
  3. カーネルパラメタの変更を確認します。

        # grep parameter /etc/system
    
  4. システムをリブートします。

    デバイス関連のカーネルパラメタを変更した場合は、システムをブートするときに -r オプションを使用する必要があります。システムブート時の自動構成中に、カーネルは /etc/system ファイルを構文解析し、このファイル内で指定されたパラメタでデフォルト値を上書きします。

例 - その他のパラメタを調整する

/etc/system ファイル内の次の行は、pt_cnt パラメタの値を 200 に設定します。

set pt_cnt=200 

第 67 章 スケジューラの参照情報

この章では、SunOS 5.x のスケジューラについて説明します。この章の概要は次のとおりです。

スケジューラの概要

「スケジューラ」(またはディスパッチャー) は、プロセスへの CPU 割り当てを制御するカーネルの一部です。スケジューラは、プロセスを実行するタイミングと実行時間を、それに割り当てられた優先順位に従って決定します。優先順位は、スケジューリングクラスとプロセスの動作に基づきます。デフォルトでは、タイムシェアリング、システム、リアルタイム、対話型という 4 つのスケジューリングクラスがサポートされています。

スケジューラはシステム性能に大きな影響を与えます。


注 -

基本的なスケジューリングエンティティはカーネルスレッドです。1 つのスレッドからなるプロセスの場合、カーネルスレッドのスケジューリングは、プロセスのスケジューリングと同じです。


SunOS 5.x のスケジューラは、プロセスの実行順序と、別のプロセスの前に、各プロセスが使用できる CPU 時間の量を制御します。

スケジューラは、スケジューリングクラスごとに定義されたスケジューリングポリシーに従って、プロセスに CPU 時間を割り当てます。各スケジューリングクラスには、一連の優先レベルまたは待ち行列が割り当てられています。実行準備ができたプロセスは、これらの待ち行列間を移動します。クラス内では、これらの待ち行列を連続する優先レベルセットと見なすことができます。これらの優先レベルは、グローバルスケジューリング優先順位セットにマップされます。

プロセスのグローバル優先順位によって、いつ実行するかが決まります。スケジューラは、実行準備ができていて最上位のグローバル優先順位を持つプロセスを実行します。優先順位の数値が大きいプロセスが最初に実行され、同じ優先順位を持つプロセスはラウンドロビン方式のスケジューリングポリシーを使用して実行されます。

スケジューラがプロセスを CPU に割り当てると、プロセスは次のいずれかのイベントが発生するまで実行されます。

デフォルトでは、すべてのリアルタイムプロセスは、システムプロセスよりも上位の優先順位を持ち、すべてのシステムプロセスはタイムシェアリングプロセスよりも上位の優先順位を持ちます。

プロセスは、スケジューラクラスやそのクラス内での優先順位など、スケジューラパラメタを親プロセスから継承します。ユーザーが (priocntl コマンドやシステムコールを使用して) 要求した場合にのみ、プロセスはクラスを変更します。システムは、ユーザー要求とプロセスのスケジューリングクラスに関連付けられたポリシーに基づいて、プロセスの優先順位を管理します。

スケジューラクラスのポリシー

この後の各節では、タイムシェアリング、システム、リアルタイムという 3 つのデフォルトクラスのスケジューリングポリシーについて説明します。

タイムシェアリングクラスのポリシー

デフォルト構成では、初期化プロセス (init) はタイムシェアリングクラスに属します。プロセスはスケジューラパラメタを継承するので、すべてのユーザーログインシェルと、各シェルから実行されるプロセスは、タイムシェアリングプロセスとして起動されます。

タイムシェアリングポリシーの目標は、対話型プロセスの応答時間を短縮し、大量の CPU 時間を使用するプロセスのスループットを適正化することです。スケジューラは、各プロセスに関連付けられた優先順位に従って、CPU 時間をプロセス間で適正に分割しようとします。優先順位が上位のプロセスは、下位のプロセスよりも優先して扱われます。しかし、あるジョブ (プロセス) が CPU を独占しないように、スケジューラはジョブを優先順位の上位から下位へ、または下位から上位へ移動できます。

スケジューラは、応答時間を短縮する一方で切り替えによって時間が無駄にならない程度の頻度で CPU 割り当てを切り替えます。通常、タイムスライスは 1/100 秒単位程度です。

タイムシェアリングポリシーは、優先順位を動的に変更し、さまざまな長さのタイムスライスを割り当てます。プロセスが起動されると、そのタイムシェアリング優先順位は、取得する CPU 時間や待ち行列内で費やす時間などの要素に従って変動します。スケジューラは、「休眠状態」になっているプロセスの優先順位を上げます (たとえば、端末の読み取りやディスクの読み取りなどの入出力処理が始まると、プロセスは休眠状態になります)。単純なシェルコマンドの編集や実行などの対話型作業では、頻繁に休眠状態になります。これに対して、タイムシェアリングポリシーは、休眠状態にならずに長期間 CPU を使用するプロセスの優先順位を下げます。

デフォルトのタイムシェアリングポリシーは、優先順位が低いプロセスに大きいタイムスライスを与えます。優先順位の低いプロセスほど CPU 内にたまる傾向があります。他のプロセスが最初に CPU を取得しますが、優先順位の低いプロセスが最終的に CPU を取得するときには大きなタイムスライスを取得します。タイムスライス中に優先順位の高いプロセスの実行準備ができると、実行中のプロセスを横取りします。

スケジューラは、タイムシェアリングパラメタテーブル ts_dptbl 内のパラメタを使用してタイムシェアリングプロセスを管理します。このテーブルには、タイムシェアリングクラスに固有の情報が入っています。このテーブルは、ディレクトリ /kernel/sched 内のロード可能モジュール TS_DPTBL から、コアメモリーに自動的にロードされます。

システムクラスのポリシー

システムクラスは、固定優先順位ポリシーを使用して、サーバーなどのカーネルプロセスや、ページデーモンなどの準備作業プロセスを実行します。それぞれの優先順位は、タイムシェアリングプロセスのように動的に調整されません。システムクラスはカーネル用に予約されており、ユーザーがシステムクラスからプロセスを追加または削除することはできません。システムクラスのプロセスの優先順位は、カーネルプロセス用のカーネルコード内で設定されます。これらの優先順位は、一度確立された後は変化しません (カーネルモードで実行されるユーザープロセスはシステムクラスではありません)。

リアルタイムクラスのポリシー

SunOS 5.x オペレーティングシステムは、タイムシェアリングポリシーだけでなくリアルタイムのスケジューリングポリシーを使用します。リアルタイムスケジューリングを使用すると、ユーザーはプロセスごとに固定優先順位を設定できるので、重要なプロセスを事前に決めておいた順序で実行できます。リアルタイムスケジューラは優先順位間でジョブを移動しません。リアルタイム優先順位は、ユーザーが (priocntl コマンドを使用して) 要求したときにのみ変化します。この固定優先順位ポリシーはタイムシェアリングポリシーと同じで、対話型の応答時間を短縮するためにシステムが優先順位を変更します。

リアルタイム優先順位が最上位のユーザープロセスは、他のプロセスの実行準備ができていても、実行できるようになると必ず CPU を取得します。リアルタイムプロセスにとってオペレーティングシステムからの応答時間が保証されるようなアプリケーションを作成できます。


注 -

リアルタイムプロセスの実行準備ができていると、プロセスやタイムシェアリングプロセスは実行されません。他のリアルタイムプロセスは、優先順位が上位の場合にのみ実行できます。リアルタイムプロセスを慎重に管理しないと、タイムシェアリングプロセスの性能に重大な悪影響を及ぼすことがあります。


リアルタイムポリシーは、デフォルトでは優先順位が高いプロセスに小さいタイムスライスを割り当てます。優先順位が高いプロセスは、外部イベントによって駆動されるリアルタイムプロセスに割り当てられます。オペレーティングシステムは、入出力に瞬間的に応答できなければなりません。優先順位の低いリアルタイムプロセスとは、より長い処理時間を必要とするプロセスです。優先順位の最も高いプロセスがタイムスライスを使い果たすと、そのプロセスを横取りできるような優先順位のより高いプロセスは存在しないので再び実行されます。

スケジューラは、リアルタイムパラメタテーブル rt_dptbl 内のパラメタを使用してリアルタイムプロセスを管理します。このテーブルには、リアルタイムクラスに固有の情報が入っています。このテーブルは、ディレクトリ /kernel/sched 内のロード可能モジュール RT_DPTBL から、コアメモリーに自動的にロードされます。

スケジューラの構成

この節では、スケジューラの構成を制御するパラメタとテーブルについて説明します。CPU、メモリー、入出力などのシステム資源の作業負荷が妥当であるものと仮定します。資源不足で需要を満たせない場合は、スケジューラを構成し直しても問題は解決しません。

dispadmin コマンドを使用すると、タイムシェアリングクラスとリアルタイムクラスに関して、実行中のシステム内のスケジューラパラメタを表示または変更 (微調整) できます。スケジューラ構成に永続的な変更を加えるには、それに該当するロード可能モジュール、つまり、ディレクトリ /kernel/sched 内の TS_DPTBL または RT_DPTBL 内で、スケジューラパラメタテーブルを変更しなければなりません。これらのモジュールを置き換える方法については、ts_dptbl(4)rt_dptbl(4) のマニュアルページを参照してください。

プロセススケジューリングを制御する基本ユーザーコマンドは、priocntl(1) です。このコマンドを使用すると、ユーザーは指定した優先順位でプロセスを起動したり、実行中のプロセスの優先順位を操作したりできます。priocntl -l コマンドを使用すると、システム上で構成されているクラスを調べることができます。プロセススケジューリングを制御する基本関数コールは、priocntl(2) です。

priocntl コマンドの使用例については、第 63 章「プロセスの管理手順」を参照してください。リアルタイムプログラミング、dispadmin(1M) コマンド、priocntl(1) コマンドについての詳細は、『システムインタフェース』を参照してください。

デフォルトのグローバル優先順位

次の表は、各スケジューラクラスのグローバル優先順位のスケジューリング順序と範囲を示しています。

表 67-1 スケジューリング順序とグローバル優先順位

スケジューリング順序 

グローバル優先順位 

スケジューラクラス 

最初

159 

 

 

 

 

リアルタイム 

 

 

 

100 

 

 

99

 

 

 

 

システム 

 

 

 

60 

 

 

59

 

 

 

 

タイムシェアリング 

 

 

最後 

 

グローバル優先順位の設定方法

オペレーティングシステムが構築されるときに、この後の各節で説明する調整可能パラメタとスケジューラパラメタのテーブルから、グローバル優先順位を作成します。このグローバル優先順位テーブル全体を表示するコマンドはありません。ただし、dispadmin コマンドを使用すると、リアルタイムクラスとタイムシェアリングクラスに固有の優先順位 (0 から n まで) が表示されます。ps -cl コマンドを使用すると、有効なプロセスのグローバル優先順位を表示できます。

プロセスの初期グローバル優先順位

タイムシェアリングプロセスは、スケジューリングクラスと優先順位を親プロセスから継承します。init プロセスは、タイムシェアリングクラス全体で最初のプロセスです。

システムプロセスは、最初はプロセスの重要性 (カーネルにプログラムされている重要性) に応じた優先順位で実行されます。最も重要なシステムプロセスは、システムクラス範囲の最上位か、それに近い優先順位で開始されます。

調整可能パラメタ

この節では、スケジューラの構成を制御する調整可能パラメタについて説明します。これらのカーネルパラメタを変更するには、次の書式の 1 行を /etc/system ファイルに入力します。

set パラメタ=value

詳細は、system(4) のマニュアルページを参照してください。

この節で説明するパラメタは、プロセススケジューリング、タイムシェアリングポリシー、およびリアルタイムポリシーについて詳細に制御します。

リアルタイムプロセスの初期優先順位は、そのプロセスがリアルタイムスケジューリングクラスに入れられるときに決定されます。

priocntl -p コマンドを使用すると、リアルタイムクラス内で相対優先順位を指定できます。

これは、リアルタイムクラスの基本優先順位に追加されます。基本優先順位のデフォルトは 100 です。たとえば、

priocntl -e -c RT -p 20 command

上記のように入力すると、リアルタイム優先順位 120 でコマンドが実行されることになります。

プロセススケジューリングパラメタ

次のカーネルパラメタは、プロセススケジューリングについて詳細に制御します。

タイムシェアリングポリシー

次のパラメタは、タイムシェアリングポリシーを制御するロード可能モジュール TS 内で指定します。

リアルタイムポリシー

次のパラメタは、リアルタイムポリシーを制御するロード可能モジュール RT 内で指定します。

スケジューラパラメタテーブル

表 67-2 に、スケジューラテーブルを示します。

表 67-2 スケジューラテーブル

テーブル 

管理対象 

rt_dptbl

リアルタイムプロセス 

ts_dptbl

タイムシェアリングプロセス 

ts_kmdpris

重要な資源を所有する休眠中のタイムシェアリングプロセス 

これらのテーブルは、リアルタイムプロセスとタイムシェアリングプロセスに使用するスケジューリングパラメタを設定して、スケジューリングポリシーを定義します。パラメタは、さまざまな優先レベルでプロセスが取得する CPU 時間の長さを指定します。

優先レベルのデフォルトのタイムスライスは、ts_dptbl 構成テーブルと rt_dptbl 構成テーブル内で指定されます。この 2 つのテーブルは、ロード可能モジュール TS_DPTBL および RT_DPTBL 内で定義されます。この 2 つのモジュールは、必要に応じてディレクトリ /kernel/sched からカーネルに自動的にロードされます。

タイムスライスは、「resolution」行で定義された解像度の単位数 (quanta) で指定されます。デフォルトの解像度は 1000 であり、タイムカンタムの値はミリ秒数として解釈されます。これは、秒数単位で指定された解像度の逆数から求められます。タイムスライスの quanta 量はクロックの目盛り単位でシステムクロックの解像度の次の積分倍数に切り上げられます (システムクロックの目盛りは 1 秒当たり HZ 回です。この場合、HZparam.h ヘッダファイル内で定義されたハードウェア依存定数です)。たとえば、クロックの目盛りが 10 ミリ秒単位の場合は、タイムスライス量 42 quanta は切り上げられ 50 ミリ秒となります。

タイムシェアリングパラメタテーブル

ts_dptb のデフォルトバージョンは、/kernel/sched/TS_DPTBL 内のシステムから配信されます。デフォルト構成では、タイムシェアリング優先順位は 60 です。

次の dispadmin -c TS -g コマンドでは、ts_dptbl テーブルの例を表示します。

$ dispadmin -c TS -g
# Time Sharing Dispatcher Configuration
RES=1000

# ts_quantum  ts_tqexp  ts_slpret  ts_maxwait ts_lwait  PRIORITY LEVEL
       200         0        50           0        50        #     0
       200         0        50           0        50        #     1
       200         0        50           0        50        #     2
       200         0        50           0        50        #     3
       200         0        50           0        50        #     4
       200         0        50           0        50        #     5
       200         0        50           0        50        #     6
       200         0        50           0        50        #     7
       200         0        50           0        50        #     8
       200         0        50           0        50        #     9
       160         0        51           0        51        #    10
       160         1        51           0        51        #    11
       160         2        51           0        51        #    12
       160         3        51           0        51        #    13
       160         4        51           0        51        #    14
       160         5        51           0        51        #    15
       160         6        51           0        51        #    16
       160         7        51           0        51        #    17
       160         8        51           0        51        #    18
       160         9        51           0        51        #    19
       120        10        52           0        52        #    20
       120        11        52           0        52        #    21
       120        12        52           0        52        #    22
       120        13        52           0        52        #    23
       120        14        52           0        52        #    24
       120        15        52           0        52        #    25
       120        16        52           0        52        #    26
       120        17        52           0        52        #    27
       120        18        52           0        52        #    28
       120        19        52           0        52        #    29
        80        20        53           0        53        #    30
        80        21        53           0        53        #    31
        80        22        53           0        53        #    32
        80        23        53           0        53        #    33
        80        24        53           0        53        #    34
        80        25        54           0        54        #    35
        80        26        54           0        54        #    36
        80        27        54           0        54        #    37
        80        28        54           0        54        #    38
        80        29        54           0        54        #    39
        40        30        55           0        55        #    40
        40        31        55           0        55        #    41
        40        32        55           0        55        #    42
        40        33        55           0        55        #    43
        40        34        55           0        55        #    44
        40        35        56           0        56        #    45
        40        36        57           0        57        #    46
        40        37        58           0        58        #    47
        40        38        58           0        58        #    48
        40        39        58           0        59        #    49
        40        40        58           0        59        #    50
        40        41        58           0        59        #    51
        40        42        58           0        59        #    52
        40        43        58           0        59        #    53
        40        44        58           0        59        #    54
        40        45        58           0        59        #    55
        40        46        58           0        59        #    56
        40        47        58           0        59        #    57
        40        48        58           0        59        #    58
        20        49        59       32000        59        #    59
$ 

表 67-3 に、ts_dptbl テーブル内のフィールドを示します。

表 67-3 ts_dptbl テーブル内のフィールド

フィールド名 

説明 

ts_quantum

(実行時) 

スケジューラが、あるプロセスの優先順位を評価し直す前に、そのプロセスを与えられた優先順位で実行できるタイムスライス (デフォルトではミリ秒単位) が入っている。プロセスがそのタイムスライス全体を使い果たすと、期間満了レベル (ts_tqexp) 待ち行列に入る。タイムスライスは、最上位の待ち行列の 40 ミリ秒 (59) から最下位の優先順位の 200 ミリ秒 (0) までになる。

ts_tqexp

(期間満了レベル) 

タイムスライスが期間満了したプロセスの新しいプロセス優先順位を決定する。プロセスが休眠状態に入らずに全タイムスライスを使い果たすと、スケジューラはその優先順位を ts_tqexp カラムに示されたレベルに変更する。期間満了レベルは前のレベルよりも低くなる。たとえば、優先順位が 30 のプロセスがタイムスライス (80 ミリ秒) を使い果たすと、その新しい優先順位は 20 になる。

ts_slpret

(休眠レベル) 

休眠状態から戻るときにプロセスに割り当てられる優先順位を決定する。プロセスは、特定のシステムコール中や、入出力の待機中 (ページフォルトのサービス中やロックの待機中など) に休眠状態になることがある。プロセスが休眠状態から戻るときは、常に優先順位 59 が与えられる。

ts_maxwait

(待ち時間) 

タイムスライスが期間満了しない状態でプロセスがディスパッチ待ち行列に残っている秒数を指定する。タイムスライスを使用しない場合 (ts_maxwait 秒以内) 、その新しい優先順位は ts_lwait に設定される。これは、優先順位の低いプロセスが CPU 時間が不足するのを防ぐために使用される。

ts_lwait

(待機レベル) 

タイムスライスを完全に取得しないまま最大待ち時間 (ts_maxwait) を超えた、実行準備ができているプロセスの新しい優先順位が入っている。

PRIORITY LEVEL

グローバル優先順位が入っている。より上位の優先レベルで待ち行列に入ったプロセスが最初に実行される。グローバル優先順位は、上位の 59 から下位の 0 までになる。これは、調整できないテーブル内の唯一のカラムである。

リアルタイムパラメタテーブル

rt_dptbl のデフォルトバージョンは、ロード可能モジュール/kernel/sched/RT_DPTBL 内でシステムと共に配信されます。

dispadmin -c RT -g コマンドは、次のような rt_dptbl 情報を表示します。

$ dispadmin -c RT -g
# Real Time Dispatcher Configuration
RES=1000

# TIME QUANTUM                    PRIORITY
# (rt_quantum)                      LEVEL
      1000                    #        0
      1000                    #        1
      1000                    #        2
      1000                    #        3
      1000                    #        4
      1000                    #        5
      1000                    #        6
      1000                    #        7
      1000                    #        8
      1000                    #        9
       800                    #       10
       800                    #       11
       800                    #       12
       800                    #       13
       800                    #       14
       800                    #       15
       800                    #       16
       800                    #       17
       800                    #       18
       800                    #       19
       600                    #       20
       600                    #       21
       600                    #       22
       600                    #       23
       600                    #       24
       600                    #       25
       600                    #       26
       600                    #       27
       600                    #       28
       600                    #       29
       400                    #       30
       400                    #       31
       400                    #       32
       400                    #       33
       400                    #       34
       400                    #       35
       400                    #       36
       400                    #       37
       400                    #       38
       400                    #       39
       200                    #       40
       200                    #       41
       200                    #       42
       200                    #       43
       200                    #       44
       200                    #       45
       200                    #       46
       200                    #       47
       200                    #       48
       200                    #       49
       100                    #       50
       100                    #       51
       100                    #       52
       100                    #       53
       100                    #       54
       100                    #       55
       100                    #       56
       100                    #       57
       100                    #       58
       100                    #       59
$

表 67-4 に、リアルタイムパラメタテーブル内のフィールドを示します。

表 67-4 rt_dptbl テーブル内のフィールド

フィールド名 

説明 

rt_glbpri

グローバル優先順位が入っている。より上位の優先レベルで待ち行列に入ったプロセスが最初に実行される。dispadmin コマンドを使用するとテーブルを表示できるが、グローバル優先順位ではなくクラス内の相対優先順位しか表示されないので注意すること。このカラムを dispadmin で変更することはできない。

rt_qntm

スケジューラが別のプロセスにチャンスを与える前に、この優先順位 (rt_glbpri) を持つプロセスを実行できるデフォルトのタイムスライス (ミリ秒単位) を示す。リアルタイムプロセスのタイムスライスは、priocntl -t コマンドで指定できる。

カーネルモードのパラメタテーブル

スケジューラは、カーネルモードのパラメタテーブル ts_kmdpris を使用して、休眠中のタイムシェアリングプロセスを管理します。ts_kmdpris のデフォルトバージョンは、ロード可能モジュール /kernel/sched/TS_DPTBL 内でシステムと共に配信され、システム構成の一部としてカーネルに自動的に組み込まれます。詳細は、ts_dptbl(4) のマニュアルページを参照してください。


注 -

カーネルは、ts_kmdpris 内に少なくとも 40 の優先順位があるものと想定します。40 の優先順位がないとパニックになります。


カーネルモードのパラメタテーブルは、60 から 99 までのグローバル優先順位の一次元配列です。プロセスが重要な資源を所有する場合は、できる限り短時間で資源を解放できるようにカーネル優先順位が割り当てられます。重要な資源は次のとおりです。

SunOS 5.3 より前のバージョンまでは、プロセスには休眠中にカーネル優先順位が割り当てられていました。これにより、待機中の資源が再び実行される前にページアウトされないことが保証されていました。

これを SunOS 5.3 以降のバージョンで実行するために、休眠状態から戻ったプロセスは、最上位のタイムシェアリング優先順位 (59) に変換されます。