コンピュータやネットワークの性能を十分発揮させることは、システム管理作業の重要な仕事です。この章では、コンピュータシステムの性能の維持と管理に影響する要素について簡単に説明します。
この章の内容は次のとおりです。
この節では、Solaris 2.6 リリースのシステム性能の新しい機能について説明します。
スケジューラ起動は、特定のスケジューリングが必要なアプリケーション (データベースやマルチスレッド化されたアプリケーションなど) に、カーネルのスケジューリング機能を使用できるようにします。スケジューラ起動のマルチスレッド化サポートの変更は、カーネルと libthread ライブラリ間の専用インタフェースとして実装されています。libthread インタフェースは変更されていません。更に、アプリケーションは、カーネルにスケジューリングヒントを提供することによって、性能を向上させることができます。詳細については、libsched(3X) のマニュアルページを参照してください。
もう 1 つの新しい機能は、1 つまたは複数のアプリケーション専用に、プロセッサのグループを割り当てることができることです。/usr/sbin/psrset コマンドを使用すれば、システム管理者は、プロセッサセットの作成および管理を制御できます。詳細については、psrset(1M) のマニュアルページを参照してください。
直接入出力は、バルク入出力操作を向上させます。バルク入出力操作とは、大量のバッファサイズを使用して、大きなファイル (物理メモリーより大きなファイル) を転送することです。
バルク入出力操作の例は、衛星から転送されるデータのダウンロードです。これは、大量のデータをファイルに書き込みます。直接入出力データは、オペレーティングシステムのページキャッシング機構のオーバーヘッドを使用しないで、メモリーから読み取られたり、書き込まれたりします。
直接入出力の起動は、場合によっては制限があります。入出力が要求されたファイルがすでに他のアプリケーションによってマップされていた場合、そのページは、直接入出力操作が始まる前に、メモリーからフラッシュされなければなりません。
詳細については、directio(3C) のマニュアルページを参照してください。
mount コマンドに forcedirectio オプションを指定することによっても、ファイルシステムについて直接入出力を使用できます。ファイルシステムが大量の順次データを転送する場合のみ、直接入出力の効果が性能に現れます。
このオプションでファイルシステムをマウントすると、データはユーザーのアドレス空間とディスク間を直接転送されます。ファイルシステムに対して直接入出力を強制的に使用できない場合、ユーザーのアドレス空間とディスクとの間で転送されるデータは、まずカーネルアドレス空間に入れられます。
UFS ファイルシステムにおけるデフォルトの動作は、非強制直接入出力です。詳細は、mount_ufs のマニュアルページを参照してください。
スーパーユーザーになります。
forcedirectio マウントオプションを指定してファイルシステムをマウントします。
# mount -F ufs -o forcedirectio /dev/dsk/c0t3d0s7 /datab
マウントされたファイルシステムで強制直接入出力が使用できるかを確認します。
# mount . . . /export/home on /dev/dsk/c0t3d0s7 forcedirectio/setuid/read/write/largefiles on Mon May 12 13:47:55 1997
以前のフラットな /proc ファイルシステムは、状態情報と制御機能のためのサブディレクトリが追加されたディレクトリ階層に再構築されました。
また、/proc ファイルシステムは、ウォッチポイント機能も提供します。この機能は、プロセスのアドレス領域の個々のページの読み取り権または書き込み権を再マップするために使用されます。この機能は制限がなく、MT-安全です。
新しい /proc ファイル構造は、古い /proc インターフェースと完全なバイナリ互換を提供します。ただし、新しいウォッチポイント機能は、古いインターフェースでは使用できません。
デバッグ用ツールは、/proc の新しいウォッチポイント機能を使用するように変更されています。つまり、ウォッチポイントプロセス全体がより高速になったためです。
dbx デバッグ用ツールを使用してウォッチポイントを設定するときの次の制限は取り除かれました。
SPARC レジスタウィンドウのため、スタック上のローカル変数にウォッチポイントを設定する。
マルチスレッド化されたプロセスにウォッチポイントを設定する。
詳細については、proc(4)、core(4)、および adb(4) のマニュアルページを参照してください。
システム性能を監視する手順については、次を参照してください。
コンピュータシステムの性能は、システムがその資源をどのように使用して割り当てるかによって左右されます。したがって、通常の条件下でどのように動作するかを知るために、システム性能を定期的に監視することが重要になります。期待できる性能についてよく把握し、問題が発生したときにそれを分析できなければなりません。
性能に影響を及ぼすシステム資源は次のとおりです。
コンピュータシステムの動作と性能に関する統計情報を表示するツールについては、第 64 章「性能の監視手順」を参照してください。
性能の問題は多岐にわたる要素が含まれるため、ここではすべてを詳しく説明することができません。システムやネットワークの性能の改善と調整のさまざまな側面については、書籍が出版されています。次の 3 冊が役立ちます。
『Sun Performance and Tuning: SPARC and Solaris』, Adrian Cockcroft 著, SunSoft Press/PRT Prentice Hall 発行, ISBN 0-13-149642-3
『System Performance Tuning』, Mike Loukides 著, O'Reilly & Associates, Inc. 発行
『Managing NFS and NIS』, Hal Stern 著, O'Reilly & Associates, Inc. 発行
表 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-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 つのプロセス優先レベルがあります。
リアルタイムプロセスは、最上位の優先レベルを持っています。このクラスには、外部イベントが発生したら応答しなければならないプロセスが含まれます。たとえば、センサーからデータを収集するプロセスは、データを処理して即座に応答する必要があります。ほとんどの場合、リアルタイムプロセスには専用システムが必要です。CPU の制御がリアルタイムプロセスに移っている間は、他のプロセスを処理できません。デフォルトでは、優先順位の範囲は 100 から 159 までです。
システムプロセスは、中程度の優先レベルを持っています。このクラスは、スワッパーやページングデーモンなど、カーネルによって自動的に実行されるプロセスからなっています。デフォルトでは、優先順位の範囲は 60 から 99 までです。
タイムシェアリングプロセスは、最下位の優先順位を持っています。このクラスには標準の UNIX プロセスが含まれます。通常、すべてのユーザープロセスはタイムシェアリングプロセスです。この種のプロセスには、処理時間を適正に配分し、対話型アプリケーションの応答時間を短縮し、適正な計算処理スループットを保つスケジュールポリシーが適用されます。デフォルトでは、優先順位の範囲は 0 から 59 までです。
対話型プロセスは、SunOS 5.4 環境に導入されています。優先順位の範囲は 0 から 59 までです。OpenWindows 上で開始されるすべてのプロセスは対話型クラスに分類され、キーボードフォーカスを持つプロセスには、より上位の優先順位が与えられます。
スケジュールポリシーによって、各プロセスの実行順序が決まります。
リアルタイムプロセスの優先順位は固定されています。リアルタイムプロセスを実行する準備ができている場合は、システムプロセスやタイムシェアリングプロセスを実行できません。
システムプロセスの優先順位は、開始時にカーネルによって確立され固定されています。システムクラス内のプロセスはカーネルによって制御されるので変更できません。
タイムシェアリングプロセスと対話型プロセスは、その優先順位を動的に割り当てるスケジューラによって制御されます。このクラスのプロセスの優先順位は操作できます。
ディスクは、コンピュータシステムに使用されるデータと命令を格納するために使用されます。ディスクアクセス動作と端末の動作を調べると、ディスク上のデータへのシステムのアクセス効率を検査できます。ディスク動作に関する統計情報を表示する iostat コマンドと sar コマンドについては、第 64 章「性能の監視手順」を参照してください。ディスク容量の管理と割り当て、ディスクをスライスに分割する方法については、第 21 章「ディスク管理の概要」を参照してください。
CPU が入出力の完了を待っている場合は、ディスクが低速化していることになります。ディスクの低速化を防ぐには、次のような方法があります。
ファイルシステムがいっぱいにならないように、ディスク容量の 10% を常に空けておいてください。ディスクがいっぱいになった場合は、ディスクのフラグメンテーションを防ぐために、ファイルシステムのバックアップをとって復元します。ディスクのフラグメンテーションを解消するソフトウェアの購入をご検討ください。
ディスク動作を最小に抑えるようにファイルシステムを編成してください。2 台のディスクを使用する場合は、ファイルシステムを分散して負荷バランスを調整します。サンの Online: DiskSuiteTM 製品を使用すると、ディスクの使用効率を高めることができます。
メモリーを増やしてください。メモリーを増やすと、スワッピングとページングによるトラフィックが減少し、拡張バッファープールを使用できます (ディスクへのアクセスが必要なユーザーレベルでの読み書き回数が減少します)。
ディスクを追加して、ディスク間で最も稼働率の高いファイルシステムのバランスを調整してください。
システム上で実行中のプログラムに、使用可能な容量よりも大きな物理メモリーが必要になると、性能が低下します。この問題が発生すると、オペレーティングシステムはページングとスワッピングを開始し、ディスクと 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 章「カーネルパラメタの調整手順」を参照してください。
コンピュータの稼働中は、各種のシステム動作を追跡するためにオペレーティングシステムのカウンタが増分されます。追跡されるシステム動作は次のとおりです。
中央処理デバイス (CPU) の使用状況
バッファーの使用状況
ディスクとテープの入出力 (I/O) 動作
端末デバイスの動作
システムコールの動作
コンテキスト切替え
ファイルアクセス
待ち行列の動作
カーネルテーブル
プロセス間通信
ページング
空きメモリーとスワップ空間
カーネルメモリー割リ当て (KMA)
Solaris 2.x システムソフトウェアには、システム性能を追跡できるように複数のツールが提供されています。次のような監視ツールがあります。
表 62-8 性能監視ツール
ツール |
目的 |
参照先 |
---|---|---|
sar ユーティリティと sadc ユーティリティ |
システム動作データを収集および報告する。 | |
ps コマンド |
アクティブなコマンドについての情報を表示する。 | |
パフォーマンスメーター |
ネットワーク上のシステムの状態をグラフィカルに表示する。 | |
vmstat コマンドと iostat コマンド |
システム動作データの要約。仮想メモリーの統計、ディスクの使用率、CPU の動作など。 | |
swap コマンド |
ユーザーのシステムで利用可能なスワップ領域についての情報を表示する。 | |
netstat コマンドと nfsstat コマンド |
ネットワーク性能についての情報を表示する。 | |
Solstice System Monitor (symon) |
UltraTM EnterpriseTM 3000、4000、5000、および 6000 のシステム上で、システム動作データを収集する。 |
Solstice System Monitor User's Guide |