sysctl

提供: ArchWiki
2021年7月15日 (木) 18:18時点における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

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
ノート: SIP ルータなどのリアルタイムアプリケーションでは、このオプションは高速な CPU を必要とします。そうしないと、キュー内のデータが古くなります。

最大接続数を増やす

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

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

仮想メモリ

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

参照