Solaris カーネルのチューンアップ・リファレンスマニュアル

第 1 章 Solaris システムのチューニングの概要

この章では、このマニュアルで使用するチューニング情報の記載形式の概要を示します。また、Solaris システムのチューニングの別の方法についても説明します。

Solaris システムのチューニング

Solaris は、SPARC および Intel プロセッサで動作する、マルチスレッドでスケーラブルな UNIX オペレーティング環境です。Solaris は、システムの負荷に自動的に対応するため、最小限のチューニングしか必要ありません。それでも、場合によってはチューニングが必要になることもあります。このマニュアルでは、Solaris 環境で公式にサポートされているカーネルのチューニングオプションの詳細を記述します。

Solaris カーネルは、常にロードされているコア部分と、参照が発生するとロードされるロード可能モジュールから構成されています。このマニュアルのカーネル部分で述べる変数の多くはコア部分に存在しますが、一部はロード可能モジュールに存在します。

システムのチューニングをする際に考慮する必要があることは、さまざまなシステム変数を設定する方法は、処理効率を高めるという目的にとって、多くの場合、一番効率の良くない方法であるということです。最も効果的なチューニング方法は、通常、アプリケーションの動作を変更することです。また、物理メモリーを増やしたり、ディスクの入出力パターンのバランスをとることも効果があります。このマニュアルに記載された変数の値を 1 つ変更しただけで、システムパフォーマンスに意味のある影響が現れることは、ごく限られた場合にしか起きません。

さらに、もう 1 つ注意すべきことがあります。あるシステムの /etc/system 設定値は、全体的であれ、部分的であれ、別のシステムの環境にも適しているとは限りません。したがって、使用する環境に応じて、このファイルに設定する値を慎重に検討する必要があります。このマニュアルで述べるシステム変数を変更する場合は、システムの動作を前もって理解していなければなりません。


注意 – 注意 –

このマニュアルで記述される変数やその意味は、リリースによって変わる可能性があります。リリースとは、Solaris Update リリースの場合もあり、Solaris 8 などのような新しいバージョンの場合もあります。これらの変数とその意味は、予告なく変更されることがあります。


変数の説明の書式

各変数の説明は、次の形式に従って行われます。

変数名

「変数名」は、/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) を表します。

動的か

動作中のシステムで adbmdb、または kadb デバッガを使用して変更できる場合は「はい」です。ブート時の初期設定のみの場合は「いいえ」です。

検査

変数の、/etc/system ファイルで指定された、またはデフォルトの値に対して、システムが適用する検査内容を示します。また、検査がいつ適用されるかも示します。

暗黙的制約

変数に対する暗黙的な制約事項 (特に他の変数との関係において) を表します。この項目は省略されることがあります。

どのような場合に変更するか

この値の変更が必要になる理由、エラーメッセージ、戻り値を示します。

コミットレベル (安定性レベル)

インタフェースの安定性を表します。このマニュアルで記述するパラメータの多くは「発展中 (Evolving)」または「変更の可能性あり (Unstable)」のいずれかに分類されます。詳細は、attributes(5) のマニュアルページを参照してください。

変更履歴

該当する場合、リリース間でのパラメータの変更をまとめた付録「チューニング可能パラメータの変更履歴」へのリンクが示されます。

前のリリースからの変更

該当する場合、リリース間での変更をまとめた付録「このマニュアルの改訂履歴」へのリンクが示されます。

Solaris カーネルのチューニング

次の表では、パラメータに適用可能なチューニングの方法を示します。

チューニングパラメータの適用方法 

参照先 

/etc/system ファイルの変更

/etc/system ファイル

デバッガ (adb) の使用

adb

カーネルデバッガ (kadb) の使用

kadb

モジューラデバッガ (mdb) の使用

kadb

ndd コマンドによる TCP/IP パラメータの設定

第 4 章「TCP/IP チューニング可能パラメータ」

/etc/default 下のファイルの変更

システムのデフォルトのパラメータ

/etc/system ファイル

/etc/system ファイルは、カーネル変数の値を静的に調整する機構を提供します。このファイルに指定された値は、ブート時に読み込まれ適用されます。このファイルに対する変更は、システムがリブートされるまでオペレーティングシステムに適用されません。

Solaris 8 より前のリリースでは、システム変数の値を設定する /etc/system のエントリは、次の 2 つの処理段階に分けて適用されていました。

2 つめの処理段階では、許容されないような値を変数に設定したり、初期構成で値が上書きされる変数 (max_nprocs など) に値を割り当てたりするため、この処理段階はユーザーや管理者にとって混乱を招く場合がありました。

Solaris 8 リリースでは、構成パラメータを計算する前にすべての値を設定する 1 つの処理段階が設けられました。

