sysctl

提供: ArchWiki
2021年7月15日 (木) 19:24時点におけるKgx (トーク | 投稿記録)による版 (→‎定期的にシステムがフリーズする: ノートを追加)
ナビゲーションに移動 検索に移動

sysctl は稼働中のカーネルパラメータを確認・変更するためのツールです (公式リポジトリprocps-ng パッケージ)。sysctl は procfs (/proc/ の仮想プロセスファイルシステム) で実装されています。

設定

ノート: バージョン 207 と 21x から、systemd/etc/sysctl.d/*.conf/usr/lib/sysctl.d/*.conf の設定だけを適用するようになっています。/etc/sysctl.conf をカスタマイズしていた場合は、ファイルの名前を /etc/sysctl.d/99-sysctl.conf のように変更する必要があります。/etc/sysctl.d/foo などのファイルを作成していた場合、/etc/sysctl.d/foo.conf と名前を変更してください。

sysctl のプリロード/設定ファイルは /etc/sysctl.d/99-sysctl.conf に作成することができます。systemd では、/etc/sysctl.d//usr/lib/sysctl.d/ はカーネルの sysctl パラメータにどちらも使えるディレクトリです。名前と元のディレクトリによって処理される順番が決まります。最後のパラメータによって前の方のパラメータが置き換えられるので順番は重要です。例えば、/usr/lib/sysctl.d/50-default.conf に書かれたパラメータは /etc/sysctl.d/50-default.conf や両方のディレクトリよりも後に処理される設定ファイルにある同じパラメータによって置き換えられます。

全ての設定ファイルを手動でロードするには、次を実行します:

# sysctl --system 

適用される階層が出力されます。単一のパラメータファイルを指定してロードすることも可能です:

# sysctl -p filename.conf

詳しくは the new configuration filessystemd の sysctl.d man ページ を見て下さい。

利用可能なパラメータは /proc/sys/ 以下に並んでいます。例えば、kernel.sysrq パラメータはファイルシステム上の /proc/sys/kernel/sysrq ファイルにあたります。sysctl -a コマンドを使うことで現在利用可能な値を全て表示することができます。

ノート: カーネルドキュメントをインストールしている場合 (linux-docs)、sysctl 設定に関する詳細な情報が /usr/lib/modules/$(uname -r)/build/Documentation/sysctl/ で読めます。sysctl 設定を変更する前にこれらを一読することが強く推奨されています。

設定の変更はファイルの操作によるか sysctl ユーティリティを使って行います。例えば、一時的にマジック SysRq キーを有効にするには:

# sysctl kernel.sysrq=1

もしくは:

# echo "1" > /proc/sys/kernel/sysrq

再起動後も変更を維持させるには、/etc/sysctl.d/99-sysctl.conf や他の /etc/sysctl.d/ 内の適用されるパラメータファイルに適切な行を追加・編集してください。

ヒント: 適用することができるパラメータがロードされないカーネルモジュールに依存していることもあります。例えば /proc/sys/net/bridge/* のパラメータは br_netfilter モジュールに依存しています。モジュールが実行時に (または再起動後) ロードされない場合、パラメータはひっそりと適用されないことになります。カーネルモジュール#ロードを見て下さい。

セキュリティ

セキュリティ#カーネルの防御を見て下さい。

ネットワーク

パフォーマンスを向上させる

警告: 以下の設定はロードバランシングや NAT を行っている場合にフレームがドロップする可能性があります。ローカルネットワークでしか通信しないサーバーで使ってください。
# reuse/recycle time-wait sockets
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

受信キューのサイズを増やす

受信したフレームは、ネットワークカード上のリングバッファから取り出した後、このキューに格納されます。

高速カードの場合、この値を大きくすると、パケットの損失を防ぐのに役立ちます。

net.core.netdev_max_backlog=16384
ノート: SIP ルータなどのリアルタイムアプリケーションでは、このオプションは高速な CPU を必要とします。そうしないと、キュー内のデータが古くなります。

最大接続数を増やす

カーネルが受け付ける接続数の上限 (デフォルトは128)

net.core.somaxconn = 8192
ノート: カーネル5.4はデフォルト値を4096に上げました [1]
警告: この値を大きくすると、負荷の高いサーバーのパフォーマンスのみが向上し、処理速度の低下 (例:シングルスレッドのブロッキングサーバ) またはワーカー・スレッド/プロセス数の不足 [2] が発生する可能性があります

ネットワークインターフェイス専用のメモリを増やす

この記事またはセクションは加筆を必要としています。
理由: 各オプションの単位を説明する(バイト、キロバイト、メモリページ?) (議論: トーク:Sysctl#)
この記事またはセクションの正確性には問題があります。
理由: このセクションは Cloudflare のブログ記事が動機となっていますが、 RedHat の調整済みプロファイル はさらに小さな値と主張を示唆しています これは 40 Gb の速度でのみ必要と思われます したがって、これらの設定は一般的なハードウェアでは役に立ちません。 (議論: トーク:Sysctl#)

デフォルトでは、Linux ネットワークスタックは WAN リンクを介した高速で大規模なファイル転送用に設定されていません(つまり、より多くのネットワーク・パケットを処理)。正しい値を設定すると、メモリリソースを節約できる場合があります。

net.core.rmem_default = 1048576
net.core.rmem_max = 16777216
net.core.wmem_default = 1048576
net.core.wmem_max = 16777216
net.core.optmem_max = 65536
net.ipv4.tcp_rmem = 4096 1048576 2097152
net.ipv4.tcp_wmem = 4096 65536 16777216

デフォルトの 4096 UDP 制限を増やすこともできます。

net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192

詳細および推奨値については、次の資料を参照してください。

TCP Fast Open を有効にする

この記事またはセクションは加筆を必要としています。
理由: "明示的な TCP_FASTOPEN ソケットオプションなしで、すべてのリスナーがデフォルトで Fast Open をサポートできるようにします" つまり値を 1027 (0x1+0x2+0x400) にオプションを指定します。 (議論: トーク:Sysctl#TCP Fast Open)

TCP Fast Open は、Transmission Control Protocol (TCP) の拡張機能であり、送信側の初期 TCP SYN [3] 中にデータを交換できるようにすることで、ネットワーク遅延の低減に役立ちます。デフォルトの 1 の代わりに値 3 を使用すると、着信接続と発信接続の両方で TCP Fast Open が許可されます。

net.ipv4.tcp_fastopen = 3

保留中の接続処理を微調整する

tcp_max_syn_backlog は、保留中の接続の待機確認応答の最大キュー長です。

synflood DOS 攻撃が発生した場合、このキューはすぐにいっぱいになり、その時点で TCP SYN cookies が開始され、システムが正規のトラフィックに応答し続け、悪意のあるIPをブロックするためのアクセス権を取得できるようになります。

サーバーがピーク時に過負荷になる場合は、この値を少し大きくします。

net.ipv4.tcp_max_syn_backlog = 8192

tcp_max_tw_buckets は、TIME_WAIT 状態におけるソケットの最大数です。

この数に達すると、システムはこの状態のソケットの破棄を開始します。

単純な DOS 攻撃を防ぐには、この値を大きくします。

net.ipv4.tcp_max_tw_buckets = 2000000

tcp_tw_reuse 新しいタイムスタンプが以前の接続で記録された最新のタイムスタンプよりも厳密に大きい場合に、TCP が TIME-WAIT 状態の既存の接続を新しい発信接続で再利用するかどうかを設定します。

これにより、使用可能なネットワーク・ソケットの不足を回避できます。

net.ipv4.tcp_tw_reuse = 1

ソケットが強制的にクローズされる前に final FIN パケットを待つ秒数を指定します。これは厳密には TCP 仕様に違反しますが、サービス拒否攻撃を防ぐために必要です。Linux2.2 では、デフォルト値は 180 [4] でした。

net.ipv4.tcp_fin_timeout = 10

tcp_slow_start_after_idle は、新しい接続に対してだけ TCP をデフォルトのウィンドウサイズで開始するか、またはアイドル状態が長すぎる既存の接続に対してもTCPを開始するかを設定します。

この設定は、永続的な単一接続のパフォーマンスを無効にし、オフにすることもできます。

net.ipv4.tcp_slow_start_after_idle = 0

TCP キープアライブパラメータを変更する

TCP keepalive は、相手側が応答を停止したかどうかを判断するのに役立つ TCP 接続のメカニズムです。TCP は、アイドル時間が経過すると、ヌルデータを含むキープアライブプローブをネットワークピアに数回送信します。ピアが応答しない場合、ソケットは自動的に閉じられます。デフォルトでは、TCP キープアライブプロセスはソケットのアクティビティを2時間 (7200秒) 待機してから最初のキープアライブプローブを送信し、75秒ごとに再送信します。TCP/IP ソケット通信が行われていてアクティブである限り、キープアライブパケットは必要ありません。

ノート: 次の設定では、アプリケーションは120秒後 (60秒+10秒+10秒+10秒+10秒+10秒+10秒) にデッド TCP 接続を検出します
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 6

MTU プローブを有効にする

maximum transmission unit (MTU) が長いほどパフォーマンスは向上しますが、信頼性は低下します。

これは、パケットが失われると、より多くのデータが再送信されることになり、インターネット上の多くのルータは非常に長いパケットを配信できないためです。

net.ipv 4.tcp_mtu_probing = 1

詳細については、https://blog.cloudflare.com/path-mtu-discovery-in-practice/ を参照してください。

TCP タイムスタンプ

警告: TCP タイムスタンプは、TCP に実装されているラッピングシーケンス番号 (ギガビット速度) およびラウンドトリップ時間の計算から保護します。セキュリティリスク [5] が発生する可能性があるため、TCP タイムスタンプをオフにすることはお勧めしません。

タイムスタンプ生成を無効にすると、スパイクが減少し、ギガビットネットワークのパフォーマンスが向上する可能性があります。

net.ipv4.tcp_timestamps = 0

BBR を有効にする

BBR congestion control algorithm は、インターネットトラフィックのより高い帯域幅とより低いレイテンシを実現するのに役立ちます。 カーネルモジュール#手動でモジュールを扱う tcp_bbr モジュール

ノート: https://github.com/google/bbr/blob/master/README "これはGoogleの公式製品ではありません"
net.core.default_qdisc = cake
net.ipv4.tcp_congestion_control = bbr

Ephemeral port の範囲を拡大

この記事またはセクションの正確性には問題があります。
理由: この変更によってパフォーマンスはどのように向上しますか? (議論: トーク:Sysctl#talk:sysctl#net.ipv 4.ip_local_port_range)

Wikipedia:Ephemeral port は通常、Transmission Control Protocol (TCP) 、User Datagram Protocol (UDP) 、または Stream Control Transmission Protocol (SCTP) によって、クライアント/サーバ通信のクライアント側のポート割り当てとして使用されます。

net.ipv4.ip_local_port_range = "30000 65535"

TCP/IP スタックの強化

IPv4 プロトコルのカーネルのネットワークセキュリティオプションを強化するためのパラメータセットと、同等のものが存在する関連する IPv6 パラメータを次に示します。

システムを ルーター として使用するなど、一部のユースケースでは、他のパラメータも有用な場合や必要な場合があります。

TCP SYN cookie 保護

SYN flood 攻撃からの保護に役立ちます net.ipv4.tcp_max_syn_backlog に到達したときにだけ起動します。詳細については、 [6] を参照してください。linux 5.10 以降では、デフォルトで設定されています。

net.ipv 4.tcp_syncookies = 1

TCP rfc1337

この記事またはセクションの正確性には問題があります。
理由: これは TCP 標準の一部ではないようですか?説明が正確でない可能性があります。[7] (議論: トーク:Sysctl#net.ipv4.tcp_rfc1337)

tcp time-wait assassination hazard から保護し、time-wait 状態のソケットの RST パケットを破棄します。Linux 以外では広くサポートされていませんが、RFC に準拠しています。

net.ipv4.tcp_rfc1337 = 1

リバースパスフィルタリング

リバースパスフィルタリングを有効にすると、カーネルはマシン上のすべてのインタフェースから受信したパケットのソース検証を行います。これにより、IP スプーフィング方式を使用して被害を与える攻撃者から保護できます。

カーネルのデフォルト値は 0 (ソース検証なし) ですが、systemd は /usr/lib/sysctl.d/50 default.conf を、net.ipv 4.conf.all.rp_filter2 (loose mode) [8] に設定して出荷します。

次に、リバースパスフィルタリングメカニズムを value 1 (strict モード) に設定します。

net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1

net.ipv4.conf.default.*net.ipv4.conf.interface.* および net.ipv4.conf.all.* については、 ip-sysctl.html を参照してください。

martian パケットをログに記録する

martian packet は、Internet Assigned Numbers Authority (IANA) による特殊な使用のために予約されている送信元アドレスまたは宛先アドレスを指定する IP パケットです。詳細は、Reserved IP addresses を参照してください。

しばしば martian とルーティング不可能なパケットが危険な目的のために使われるかもしれません。さらなる検査のためにこれらのパケットをログに記録することは有用かもしれません [9]

net.ipv4.conf.default.log_martians = 1
net.ipv4.conf.all.log_martians = 1
ノート: これにより、ログが大量の情報でいっぱいになる可能性があります。テスト用にのみ有効にすることをお勧めします。

ICMP リダイレクトを無効にする

背景は What are ICMP redirects? Should they be blocked? です。

ICMP リダイレクト受け入れをディセーブルにするには、次の手順を実行します。

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

ルータ以外で ICMP リダイレクト送信をディセーブルにするには、次の手順を実行します。

net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

その他

特権を持たないユーザが IPPROTO_ICMP ソケットを作成できるようにする

この記事またはセクションは情報が古くなっています。
理由: /usr/lib/sysctl.d/50 default.conf は、net.ipv4.ping_group_range0 2147483647 に設定します。 (Discuss)

IPPROTO_ICMP (icmp(7)) ソケットタイプを使用すると、raw(7) ソケット (CAP_NET_RAW ケイパビリティ または SUID ビットを適切な特権所有者で開く必要のある操作) を開くことなく、 ICMP_ECHO メッセージを送信し、対応する ICMP_ECHOREPLY メッセージを受信できるようになります。これらの ICMP_ECHO メッセージはアプリケーションによって送信されるため、IPPROTO_ICMP ソケットは ICMP エコーソケットとは別に ping ソケットとも呼ばれます。

ping_group_range は、ユーザが IPPROTO_ICMP ソケットを作成できるグループの GID 範囲を決定します。さらに、 CAP_NET_RAW 機能の所有者も IPPROTO_ICMP ソケットを作成することができます。 デフォルトでは、この範囲は 1 0で、root 以外の誰も IPPROTO_ICMP ソケットを作成できないことを意味します。

この設定を利用するには、現在 raw ソケットを使っているプログラムは、代わりに IPPROTO_ICMP ソケットを使うように移植する必要があります。 たとえば、QEMUはSLIRP (User-mode networking) に IPPROTO_ICMP を使用するため、QEMU を実行しているユーザーが IPPROTO_ICMP ソケットを作成できるようにすると、ゲストから ping を実行できるようになります。

GID 100 のグループのメンバーであるユーザーのみが IPPROTO_ICMP ソケットを作成できるようにするには、次のようにします。

net.ipv4.ping_group_range = 100 100

システム内のすべてのユーザーが IPPROTO_ICMP ソケットを作成できるようにするには、次のようにします。

net.ipv4.ping_group_range = 0 65535

仮想メモリ

Linux カーネルの仮想メモリ (VM) サブシステムの制御やダーティデータのディスクへの書き出しを調整するパラメータがいくつか存在します。詳しくは Linux カーネルドキュメントを見てください。例えば以下のようなパラメータが存在します:

  • vm.dirty_ratio = 3
システムの空きページや回収可能ページを含む合計メモリから見たパーセンテージとして、ダーティデータを書き出し始めるディスク書き込みを発生させるページ数。
  • vm.dirty_background_ratio = 2
システムの空きページや回収可能ページを含む合計メモリから見たパーセンテージとして、ダーティデータを書き出し始めるバックグラウンドカーネルのフラッシュスレッドのページ数。

上記の値を設定する際はメモリの合計量を考慮する必要があります。例えば、マシンに搭載されているシステムメモリとして話を簡単にすると以下のようになります:

  • 搭載されているメモリが 1GB の場合は vm.dirty_ratio の設定をメモリの 10% に設定するというコンセンサスが合理的です (メモリの 10% はつまり 100 MB になります)。ただしマシンにもっと大量にメモリを搭載している、例えば 16 GB もマシンに積んでいる場合 (その場合 10% は 1.6 GB となります)、磁気ディスクにライトバックするのに数秒近くもかかってしまうため適当な数字とは言えません。この場合、3 に設定するのが適当でしょう (16 GB の 3% は約 491 MB です)。
  • vm.dirty_background_ratio も同じように、メモリが少ない時はデフォルトの 5 が丁度良いかもしれませんが、システムの合計メモリの量によって調整するべきです。

VFS キャッシュ

virtual file system (VFS) キャッシュパラメータの値を小さくすると、システムの応答性が向上する場合があります。

  • vm.vfs_cache_pressure = 50
ディレクトリや inode オブジェクトのキャッシュ (VFS キャッシュ) に使用されるメモリをカーネルがどれくらい回収するか制御する値です。デフォルト値の 100 から低くするとカーネルは VFS キャッシュをあまり回収しなくなります (0 に設定してはいけません。メモリ不足状態になる可能性があります)。

MDADM

カーネルがソフトウェア raid デバイスの resync を実行するときは、システムに高負担をかけないように速度を制限しています。sysctl を使って速度制限を上げたり下げたりすることが可能です。

# Set maximum and minimum speed of raid resyncing operations
dev.raid.speed_limit_max = 10000
dev.raid.speed_limit_min = 1000

mdadm が md_mod モジュールとしてコンパイルされている場合、上記の設定はモジュールがロードされた後にのみ使うことができます。/etc/sysctl.d を使って起動時に設定をロードする場合、md_mod モジュールは /etc/modules-load.d で事前にロードすることができます。

トラブルシューティング

定期的にシステムがフリーズする

ダーティバイトを十分小さい値に設定 (例えば 4M):

vm.dirty_background_bytes = 4194304
vm.dirty_bytes = 4194304
ノート: dirty_background_bytesおよびdirty_bytes} パラメータは、dirty_background_ratio および dirty_ratio ( sysctl#仮想メモリ を参照) に対応します。一度に指定できるパラメータは1つだけです。

参照