第2章 sysctl およびチューニング可能なカーネルの使用

2.1. チューニング可能なカーネルの概要

チューニング可能なカーネルを使用することで、Red Hat Enterprise Linux の起動時に、またはシステムを実行中にオンデマンドで動作をカスタマイズできます。ハードウェアのパラメーターによっては、起動時のみに指定され、システムが実行し始めると変更できないものもありますが、ほとんどの場合は必要に応じて変更でき、次の起動に向けてパーマネント設定ができます。

2.2. チューニング可能なカーネルの使用方法

チューニング可能なカーネルを修正するには、以下の 3 つの方法があります。

  1. sysctl コマンドを使用する方法
  2. /etc/sysctl.d/ ディレクトリーで設定ファイルを手動で修正する方法
  3. シェルを経由して、/proc/sys にマウントされた仮想ファイルと相互作用する方法
注記

すべての起動時パラメーターが sysfs サブシステムの制御下にあるわけではありません。いくつかのハードウェア固有のオプションは、カーネルのコマンドライン上に設定する必要がありますが、これらのオプションについては、本ガイドの Kernel Parameters セクションを参照してください。

2.2.1. sysctl コマンドの使用

sysctl コマンドを使用して、チューニング可能なカーネルを表示、読み取り、および設定します。表示または読み取りの際のチューニング可能なカーネルのフィルター、そしてチューニング可能なカーネルの一時的または永続的な設定が可能となります。

  1. 変数の表示

    # sysctl -a
  2. 変数の読み取り

    # sysctl kernel.version +
    kernel.version = #1 SMP Fri Jan 19 13:19:54 UTC 2018
  3. 変数の一時的な書き込み

    # sysctl <tunable class>.<tunable>=<value>
  4. 変数の永続的な書き込み

    # sysctl -w <tunable class>.<tunable>=<value> >> /etc/sysctl.conf

2.2.2. /etc/sysctl.d 内のファイルの変更

起動時にデフォルトをオーバーライドするには、手動で /etc/sysctl.d にファイルを追加することも可能です。

  1. /etc/sysctl.d に新しいファイルを作成します。

    # vim /etc/sysctl.d/99-custom.conf
  2. 以下の形式で、設定したい変数を 1 行に 1 つずつ入れていきます。

    <tunable class>.<tunable> = <value> +
    <tunable class>.<tunable> = <value>
  3. ファイルを保存します。
  4. マシンを再起動して変更を有効にします。
    または
    sysctl -p /etc/sysctl.d/99-custom.conf を実行して、システムを再起動せずに変更を適用します。

2.3. 制御可能なパラメーター

パラメーターは、カーネルのサブシステムによりいくつかのグループに分けられます。Red Hat Enterprise Linux システムのパラメーターには、以下のクラスがあります。

表2.1 sysctl インターフェースの表

クラスサブシステム

abi

実行ドメインおよびパーソナリティー

crypto

暗号化インターフェース

debug

カーネルのデバッグインターフェース

dev

デバイスの詳細

fs

グローバルおよび固有のチューニング可能なファイルシステム

kernel

グローバルなチューニング可能なカーネル

net

チューニング可能なネットワーク

sunrpc

Sun Remote Procedure Call (NFS)

user

ユーザー名前空間の制限

vm

メモリー、バッファー、およびキャッシュのチューニングと管理

2.3.1. ネットワークインターフェースのパラメーター

システム管理者は、ネットワークのパラメーターを経由して、実行中のシステムのネットワーク設定を変更できます。

ネットワークのパラメーターは、/proc/sys/net ディレクトリーにあります。このディレクトリーには、さまざまなネットワークトピックに関するサブディレクトリーが複数格納されています。システム管理者はこれらのサブディレクトリー内のファイルを変更し、ネットワーク設定を調整する必要があります。

以下は、最も頻繁に使用されるディレクトリーです。

  1. /proc/sys/net/core/
  2. /proc/sys/net/ipv4/

/proc/sys/net/core/ ディレクトリーには、カーネルとネットワーク層との間の相互作用を制御するさまざまな設定が格納されています。これらのチューニング可能なものをいくつか調整することで、システムのパフォーマンスを向上させることが可能です。たとえば、受信キューのサイズを増加したり、ネットワークインターフェース専用の接続およびメモリーの最大値を上げたりすることで、パフォーマンスを向上させることができます。システムのパフォーマンスは、個々の問題のさまざまな側面に左右されることに留意してください。