例 — /etc/system を使用したパラメータの設定

次の /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 を入力します。


Name of system file [/etc/system]: /etc/system.good

/dev/null を入力すると、システムは /dev/null から構成情報を読み込もうとします。しかし、/dev/null は空のため、システムはデフォルト値を使用します。システムがブートした後、/etc/system ファイルを修正できます。

システムの回復については、『Solaris のシステム管理 (第 1 巻)』でさらに記述されています。

adb

adb は実行時デバッガです。スーパーユーザーは、-k オプションを指定して adb を実行し、動作中のカーネルの変数を見ることができます。さらに、-k オプションと共に -w オプションを指定すると、スーパーユーザーは動作中のカーネルメモリー内の値を変更することができます。この方法によるすべての変更は、システムがリブートされると失われます。

例 — adb を使用した値の変更

整数変数 maxusers の現在の値を 0x200 に変更するには、次のようにします。


# adb -kw
physmem f7c6
maxusers/D
maxusers:
maxusers:       495
maxusers/W 200
maxusers:       0x1ef           =       0x200
$q

実際に変更する場合は、maxusers を変更したい変数のアドレスに、値を設定したい値に置き換えて、このコマンドを実行します。

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

kadb

kadb はブート可能なカーネルデバッガであり、その一般的な構文は adb と同じです。例外については、kadb(1M) のマニュアルページを参照してください。kadb の利点の 1 つは、ユーザーがブレークポイントを設定でき、そのブレークポイントに達したらデータを調べたり、カーネルコードを 1 つずつ実行できることです。

kadb -d を指定してシステムをブートすると、コアカーネルの変数に値を設定できます。ただし、ロード可能モジュールの値は、そのモジュールが実際にロードされたときに値が設定されます。

Writing Device Drivers』の「Debugging」の節に kadb コマンドの使い方の簡単な説明が記載されています。

mdb

mdb(1) は Solaris 8 リリースで新たに提供されたモジューラデバッガです。このデバッガは、拡張が容易であるという点で現在の Solaris デバッガの中でも独特のものです。adb マクロの作成を試みたことがあるユーザーなら、この作業が簡単でないことがお分かりでしょう。このデバッガのプログラミング API を使用して、モジュールをコンパイルすることによって、デバッガのコンテキスト内で希望する処理を実行することができます。mdbadb(1)crash(1M) との下位互換性があります。

さらに、mdb(1) には、コマンド行での編集、コマンド履歴、組み込み出力ページャ、構文チェック、コマンドパイプラインなどの、いくつかの便利な機能があります。カーネルに対する事後検分用のデバッガとしては、このデバッガをお勧めします。

例 — 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 モジューラデバッガ』を参照してください。

adbkadbmdb では、モジュール名接頭辞を指定する必要はありません。モジュールが読み込まれると、そのモジュールのシンボルは、コアカーネルのシンボルやすでにロードされているその他のモジュールのシンボルとの共通の名前空間を形成するからです。

たとえば、UFS モジュールがロードされると想定した場合、ufs:ufs_WRITES は、個々のデバッガでは ufs_WRITES としてアクセスされますが、ufs: 接頭辞が、/etc/system ファイルに設定する場合は、必要です。adbkadb でモジュール名接頭辞を指定すると、未定義のシンボルのメッセージが出力されます。

特別な構造

Solaris のチューニング変数にはいろいろな形式があります。tune_t_gpgslotune_t_fsflushrtune_t_minarmemtune_t_minasmem の実行時の状態は、/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 にあります。autoupbufhwm などの変数の実行時の状態はここに格納されます。

システムが動作中に tune 構造体や v 構造体を変更しないでください。システムの動作中にこれらの構造体のフィールドを変更すると、システムがパニックになることがあります。

システム構成情報の閲覧

システム構成を調べるツールはいくつかあります。ツールには、root 特権が必要なものもあれば、非特権ユーザーが実行できるものもあります。すべての構造体やデータ項目はカーネルデバッガで調べることができます (動作中のシステムで adbmdb を使用したり、kadb のもとでシステムをブートする)。

sysdef

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 構造体群

kstat データ構造体群は、さまざまなカーネルのサブシステムやドライバによって維持されています。この構造体群は、カーネル内のデータをユーザープログラムに提供する機構を提供します。この機構を利用する場合、プログラムはカーネルのメモリーを読んだり、root 特権を持つ必要はありません。詳細は、kstat(3KSTAT) を参照してください。

Solaris 8 リリースでは、コマンド行インタフェースから kstat 構造体群を選択して表示できる kstat(1M) コマンドが新しく追加されています。kstat 情報を処理する Perl モジュール kstat(3EXT) も利用できます。