7.5. システムメモリー容量の設定
このセクションではメモリーの使用量を改善する場合に役立つメモリー関連のカーネルパラメーターについて説明しています。
/proc
ファイルシステム内の対応するファイルの値を変更することで、テスト目的で一時的に設定することができます。ユースケースに最適なパフォーマンスを生成する値を決定したら、sysctl コマンドを使用して永続的に設定することができます。
メモリーの使用量は一般的にはカーネルパラメーター値で設定されます。一時的に設定する場合は /proc ファイルシステム内のファイルの内容を変更し、永続的に変更する場合は、procps-ng パッケージで提供される sysctl ツールを使用して行います。
たとえば overcommit_memory パラメーターを一時的に 1 に設定する場合は次のコマンドを実行します。
# echo 1 > /proc/sys/vm/overcommit_memory
この値を永続的に設定するには、
/etc/ sysctl.conf
に sysctl 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 の割合と同じか、それ以上のメモリー要求を拒否します。これにより、メモリーのオーバーコミットのリスクが軽減されますが、物理メモリーよりも大きいスワップ領域があるシステムのみに推奨されます。 - overcommit_ratio
overcommit_memory
が2
に設定されている場合に考慮される物理 RAM の割合を指定します。デフォルト値は50
です。- max_map_count
- プロセスが使用可能なメモリーマップ領域の最大数を定義します。デフォルト値(
65530
)は、ほとんどの場合に適しています。アプリケーション側でこのファイル数以上の数をマッピングする必要がある場合はこの値を増やします。 - min_free_kbytes
- システム全体で維持する空領域の最小値をキロバイト単位で指定します。これを使用して各低メモリーゾーンに適切な値が確定され、そのサイズに比例した空き予約ページ数が割り当てられます。警告設定値が低すぎるとシステムを破損する恐れがあります。
min_free_kbytes
を非常に低い値に設定すると、システムがメモリーを回収できなくなります。これにより、システムがハングし、プロセスが OOM で強制終了される可能性があります。ただし、min_free_kbytes
の設定が高すぎる(システムメモリーの合計を 5-10% など)に設定すると、システムがメモリー不足の状態に即座に入り、システムにメモリーの回収に時間がかかりすぎます。 - oom_adj
- システムがメモリー不足になり、
panic_on_oom
パラメーターが0
に設定されている場合、oom_killer
関数は、oom_score
が最も高いプロセスから開始して、システムが復旧するまでプロセスを強制終了します。oom_adj
パラメーターは、プロセスのoom_score
を決定するのに役立ちます。このパラメーターはプロセス ID ごとに設定されます。-17
の値は、そのプロセスのoom_killer
を無効にします。他の有効な値は-16
から15
までです。注記調整されたプロセスで起動するプロセスは、プロセスのoom_score
を継承します。 - スワップ
- swappiness 値(
0
から100
まで)は、システムが匿名メモリーまたはページキャッシュを優先するレベルを制御します。値が大きい場合は、ファイルシステムのパフォーマンスが改善され、あまり活発ではないプロセスが RAM から積極的にスワップされます。値が小さい場合は、メモリーからのプロセスのスワップが回避されます。通常この場合は、レイテンシーが低下しますが I/O パフォーマンスが犠牲になります。デフォルト値は60
です。警告swappiness==0
を設定すると、スワップが積極的に回避されます。これにより、メモリーおよび I/O の圧力が高まる場合に OOM による強制終了のリスクが高まります。
7.5.2. ファイルシステムのパラメーター
このセクションにリストされているパラメーターは、特に指定がない限り
/proc/sys/fs
にあります。
- aio-max-nr
- すべてのアクティブな非同期入出力コンテキストで許可されるイベントの最大数を定義します。デフォルト値は
65536
です。この値を変更しても、カーネルデータ構造を事前に割り当てたり、サイズの変更がされないことに留意してください。 - file-max
- システム全体でのファイルハンドルの最大数を決定します。Red Hat Enterprise Linux 7 のデフォルト値は、最大
8192
またはカーネルの起動時に利用可能な空きメモリーページの 10 分の 1 です。この値を設定すると、利用可能なファイルハンドルがないためにエラーを解決できます。
7.5.3. カーネルパラメーター
/proc/sys/kernel/
ディレクトリーにある以下のパラメーターのデフォルト値は、利用可能なシステムリソースに応じて起動時にカーネルによって計算できます。
- msgmax
- メッセージキュー内の 1 メッセージの最大許容サイズをバイト単位で定義します。この値は、キューのサイズ(
msgmnb
)を超えることはできません。システムの現在のmsgmax
値を確認するには、以下を使用します。# sysctl kernel.msgmax
- msgmnb
- 単一のメッセージキューの最大サイズをバイト単位で定義します。システムの現在の
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
です。