/proc/sys/net/ipv4/ ディレクトリーには、追加のネットワーク設定が格納されています。これは、システムに対する攻撃を防止したり、システムをルーターとして機能させるように使用している場合に役立ちます。ディレクトリーには、IP および TCP の両方の変数が格納されています。これらの変数に関する詳細は /usr/share/doc/kernel-doc-<version>/Documentation/networking/ip-sysctl.txt を参照してください。

/proc/sys/net/ipv4/ ディレクトリー内のその他のディレクトリーは、ネットワークスタックのさまざまな側面を扱っています。

  1. /proc/sys/net/ipv4/conf/ - 各システムインターフェースを異なる方法で設定できるようにします。これには、未設定のデバイス用のデフォルト設定の使用や、すべての特殊設定をオーバーライドする設定が含まれます。
  2. /proc/sys/net/ipv4/neigh/ - システムに直接接続されたホストとの通信のための設定や、1 ステップ以上離れたシステム用の異なる設定も含まれています。
  3. /proc/sys/net/ipv4/route/ - システム上の任意のインターフェースとのルーティングに適用される指定値が格納されています。

チューニング可能なネットワークのリストは IPv4 インターフェースと関係があり、/proc/sys/net/ipv4/{all,<interface_name>}/ ディレクトリーからアクセスできます。

以下のパラメーターの説明は、カーネルドキュメントのサイトを参考にしています。[1]

log_martians

カーネルログに無効なアドレスを持つパケットをログします。

タイプデフォルト

ブール値

0

1 つ以上の conf/{all,interface}/log_martians が TRUE に設定されている場合に有効です。

参考資料

accept_redirects

ICMP のリダイレクトメッセージを受信します。

タイプデフォルト

ブール値

1

インターフェース用の accept_redirects が、以下の条件下で有効となります。

  • conf/{all,interface}/accept_redirects が両方とも TRUE の場合 (インターフェースへの転送が有効な場合)
  • conf/{all,interface}/accept_redirects のうち少なくとも 1 つが TRUE の場合 (インターフェースへの転送は無効)

「ICMP リダイレクトを無効にする方法」を参照してください。

forwarding

インターフェース上で IP 転送を有効にします。

タイプデフォルト

ブール値

0

参考資料

mc_forwarding

マルチキャストルーティングを実施します。

タイプデフォルト

ブール値

0

  • 読み取り専用値
  • マルチキャストルーティングのデーモンが必要です。
  • インターフェース用にマルチキャストルーティングを有効にするためには conf/all/mc_forwarding も TRUE に設定する必要があります。

参考資料

medium_id

接続しているメディアがデバイスを区別するために使用する任意の値です。

タイプデフォルト

整数

0

注記

  • 同じメディア上の 2 つのデバイスにおいて、このうちの 1 つでしかブロードキャストパケットが 受信されない場合、2 つのデバイスの id 値が異る可能性があります。
  • デフォルト値の 0 は、メディアに対してそのデバイスが唯一のインターフェースであることを意味します。
  • 値が -1 の場合、メディアが不明であることを示します。
  • 現在は、proxy_arp の動作を変更するために使用されています。
  • proxy_arp の機能は、異るメディアに接続された 2 つのデバイスの間で転送されたパケット用に有効となります。

参考資料 - たとえば、「Using the "medium_id" feature in Linux 2.2 and 2.4」 を参照してください。

proxy_arp

Proxy ARP の実行

タイプデフォルト

ブール値

0

conf/{all,interface}/proxy_arp のうち少なくとも 1 つが TRUE に設定されている場合、インターフェース用の proxy_arp は有効です。そうでない場合は無効です。

proxy_arp_pvlan

プライベート VLAN Proxy ARP

タイプデフォルト

ブール値

0

RFC 3069 などの機能をサポートするために、Proxy ARP が同じインターフェースに応答できるようにします。

shared_media

共有メディアのリダイレクト RFC1620 を送信 (ルーター) または受信 (ホスト) します。

タイプデフォルト

ブール値

1

注記

  • secure_redirects をオーバーライドします。
  • conf/{all,interface}/shared_media のうち少なくとも 1 つが TRUE に設定されている場合、インターフェース用の shared_media が有効となります。
secure_redirects

インターフェースの現在のゲートウェイリストにリストされているゲートウェイに対する ICMP リダイレクトメッセージのみを受信します。

タイプデフォルト

ブール値

1

