「Sysctl」の版間の差分
(→パフォーマンスを向上させる: BBR を有効にするを翻訳して追加) |
(→パフォーマンスを向上させる: Ephemeral port の範囲を拡大を翻訳して追加) |
||
223行目: | 223行目: | ||
net.core.default_qdisc = cake |
net.core.default_qdisc = cake |
||
net.ipv4.tcp_congestion_control = bbr |
net.ipv4.tcp_congestion_control = bbr |
||
+ | |||
+ | ==== Ephemeral port の範囲を拡大 ==== |
||
+ | |||
+ | {{Accuracy|この変更によってパフォーマンスはどのように向上しますか?|section=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" |
||
== 仮想メモリ == |
== 仮想メモリ == |
2021年7月15日 (木) 18:51時点における版
sysctl は稼働中のカーネルパラメータを確認・変更するためのツールです (公式リポジトリの procps-ng パッケージ)。sysctl は procfs (/proc/
の仮想プロセスファイルシステム) で実装されています。
設定
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 files や systemd の sysctl.d man ページ を見て下さい。
利用可能なパラメータは /proc/sys/
以下に並んでいます。例えば、kernel.sysrq
パラメータはファイルシステム上の /proc/sys/kernel/sysrq
ファイルにあたります。sysctl -a
コマンドを使うことで現在利用可能な値を全て表示することができます。
設定の変更はファイルの操作によるか sysctl
ユーティリティを使って行います。例えば、一時的にマジック SysRq キーを有効にするには:
# sysctl kernel.sysrq=1
もしくは:
# echo "1" > /proc/sys/kernel/sysrq
再起動後も変更を維持させるには、/etc/sysctl.d/99-sysctl.conf
や他の /etc/sysctl.d/
内の適用されるパラメータファイルに適切な行を追加・編集してください。
セキュリティ
セキュリティ#カーネルの防御を見て下さい。
ネットワーク
パフォーマンスを向上させる
# reuse/recycle time-wait sockets net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1
TCP/IP スタックの防御
以下では IPv4 プロトコルでカーネルのネットワークセキュリティを厳しくするオプションのパラメータセットを示しています。同一の効果がある IPv6 パラメータも存在します。
ユースケースによって、例えばルーターとして使用するシステムで、他のパラメータが役に立ったり必要になることもあります。
/etc/sysctl.d/51-net.conf
#### ipv4 networking and equivalent ipv6 parameters #### ## TCP SYN cookie protection (default) ## helps protect against SYN flood attacks ## only kicks in when net.ipv4.tcp_max_syn_backlog is reached net.ipv4.tcp_syncookies = 1 ## protect against tcp time-wait assassination hazards ## drop RST packets for sockets in the time-wait state ## (not widely supported outside of linux, but conforms to RFC) net.ipv4.tcp_rfc1337 = 1 ## sets the kernels reverse path filtering mechanism to value 1 (on) ## will do source validation of the packet's recieved from all the interfaces on the machine ## protects from attackers that are using ip spoofing methods to do harm net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.rp_filter = 1 ## tcp timestamps ## + protect against wrapping sequence numbers (at gigabit speeds) ## + round trip time calculation implemented in TCP ## - causes extra overhead and allows uptime detection by scanners like nmap ## enable @ gigabit speeds net.ipv4.tcp_timestamps = 0 #net.ipv4.tcp_timestamps = 1 ## log martian packets net.ipv4.conf.default.log_martians = 1 net.ipv4.conf.all.log_martians = 1 ## ignore echo broadcast requests to prevent being part of smurf attacks (default) net.ipv4.icmp_echo_ignore_broadcasts = 1 ## ignore bogus icmp errors (default) net.ipv4.icmp_ignore_bogus_error_responses = 1 ## send redirects (not a router, disable it) net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.all.send_redirects = 0 ## ICMP routing redirects (only secure) #net.ipv4.conf.default.secure_redirects = 1 (default) #net.ipv4.conf.all.secure_redirects = 1 (default) net.ipv4.conf.default.accept_redirects=0 net.ipv4.conf.all.accept_redirects=0 net.ipv6.conf.default.accept_redirects=0 net.ipv6.conf.all.accept_redirects=0
受信キューのサイズを増やす
受信したフレームは、ネットワークカード上のリングバッファから取り出した後、このキューに格納されます。
高速カードの場合、この値を大きくすると、パケットの損失を防ぐのに役立ちます。
net.core.netdev_max_backlog=16384
最大接続数を増やす
カーネルが受け付ける接続数の上限 (デフォルトは128)
net.core.somaxconn = 8192
ネットワークインターフェイス専用のメモリを増やす
デフォルトでは、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
詳細および推奨値については、次の資料を参照してください。
- http://www.nateware.com/linux-network-tuning-for-2013.html
- https://blog.cloudflare.com/the-story-of-one-latency-spike/
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 ソケット通信が行われていてアクティブである限り、キープアライブパケットは必要ありません。
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 タイムスタンプ
タイムスタンプ生成を無効にすると、スパイクが減少し、ギガビットネットワークのパフォーマンスが向上する可能性があります。
net.ipv4.tcp_timestamps = 0
BBR を有効にする
BBR congestion control algorithm は、インターネットトラフィックのより高い帯域幅とより低いレイテンシを実現するのに役立ちます。 カーネルモジュール#手動でモジュールを扱う tcp_bbr
モジュール
net.core.default_qdisc = cake net.ipv4.tcp_congestion_control = bbr
Ephemeral port の範囲を拡大
Wikipedia:Ephemeral port は通常、Transmission Control Protocol (TCP) 、User Datagram Protocol (UDP) 、または Stream Control Transmission Protocol (SCTP) によって、クライアント/サーバ通信のクライアント側のポート割り当てとして使用されます。
net.ipv4.ip_local_port_range = "30000 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
kernel.io_delay_type
を変更してみる (x86 のみ):
- 0 - IO_DELAY_TYPE_0X80
- 1 - IO_DELAY_TYPE_0XED
- 2 - IO_DELAY_TYPE_UDELAY
- 3 - IO_DELAY_TYPE_NONE