5.4. 容量のチューニング

このセクションでは、メモリやカーネル、ファイルシステムの容量、それぞれに関連するパラメーター、これらのパラメーターを調整することで発生する代償についての概要を説明します。
チューニング中にこれらの値を一時的に設定するには、echo で proc ファイルシステムの適切なファイルで必要な値を設定します。例えば、overcommit_memory を一時的に 1 に設定するには、以下のように実行します。
# echo 1 > /proc/sys/vm/overcommit_memory
proc ファイルシステムのパラメーターへのパスは、変更で影響を受けるシステムによって異なることに注意してください。
これらの値を永続的なものにするには、 sysctl コマンドを使用する必要があります。詳細については、『導入ガイド』 を参照してください。http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/ から入手できます。

容量関連のメモリのチューニング可能なパラメーター

以下の各パラメーターは、proc ファイルシステムの/proc/sys/vm/ にあります。
overcommit_memory
大量メモリの要求を受け入れるか拒否するかを決定する条件を定義します。このパラメーターには 3 つの値があります。
  • 0 — デフォルト設定。カーネルがメモリの空き容量を概算し、明らかに無効な要求を失敗させることで、ヒューリスティックなメモリオーバーコミット処理を実行します。残念ながら、メモリは厳密なアルゴリズムではなくヒューリスティックなアルゴリズムを使用して割り当てられるため、この設定でシステム上のメモリの空き容量がオーバーロードとなる場合があります。
  • 1 — カーネルはメモリオーバーコミット処理を行いません。この設定では、メモリのオーバーロードの可能性が高くなりますが、メモリ集約型のタスクのパフォーマンスも向上します。
  • 2 — カーネルは、利用可能なスワップと overcommit_ratio で指定されている物理 RAM の割合の合計とメモリが同等もしくはそれよりも大きい場合の要求を拒否します。メモリのオーバーコミットのリスクを減らしたい場合は、この設定が最適です。

    注記

    この設定は、スワップ領域が物理メモリよりも大きいシステムにのみ推奨されます。
overcommit_ratio
overcommit_memory2 に設定されている場合に考慮される物理 RAM の割合を指定します。デフォルト値は 50 です。
max_map_count
プロセスが使用可能なメモリマップ領域の最大数を定義します。ほとんどのケースでは、適切なデフォルト値は 65530 です。アプリケーションがこのファイル数よりも多くマッピングする必要がある場合は、この値を増やします。
nr_hugepages
カーネルで設定される hugepages の数を定義します。デフォルト値は 0 です。システム内に物理的に連続する空白ページが十分にある場合のみ、hugepages を割り当てる (もしくは解放する) ことが可能です。このパラメーターで保持するページは、他の目的には使えません。詳細はインストール済み資料 /usr/share/doc/kernel-doc-kernel_version/Documentation/vm/hugetlbpage.txt を参照してください。
Oracle のデータベースワークロードには、システム上で実行されているデータベースすべてのシステムグローバルエリアの合計よりもわずかに大きいサイズと同等の hugepage 数を Red Hat では推奨しています。データベースのインスタンスあたり 5 つの追加 hugepage で十分です。

容量関連のカーネルの設定可能なパラメーター

以下の各パラメーターは、proc ファイルシステムの/proc/sys/kernel/ にあります。
msgmax
メッセージキューでの単一メッセージの最大許容サイズをバイト単位で定義します。この値は、キューのサイズ (msgmnb) を超えることはできません。デフォルト値は 65536 です。
msgmnb
単一メッセージキューの最大サイズをバイト単位で定義します。デフォルト値は 65536 バイトです。
msgmni
メッセージキュー識別子の最大数を定義します (つまり、キューの最大数)。デフォルト値は低メモリーページの数で増大します。計算式は、全ページ数から高メモリーページ数を引き、その結果を 32 で割り、バイト数単位のページサイズでそれを掛け、最後に MSGMNB の値で割ります。
sem
プロセスとスレッドの同期を促進するセマフォは通常、データベースのワークロードを助けるように設定されます。推奨値はデータベースによって異なります。セマフォの値の詳細については、ご使用のデータベースの資料を参照してください。
このパラメーターは空白で区切られた 4 つの値を取り、それらは SEMMSL、SEMMNS、SEMOPM、および SEMMNI を表します。
shmall
一度にシステム上で使用可能な共有メモリーページの合計数を定義します。Red Hat ではデータベースのワークロードの場合、この値を shmmax を hugepage サイズで割った結果に設定することを推奨しています。ただし、Red Hat では推奨値をベンダー資料で確認することを推奨しています。
shmmax
カーネルが許可する共有メモリーセグメントの最大数をバイト数単位で定義します。Red Hat ではデータベースのワークロードの場合、この値をシステムの総メモリーサイズの 75% 以下にすることを推奨しています。ただし、Red Hat では推奨値をベンダー資料で確認することを推奨しています。
shmmni
システム全体の共有メモリセグメントの最大数を定義します。デフォルト値は、64 ビットと 32 ビット の両方のアーキテクチャーで 4096 です。
threads-max
システム全体でカーネルが一度に使用するスレッド (タスク) の最大数を定義します。デフォルト値は、カーネルの max_threads 値と同等です。使用されている式は以下のとおりです。
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE )
threads-max の最低値は 20 です。

容量関連のファイルシステムのチューニング可能なパラメーター

以下の各パラメーターは、proc ファイルシステムの/proc/sys/fs/ にあります。
aio-max-nr
すべてのアクティブな非同期 I/O コンテキスト内で許可されるイベントの最大数を定義します。デフォルト値は 65536 です。この値を変更しても、カーネルデータ構造を事前に割り当てたり、サイズの変更がされないことに留意してください。
file-max
カーネルが割り当てるファイルハンドルの最大数を一覧表示します。デフォルト値は、カーネル内の files_stat.max_files の値と一致し、これは (mempages * (PAGE_SIZE / 1024)) / 10 もしくは NR_FILE (Red Hat Enterprise Linux では 8192) のどちらか大きい方に設定されます。このファイルで設定値を高くすると、使用可能なファイルハンドルの欠如で発生したエラーを解決できます。

Out of Memory (メモリ不足) 強制終了のチューニング可能な パラメーター

Out of Memory (OOM) は、スワップ領域を含むすべての利用可能なメモリが割り当てられている状態を指します。デフォルトでは、この状況はシステムのパニックを引き起こし、正常機能が停止します。しかし、/proc/sys/vm/panic_on_oom パラメーターを 0 に設定すると、OOM 発生時にカーネルが oom_killer 機能を呼び出します。通常は、oom_killer は非承認のプロセスを強制終了し、システムは維持されます。
以下のパラメーターはプロセスごとの設定が可能で、oom_killer 機能で強制終了するプロセスの制御能力が高まります。これは、proc ファイルシステムの /proc/pid/ にあり、ここでの pid はプロセス ID 番号になります。
oom_adj
値を -16 から 15 の間で定義して、プロセスの oom_score の決定に役立ちます。oom_score の値が高いと、oom_killer でプロセスが強制終了される可能性が高まります。oom_adj の値を -17 に設定すると、そのプロセスの oom_killer は無効になります。

重要

調整されたプロセスによって生成されたプロセスは、いずれもそのプロセスの oom_score を継承します。例えば、sshd プロセスが oom_killer 機能から保護されているとすると、その SSH セッションが開始したプロセスもすべて保護されることになります。これは、OOM 発生時にシステムを救助する oom_killer 機能の能力に影響します。