注記

  • 無効となった場合でも、RFC1122 リダイレクトルールが引き続き適用されます。
  • shared_media によってオーバーライドされます。
  • conf/{all,interface}/secure_redirects のうち少なくとも 1 つが TRUE に設定されている場合、インターフェース用の secure_redirects は有効となります。
send_redirects

ルーターの場合、リダイレクトを送信します。

タイプデフォルト

ブール値

1

注記
conf/{all,interface}/send_redirects のうち少なくとも 1 つが TRUE に設定されている場合は、インターフェース用の send_redirects が有効となります。

bootp_relay

ローカル用としてこのホストに予定されていないソースアドレス 0.b.c.d のパケットを受信します。

タイプデフォルト

ブール値

0

注記

  • これらのパケットを管理するために BOOTP デーモンを有効にする必要があります。
  • インターフェース用に BOOTP リレーを有効にするために conf/all/bootp_relay も TRUE に設定する必要があります。
  • 実装されていない場合は、『Red Hat Enterprise Linux ネットワークガイド』の 「DHCP リレーエージェント」 を参照してください。
accept_source_route

SRR オプションのあるパケットを受信します。

タイプデフォルト

ブール値

1

注記

  • インターフェース上の SRR オプションのあるパケットを受信するために、conf/all/accept_source_route も TRUE に設定する必要があります。
accept_local

ローカルソースアドレスのあるパケットを受信します。

タイプデフォルト

ブール値

0

注記

  • これは、適切なルーティングとのコンビネーションにて、2 つのローカルインターフェース間のパケットをワイヤー上で移動し、適切に受信させるために使用することができます。
  • accept_local に効果をもたらすためには、rp_filter をゼロ以外の値に設定する必要があります。
route_localnet

ルーティング中は、ループバックアドレスを martian ソースまたは宛先として考慮しません。

タイプデフォルト

ブール値

0

注記

  • これにより、ローカルルーティング目的での 127/8 の使用が有効となります。
rp_filter

ソースの検証を有効化

タイプデフォルト

整数

0

効果

0

ソースの検証はありません。

1

RFC3704 厳密な逆方向パスで定義された厳密モード

2

RFC3704 緩やかな逆方向パスで定義された緩やかなモード

注記

  • RFC3704 における現在の推奨プラクティスは、DDos 攻撃による IP スプーフィングを回避するために厳密モードを有効にすることです。
  • 非対称のルーティングまたは別の複雑なルーティングを使用する場合は、緩やかなモードが推奨されます。
  • {interface} でソースの検証を行う際、conf/{all,interface}/rp_filter の中の最大値が使用されます。
arp_filter
タイプデフォルト

ブール値

0

効果

0

(デフォルト) カーネルは、別のインターフェースからのアドレスの ARP 要求に対応できます。正常な通信の可能性を向上させるので、通常は理にかなっています。

1

同じサブネットで複数のネットワークインターフェースを持つことを可能にします。また、カーネルがインターフェースから ARP 要求 の IP パケットをルーティングするかどうかに基づいて、各インターフェースの ARP が応答できるようにします (したがって、これを機能させるためにはソースベースのルーティングを使用する必要があります)。つまり、ARP 要求に応答するカード (通常は 1) の制御が可能となります。

注記

  • IP アドレスは、特定のインターフェースではなく、Linux の完全なホストが所有します。この動作が問題を起こすのは、負荷分散などのより複雑なセットアップの場合だけです。
  • conf/{all,interface}/arp_filter のうち少なくとも 1 つが TRUE に設定されている場合、インターフェース用の arp_filter は有効となります。
arp_announce

インターフェース上に送信された ARP 要求の IP パケットからローカルソースの IP アドレスを発表するための異る制限レベルを定義します。

タイプデフォルト

整数

0

効果

0

(デフォルト) 任意のインターフェース上に設定された任意のローカルアドレスを使用します。

1

このインターフェースでは、出力先のサブネットにないローカルアドレスは使用しないようにします。このインターフェースを経由してアクセス可能な出力先ホストが 、ARP 要求のソース IP アドレスが受信側インターフェース上に設定されるロジカルなネットワークの一環となるよう要求した場合、このモードは役立ちます。要求を生成する際、出力先 IP を含むすべてのサブネットを確認し、そのようなサブネットからのソースアドレスである場合は保持します。そのようなサブネットがない場合は、レベル 2 のルールにしたがってソースアドレスを選択します。

2

