この章では、このマニュアルで使用するチューニング情報の記載形式の概要を示します。また、Solaris システムのチューニングの別の方法についても説明します。
次の表は Solaris 9 リリースでの新しいチューニング可能なパラメータや変更点を列挙しています。
機能 |
参照箇所 |
---|---|
priority_paging および cachefree パラメータの削除 | |
ネットワークキャッシュとアクセラレータ (NCA) のパラメータ | |
inetd、keyserv、syslogd、および rpc.nisd に関する新システム機能パラメータ |
次のパラメータは新しく追加または変更されましたが、変更があったことがこの文書の付録に記載されていないものがあります。詳細は、該当パラメータを扱っている章を参照してください。
pages_pp_maximum
ufs_LW および ufs_HW
md_mirror:md_resync_bufsz (Solaris リリースでは新規となる)
tcp_deferred_ack_interval
tcp_local_dack_interval (新規)
tcp_deferred_acks_max
tcp_local_dacks_max (新規)
tcp_xmit_hiwat
tcp_recv_hiwat
tcp_time_wait_interval
tcp_ecn_permitted (新規)
Solaris は、SPARC および Intel プロセッサで動作する、マルチスレッドでスケーラブルな UNIX オペレーティング環境です。Solaris は、システムの負荷に自動的に対応するため、最小限のチューニングしか必要ありません。それでも、場合によってはチューニングが必要になることもあります。 このマニュアルでは、Solaris 環境で公式にサポートされているカーネルのチューニングオプションの詳細を記述します。
Solaris カーネルは、常にロードされているコア部分と、参照が発生するとロードされるロード可能モジュールから構成されています。このマニュアルのカーネル部分で述べる変数の多くはコア部分に存在しますが、一部はロード可能モジュールに存在します。
システムのチューニングをする際に考慮する必要があることは、さまざまなシステム変数を設定する方法は、処理効率を高めるという目的にとって、多くの場合、一番効率の良くない方法であるということです。最も効果的なチューニング方法は、通常、アプリケーションの動作を変更することです。また、物理メモリーを増やしたり、ディスクの入出力パターンのバランスをとることも効果があります。このマニュアルに記載された変数の値を 1 つ変更しただけで、システムパフォーマンスに意味のある影響が現れることは、ごく限られた場合にしか起きません。
さらに、もう 1 つ注意すべきことがあります。あるシステムの /etc/system 設定値は、全体的であれ、部分的であれ、別のシステムの環境にも適しているとは限りません。したがって、使用する環境に応じて、このファイルに設定する値を慎重に検討する必要があります。このマニュアルで述べるシステム変数を変更する場合は、システムの動作を前もって理解していなければなりません。
このマニュアルで記述される変数やその意味は、リリースによって変わる可能性があります。リリースとは、Solaris Update リリースの場合もあり、Solaris 9 などのような新しいバージョンの場合もあります。これらの変数とその意味は、予告なく変更されることがあります。
各変数の説明は、次の形式に従って行われます。
変数名
説明
データ型
デフォルト
単位
範囲
動的か
検査
暗黙的制約
どのような場合に変更するか
コミットレベル (安定性レベル)
変更履歴
「変数名」は、/etc/system ファイルに指定したり、/etc/default/facility ファイルに指定されている名前です。
ほとんどの変数名は、コロン (:) を伴わない variable の形式をとります。このような名前は、カーネルのコア部分内の変数を表しています。名前にコロンが含まれている場合、コロンの左側の文字列はロード可能モジュールの名前を表し、コロンの右側の文字列はモジュール内の変数名を表します。コロンの右側の文字列はモジュール内の変数名を示します。 たとえば :
module_name:variable |
この変数が何をどのように制御するかを簡単に説明します。
符号付きまたは符号なしの、short、long、または整数です。ただし、long のサイズは、以下のようにシステムによって異なります。
32 ビットのカーネルが動作しているシステムでは、long のサイズは整数と同じです。
64 ビットのカーネルが動作しているシステムでは、long のビット幅は整数の 2 倍です。たとえば、符号なし整数は 32 ビット、符号なし long は 64 ビットです。
システムがデフォルト値として使用している値です。
単位の種類を表します。この項目は省略されることがあります。
システムの検査で取り得る範囲や、データ型の上下限を表す範囲です。
MAXINT — 符号付き整数の最大値 (2,147,483,647) を表します。
MAXUINT — 符号なし整数の最大値 (4,294,967,295) を表します。
動作中のシステムで mdb、または kadb デバッガを使用して変更できる場合は「はい」です。ブート時の初期設定のみの場合は「いいえ」です。
変数の、/etc/system ファイルで指定された、またはデフォルトの値に対して、システムが適用する検査内容を示します。また、検査がいつ適用されるかも示します。
変数に対する暗黙的な制約事項 (特に他の変数との関係において) を表します。この項目は省略されることがあります。
この値の変更が必要になる理由、エラーメッセージ、戻り値を示します。
インタフェースの安定性を表します。このマニュアルで記述するパラメータの多くは「発展中 (Evolving)」または「変更の可能性あり (Unstable)」のいずれかに分類されます。詳細については、attributes(5) を参照してください。
該当する場合は、付録 A または付録 B の「変更履歴」へのリンクが示されます。この項目は省略されることがあります。
次の表では、パラメータに適用可能なチューニングの方法を示します。
チューニングパラメータの適用方法 |
参照箇所 |
---|---|
/etc/system ファイルの変更 | |
カーネルデバッガ( kadb) の使用 | |
モジューラデバッガ (mdb) の使用 | |
ndd コマンドによる TCP/IP パラメータの設定 | |
/etc/default 下のファイルの変更 |
/etc/system ファイルは、カーネル変数の値を静的に調整する機構を提供します。このファイルに指定された値は、ブート時に読み込まれ適用されます。このファイルに対する変更は、システムがリブートされるまでオペレーティングシステムに適用されません。
Solaris 8 より前のリリースでは、システム変数の値を設定する /etc/system のエントリは、次の 2 つの処理段階に分けて適用されていました。
最初の処理段階では、さまざまなブートストラップ変数 (maxusers など) を取得し、基本となるシステムパラメータを初期設定します。
次の処理段階では、ブートストラップ変数を使用して基本構成を計算し、/etc/system ファイルに指定されているすべての値を適用します。ブートストラップ変数に関しては、この処理段階で計算された値やリセットされた値は、/etc/system ファイルに指定されている値で置き換えられます。
2 つめの処理段階では、許容されないような値を変数に設定したり、初期構成で値が上書きされる変数 (max_nprocs など) に値を割り当てたりするため、この処理段階はユーザーや管理者にとって混乱を招く場合がありました。
Solaris 8 リリースで、構成パラメータを計算する前にすべての値を設定する 1 つの処理段階が設けられました。
次の /etc/system エントリでは、NFS バージョン 2 ソフトウェアを使用してマウントされたファイルシステムに対し先読みするブロックの数を指定します。
set nfs:nfs_nra=4 |
値を変更する前に /etc/system のコピーを作成しておけば、不正な値を簡単に元の値に戻せます。
# cp /etc/system /etc/system.good |
/etc/system に設定した値が原因でシステムがブートできない状態になった場合は、次のコマンドでブートします。
ok boot -a |
このコマンドを実行すると、ブートプロセスで使用する各ファイルの名前をシステムから要求されます。/etc/system ファイルの名前が要求されるまで Return キーを押して、デフォルトの値を適用します。Name of system file [/etc/system]: というプロンプトが表示されたら、正しい /etc/system ファイルのコピーの名前か /dev/null を入力します。
ファイル名 [/etc/system]: /etc/system.good |
/dev/null を入力すると、システムは /dev/null から構成情報を読み込もうとします。しかし、/dev/null は空のため、システムはデフォルト値を使用します。システムがブートした後、/etc/system ファイルを修正できます。
システム回復に関する詳細は、『Solaris のシステム管理 (基本編)』を参照してください。
kadb はブート可能なカーネルデバッガであり、その一般的な構文は adb と同じです。例外割り込みについては、kadb(1M) を参照してください。kadb の利点の 1 つは、ユーザーがブレークポイントを設定でき、そのブレークポイントに達したらデータを調べたり、カーネルコードを 1 つずつ実行できることです。
kadb -d を指定してシステムをブートすると、コアカーネルの変数に値を設定できます。ただし、ロード可能モジュールの値は、そのモジュールが実際にロードされたときに値が設定されます。
kadb の使用に関する簡単な説明が、『Writing Device Drivers』の「Debugging」に記載されています。
mdb(1) は Solaris 8 リリースから提供されているモジューラデバッガです。このデバッガは、拡張が容易であるという点で現在の Solaris デバッガの中でも独特のものです。このデバッガのプログラミング API を使用して、モジュールをコンパイルすることによって、デバッガのコンテキスト内で希望する処理を実行することができます。
さらに、mdb には、コマンド行での編集、コマンド履歴、組み込み出力ページャ、構文チェック、コマンドパイプラインなどの、いくつかの便利な機能があります。カーネルに対する事後検査用のデバッガとしては、このデバッガをお勧めします。
整数変数 maxusers の値を 5 から 6 に変更するには、次のようにします。
# mdb -kw Loading modules: [ unix krtld genunix ip logindmux ptm nfs ipc lofs ] > maxusers/D maxusers: maxusers: 495 > maxusers/W 200 maxusers: 0x1ef = 0x200 > $q |
実際に変更する場合は、maxusers を変更したい変数のアドレスに、値を設定したい値に置き換えて、このコマンドを実行します。
モジューラデバッガの使用方法についての詳細は 『Solaris モジューラデバッガ』を参照してください。
kadb や、mdb では、モジュール名接頭辞を指定する必要はありません。モジュールがロードされると、そのモジュールのシンボルは、コアカーネルのシンボルやすでにロードされているその他のモジュールのシンボルとの共通の名前空間を形成するからです。
たとえば、UFS モジュールがロードされると想定した場合、ufs:ufs_WRITES は、個々のデバッガでは ufs_WRITES としてアクセスされます。しかし、/etc/system ファイルに設定する場合は、ufs: 接頭辞が必要です。 kadb にモジュール名接頭辞を含めると、未定義のシンボルメッセージが表示されます。
Solaris のチューニング変数にはいろいろな形式があります。tune_t_gpgslo、tune_t_fsflushr、tune_t_minarmem、tune_t_minasmem、 tune_t_flckrec の実行時の状態は、/usr/include/sys/tuneable.h に定義された tune 構造体で表わされます。カーネルが初期設定された後は、これらの変数の値は、この tune 構造体の対応フィールドに入ります。
以前のバージョンの『Solaris のシステム管理 (第 2 巻)』を始め、さまざまなマニュアルには、tune 構造体の変数に値を設定する適切な方法として tune:field-name (field-name には前述の実際の変数名を指定する) という構文が指定されていました。しかし、この設定は何のメッセージもなく失敗します。ブート時にこの構造体に変数を設定するには、必要なフィールド名に対応する特別な変数を初期設定する必要があります。そうすれば、これらの値がシステム初期設定プロセスで tune 構造体にロードされます。
複数のチューニングパラメータが置かれるもう 1 つの構造体に、v という名前の var 構造体があります。var 構造体の定義は /usr/include/sys/var.h ファイルにあります。autoup や bufhwm などの変数の実行時の状態はここに格納されます。
システムの動作中に tune 構造体や v 構造体を変更しないでください。システムの動作中にこれらの構造体のフィールドを変更すると、システムがパニックになることがあります。
システム構成を調べるツールはいくつかあります。ツールには、root 特権が必要なものもあれば、非特権ユーザーが実行できるものもあります。動作中のシステム上で mdb を使うか、あるいは kadb でブートし、カーネルデバッガですべての構造体やデータアイテムを調べることができます。
sysdef(1M) コマンドは、System V IPC 設定や、STREAMS チューニング可能パラメータ、プロセスリソースの制限値、tune 構造体と v 構造体の各部分の値などを表示します。たとえば、512M バイトの UltraTM 80 システム上で sysdef を実行すると、「チューニング可能パラメータ」セクションは次のように表示されます。
10387456 maximum memory allowed in buffer cache (bufhwm) 7930 maximum number of processes (v.v_proc) 99 maximum global priority in sys class (MAXCLSYSPRI) 7925 maximum processes per user id (v.v_maxup) 30 auto update time limit in seconds (NAUTOUP) 25 page stealing low water mark (GPGSLO) 5 fsflush run rate (FSFLUSHR) 25 minimum resident memory for avoiding deadlock (MINARMEM) 25 minimum swapable memory for avoiding deadlock (MINASMEM) |
kstat データ構造体群は、さまざまなカーネルのサブシステムやドライバによって維持されています。この構造体群は、カーネル内のデータをユーザープログラムに提供する機構を提供します。この機構を利用する場合、プログラムはカーネルのメモリーを読んだり、root 特権を持つ必要はありません。詳細については kstat(3KSTAT)を参照してください。
Solaris 8 リリースから 、コマンド行インタフェースから kstat 構造体群を選択して表示できる kstat(1M) が提供されています。 kstat 情報を処理する Perl モジュール kstat(3EXT) も利用できます。
Solaris 9 リリースは cachefree をサポートしないため、unix モジュール内にあるsystem_pages という名前のkstat構造体群は、 cachefree の統計を記録しません。