7.5. システムメモリー容量の設定

このセクションではメモリーの使用量を改善する場合に役立つメモリー関連のカーネルパラメーターについて説明しています。/proc ファイルシステム内の該当ファイルの値を変更し、テストとして一時的に設定することができます。そのパラメーターで使用環境に適したパフォーマンスが得られることを確認したら sysctl コマンドを使って今度は永続的にパラメーターを設定します。
メモリーの使用量は一般的にはカーネルパラメーター値で設定されます。一時的に設定する場合は /proc ファイルシステム内のファイルの内容を変更し、永続的に変更する場合は procps-ng パッケージで提供される sysctl ツールを使用して行います。
たとえば overcommit_memory パラメーターを一時的に 1 に設定する場合は次のコマンドを実行します。
# echo 1 > /proc/sys/vm/overcommit_memory
この値を永続的に設定するには、/etc/sysctl.confsysctl vm.overcommit_memory=1 を追加し、次のコマンドを実行します。
# sysctl -p
システムに対するパラメーターの影響を確認する場合には一時的な設定が便利です。パラメーター値で期待する影響を得られたことを確認したら永続的な設定を行います。

注記

専門知識を深めるには、Red Hat Enterprise Linux パフォーマンスチューニング (RH442) トレーニングコースの受講をお勧めします。

7.5.1. 仮想メモリーのパラメーター

本セクションのパラメーターは特に記載のない限り /proc/sys/vm にあります。
dirty_ratio
パーセント値です。指定したパーセント値の合計メモリーが変更されるとシステムはその変更を pdflush 演算でディスクに記述し始めます。デフォルト値は 20 % です。
dirty_background_ratio
パーセント値です。指定したパーセント値の合計メモリーが変更されるとシステムはその変更をバックグラウンドでディスクに記述し始めます。デフォルト値は 10 % です。
overcommit_memory
大量メモリーの要求を許可するか拒否するか決定する条件を定義します。
デフォルト値は 0 です。デフォルトではカーネルは利用可能なメモリー量と要求されるメモリー量が大き過ぎるため失敗する要求数を推測し経験則的なメモリーオーバーコミット処理を行います。ただし、正確なアルゴリズムではなく経験則を使ってメモリーの割り当てを行うため、この設定の場合はメモリーがオーバーロードする可能性があります。
このパラメーターを 1 に設定するとカーネルはメモリーのオーバーコミット処理を行いません。このためメモリーのオーバーロードの可能性が高くなりますが、メモリー集約型のタスクパフォーマンスは向上します。
2 に設定するとカーネルは利用可能な swap 領域と overcommit_ratio で指定されている物理 RAM の割合との合計と同等もしくはそれ以上のメモリー要求は拒否します。メモリーのオーバーコミットに対するリスクは低減しますが swap 領域が物理メモリーより大きいシステムにしか推奨していません。
overcommit_ratio
overcommit_memory2 に設定されている場合に考慮される物理 RAM の割合を指定します。デフォルト値は 50 です。
max_map_count
プロセスで使用可能なメモリーマップ領域の最大数を定義します。ほとんどの場合デフォルト値の 65530 が適した値になります。アプリケーション側でこのファイル数以上の数をマッピングする必要がある場合はこの値を増やします。
min_free_kbytes
システム全体で維持する空領域の最小値をキロバイト単位で指定します。これを使って各低メモリゾーンに適切な値が確定され、そのサイズに比例した空き予約ページ数が割り当てられます。

警告