この出力先には常に最適のローカルアドレスを使用します。このモードでは、IP パケットのソースアドレスを無視し、出力先ホストとの対話には好みのローカルアドレスを選択するようにします。このようなローカルアドレスは、出力先 IP アドレスを含む発信インターフェース上のすべてのサブネット上にある主要な IP アドレスを探すことで選択されます。適切なローカルアドレスが見つからない場合は、発信インターフェース上またはその他すべてのインターフェース上にある最初のローカルアドレスを選択します。この時、アナウンスするソース IP アドレスに関係なく、要求に対する応答があることを期待します。

注記

  • conf/{all,interface}/arp_announce の中の最大値が使用されます。
  • 制限レベルを上げると、解決済み出力先から応答がある可能性が高くなり、制限レベルを下げると、より有効な送信者情報をアナウンスします。
arp_ignore

受信した ARP 要求に対して応答するさまざまなモードを定義します。この ARP 要求は、ローカル出力先 IP アドレスを解決するものです。

タイプデフォルト

整数

0

効果

0

(デフォルト): 任意のインターフェース上に設定された任意のローカル出力先 IP アドレスに応答します。

1

出力先 IP アドレスが受信インターフェース上で設定されたローカルアドレスの場合にのみ応答します。

2

出力先 IP アドレスが受信インターフェース上で設定されたローカルアドレスで、送信者の IP アドレスと出力先 IP アドレスの両方がこのインターフェース上の同じサブネットの一部である場合にのみ応答します。

3

スコープホストで設定されたローカルアドレスには応答しません。グローバルおよびリンク用のアドレス解決のみに応答します。

4-7

予備

8

ローカルアドレスの場合はすべて、応答しません。{interface} 上で ARP 要求が受信された際に conf/{all,interface}/arp_ignore の最大値が使用されます。

注記

arp_notify

アドレスおよびデバイスの変更を通知するモードを定義します。

タイプデフォルト

ブール値

0

効果

0

何もしません。

1

デバイスの停止またはハードウェアのアドレス変更の際、余計な ARP 要求を生成します。

注記

arp_accept

IP がまだ ARP テーブルに存在しない余計な ARP フレームの動作を定義します。

タイプデフォルト

ブール値

0

効果

0

ARP テーブルに新しいエントリーを作成しません。

1

ARP テーブルに新しいエントリーを作成します。

注記
この設定がオンの場合は、応答および要求の両タイプの余計な ARP が、ARP テーブルを更新するようにトリガーします。ARP テーブルが余計な ARP フレームの IP アドレスをすでに格納している場合は、この設定がオンまたはオフであることに関係なく、ARP テーブルが更新されます。

app_solicit

マルチキャストプローブへドロップバックする前にネットリンクを経由してユーザー空間の ARP デーモンに送信するプローブの最大数 (mcast_solicit を参照してください)。

タイプデフォルト

整数

0

注記
mcast_solicit を参照してください。

disable_policy

このインターフェースの IPSEC ポリシー (SPD) を無効にします。

タイプデフォルト

ブール値

0

needinfo

disable_xfrm

いかなるポリシーであろうと、このインターフェースの IPSEC 暗号化を無効にします。

タイプデフォルト

ブール値

0

needinfo

igmpv2_unsolicited_report_interval

次の未承諾の IGMPv1 または IGMPv2 レポートの再送信が実行されるミリ秒単位の間隔。

タイプデフォルト

整数

10000

注記
ミリ秒

igmpv3_unsolicited_report_interval

次の未承諾の IGMPv3 レポートの再送信が実行されるミリ秒単位の間隔。

タイプデフォルト

整数

1000

注記
ミリ秒

tag

必要に応じて使用可能な数字の書き込みが可能です。

タイプデフォルト

整数

0

xfrm4_gc_thresh

IPv4 宛先キャッシュエントリー用のガベージコレクションを開始するしきい値。

タイプデフォルト

整数

1

注記
この値が 2 倍になると、システムは新しい割り当てを拒否します。

2.3.2. グローバルなチューニング可能なカーネル

システム管理者は、グローバルカーネルパラメーターを経由して実行中のシステムの一般的な設定を構成および変更できます。

グローバルカーネルパラメーターは、/proc/sys/kernel/ ディレクトリーにあり、さまざまな設定内容向けに、名前付きの制御ファイル、またはサブディレクトリーでグループ分けされています。グローバルカーネルパラメーターを調整するには、システム管理者が制御ファイルを修正する必要があります。

