sysctl
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 パラメータも存在します。
ユースケースによって、例えばルーターとして使用するシステムで、他のパラメータが役に立ったり必要になることもあります。
#### 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 ## 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.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.all.send_redirects = 0 ## ICMP routing redirects (only secure) #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
仮想メモリ
Linux カーネルの仮想メモリ (VM) サブシステムの制御やダーティデータのディスクへの書き出しを調整するパラメータがいくつか存在します。詳しくは Linux カーネルドキュメントを見て下さい。
# Contains, as a percentage of total system memory, the number of pages at which # a process which is generating disk writes will start writing out dirty data. vm.dirty_ratio = 3 # Contains, as a percentage of total system memory, the number of pages at which # the background kernel flusher threads will start writing out dirty data. vm.dirty_background_ratio = 2
コメントで説明されているように、これらの値を設定する際は RAM の合計量を考慮する必要があります。
vm.dirty_ratio
のデフォルトは 10 です (RAM の 10%)。RAM が 1GB の半分のときは RAM の 10% というのがコンセンサスで (つまり 10% は 50 MB 以下) 磁気ディスクならば合理的な値です。ただし RAM が大きい、例えば 16 GB のときは (10% は 1.6 GB 以下) 磁気ディスクにライトバックするのに数秒かかるのであまり良くありません。この場合に合理的な値は 3 です (16*0.03 ~ 491 MB)。
vm.dirty_background_ratio
は同じように、メモリが少ない時はデフォルトの 5 (% の RAM) が丁度良いですが、システムの RAM の量によって調整するべきです。
トラブルシューティング
定期的にシステムがフリーズする
ダーティバイトを十分小さい値に設定 (例えば 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
参照
- sysctl(8) と sysctl.conf(5) の man ページ
- Linux カーネルドキュメント (
<kernel source dir>/Documentation/sysctl/
) - カーネルドキュメント: IP Sysctl
- SysCtl.conf Tweaked for Security and Cable Speed [1]