設定値が低すぎるとシステムを破損する恐れがあります。min_free_kbytes の設定が低すぎると、システムによるメモリの回収が妨げられます。これによりシステムがハングし、メモリ不足によってプロセスが強制終了される可能性があります。ただし、min_free_kbytes の設定が高すぎると (システムメモリー合計の 5–10% など) システムがすぐにメモリー不足に陥ってしまうためメモリーの回収に非常に時間がかかることになります。
oom_adj
panic_on_oom パラメーターが 0 に設定されている状態でメモリーを使い切ってしまうと、oom_killer 関数はシステムが復元できるようになるまでプロセスを強制終了し、プロセスを最も高い oom_score で起動します。
oom_adj パラメーターはプロセスの oom_score を確定する際に役立ちます。このパラメーターはプロセスの識別子ごとに設定されています。-17 の値を設定するとそのプロセスの oom_killer は無効になります。これ以外にも -16 から 15 までの値を使用することができます。

注記

調整されたプロセスによって生成されたプロセスは、プロセスの oom_score を継承します。
スワップ
swappiness 値 (0100) は、システムが匿名メモリーやページキャッシュを優先する度合いを制御します。値が大きい場合は、ファイルシステムのパフォーマンスが改善され、あまり活発ではないプロセスが RAM から積極的にスワップされます。値が小さい場合は、メモリーからのプロセスのスワップが回避されます。通常この場合は、レイテンシーが低下しますが I/O パフォーマンスが犠牲になります。デフォルト値は 60 です。

警告

swappiness==0 に設定すると非常に強力にスワップを避けるため、メモリーおよび I/O に圧力がかかりメモリー不足によるプロセスの強制終了のリスクが高まります。

7.5.2. ファイルシステムのパラメーター

本セクションのパラメーターは特に記載のない限り /proc/sys/fs にあります。
aio-max-nr
アクティブな非同期の全入出力コンテキスト内で許可されるイベントの最大数を定義します。デフォルト値は 65536 です。この値を変更しても、カーネルデータ構造を事前に割り当てたり、サイズの変更がされないことに留意してください。
file-max
システム全体のファイルハンドルの最大数を決定します。Red Hat Enterprise Linux 7 のデフォルト値は最大値である 8192、またはカーネルの起動時に利用可能な空きメモリーページの 1/10 です。
この値を上げるとファイル処理数の不足が原因のエラーを解決できるようになります。

7.5.3. カーネルパラメーター

/proc/sys/kernel/ ディレクトリーにある以下のパラメーターのデフォルト値は、利用可能なシステムリソースに応じて起動時にカーネルによって計算されます。
msgmax
メッセージキュー内の 1 メッセージの最大許容サイズをバイト単位で定義します。この値はキューのサイズ (msgmnb) を超えることはできません。システムの現在の msgmax 値を確認するには、以下のコマンドを使用します。
# sysctl kernel.msgmax
msgmnb
1 メッセージキューの最大サイズをバイト単位で定義します。システムの現在の msgmnb 値を確認するには、以下のコマンドを使用します。
# sysctl kernel.msgmnb
msgmni
メッセージキュー識別子の最大数 (つまりキューの最大数) を定義します。システムの現在の msgmni 値を確認するには、以下のコマンドを使用します。
# sysctl kernel.msgmni
shmall
システム上で一度に使用可能な共有メモリーの総ページ数を定義します。ちなみに、AMD64 および Intel 64 アーキテクチャーでは 1 ページは 4096 バイトに相当します。
システムの現在の shmall 値を確認するには、以下のコマンドを使用します。
# sysctl kernel.shmall
shmmax
カーネルで許容される 1 共有メモリーセグメントの最大サイズをバイト単位で定義します。システムの現在の shmmax 値を確認するには、以下のコマンドを使用します。
# sysctl kernel.shmmax
shmmni
システム全体の共有メモリーセグメントの最大数を定義します。いずれのシステムでもデフォルト値は 4096 です。
threads-max
システム全体でカーネルが一度に使用できるスレッドの最大数を定義します。システムの現在の threads-max 値を確認するには、以下のコマンドを使用します。
# sysctl kernel.threads-max
デフォルト値は、以下の式で算出されます。
mempages / (8 * THREAD_SIZE / PAGE SIZE )
最小値は 20 です。

このページには機械翻訳が使用されている場合があります (詳細はこちら)。