以下のパラメーターの説明は、カーネルのドキュメントのサイトを参考にしています。[2]

dmesg_restrict

非特権ユーザーが、dmesg コマンドを実行して、カーネルのログバッファーのメッセージを表示しないようにするかどうかを示します。

詳細は「Kernel sysctl documentation」を参照してください。

core_pattern

コアダンプファイルのパターン名を指定します。

最大長デフォルト

128 文字

"core"

詳細は「Kernel sysctl documentation」を参照してください。

hardlockup_panic

ハードロックアップが検出された場合にカーネルパニックを制御します。

タイプ効果

整数

0

カーネルが、ハードロックアップでパニックを発生させません。

整数

1

ハードロックアップでのカーネルパニック

パニックを発生させるためには、ハードロックアップを最初に検出する必要があります。この検出は、nmi_watchdog パラメーターにより制御されます。

参考資料

softlockup_panic

ソフトロックアップが検出されるとカーネルパニックを制御します。

タイプ効果

整数

0

カーネルが、ソフトロックアップでパニックを発生させません。

整数

1

ソフトロックアップのカーネルパニック

softlockup_panic の詳細は「kernel_parameters」を参照してください。

kptr_restrict

制限は、/proc またはその他のインターフェースを介して、カーネルアドレスを露出させる制限が配置されているかどうかを示します。

タイプデフォルト

整数

0

効果

0

出力前にカーネルアドレスのハッシュ値を計算します。

1

出力されたカーネルポインターを、特定の条件下で、0 に置き換えます。

2

出力されたカーネルポインターを、無条件に 0 に置き換えます。

詳細は「Kernel sysctl documentation」を参照してください。

nmi_watchdog

x86 システムで、ハードロックアップ検出を制御します。

タイプデフォルト

整数

0

効果

0

ハードロックアップ検出を無効にします。

1

ハードロックアップ検出を有効にします。

ハードロックアップ検出は、各 CPU で、割り込みに応答する能力を監視します。

詳細は「Kernel sysctl documentation」を参照してください。

watchdog_thresh

hrtimer、NMI イベント、ソフトまたはハードのロックアップのしきい値を制御します。

デフォルトのしきい値ソフトロックアップしきい値

10 秒

2 * watchdog_thresh

このパラメーターを 0 (ゼロ) に設定すると、ロックアップ検出を無効にします。

詳細は「Kernel sysctl documentation」を参照してください。

panic, panic_on_oops, panic_on_stackoverflow, panic_on_unrecovered_nmi, panic_on_warn, panic_on_rcu_stall, hung_task_panic

このパラメーターは、カーネルがパニックを発生する状況を指定します。

一連の panic パラメーターの詳細は、「Kernel sysctl documentation」を参照してください。

printk, printk_delay, printk_ratelimit, printk_ratelimit_burst, printk_devkmsg

このようなパラメーターは、カーネルエラーメッセージのログへの記録または出力を制御します。

一連の printk パラメーターの詳細は、「Kernel sysctl documentation」を参照してください。

shmall, shmmax, shm_rmid_forced

このパラメーターは、共有メモリーの制限を制御します。

一連の shm パラメーターの詳細は、「Kernel sysctl documentation」を参照してください。

threads-max

fork() システムコールが作成するスレッドの最大数を制御します。

最小値最大値

20

FUTEX_TID_MASK (0x3fffffff) で指定

threads-max 値は、利用可能な RAM ページに対して確認されます。スレッド構造が、利用可能な RAM ページを使用しすぎている場合は、それに応じて threads-max が削減します。

詳細は「Kernel sysctl documentation」を参照してください。

pid_max

PID 割り当てラップ値。

詳細は「Kernel sysctl documentation」を参照してください。

numa_balancing

このパラメーターは、 NUMA メモリーの自動分散を有効または無効にします。NUMA マシンでは、CPU がリモートメモリーにアクセスするかどうかについてパフォーマンスのペナルティーがあります。

詳細は「Kernel sysctl documentation」を参照してください。

numa_balancing_scan_period_min_ms, numa_balancing_scan_delay_ms, numa_balancing_scan_period_max_ms, numa_balancing_scan_size_mb

このパラメーターは、そのタスクが実行しているローカルのメモリーノードへデータが移行する必要がある場合に、ページが適切に配置されているかどうかを検出します。

一連の numa_balancing_scan パラメーターの詳細は、「Kernel sysctl documentation」を参照してください。