2012年12月7日金曜日

kernelチューニング


linuxサーバのOS全体に効くカーネルパラメータのチューニング箇所と
その設定値、またその理由をまとめておく。

あくまで自分の環境ではこうした、というだけであり、
提供するサービスごとに検討が必要である。
どこをどう変更するのか、または変えないのか、その判断材料にはなるだろう。
※ユーザ単位でシステムリソースに制限をかける場合をこちらを参照してほしい。


以下は/etc/sysctl.conf で設定するものとする。
● 大規模サイト用チューニング
kernel.pid_max
動作:pidの最大数
設定値:131072
理由:pidを枯渇させない

vm.max_map_count
動作:mmapやmalloc時にメモリを仮想空間にマッピングできる最大ページ数
設定値:300000
理由:マッピングできなくなる事態を防ぐ

net.core.somaxconn
動作:接続(ソケット)キューの最大数
設定値:30720
理由:カーネルの処理能力以上のトラフィックが届いた場合にバッファをもたせる

net.core.netdev_max_backlog
動作:パケット受信時にキューにつなぐことのできるパケットの最大数
設定値:30720
理由:カーネルの処理能力以上のトラフィックが届いた場合にバッファをもたせる

net.ipv4.tcp_max_syn_backlog
動作:SYNに対するSYN/ACKの応答待ちに使うソケットの最大数
設定値:30720
理由:socketの枯渇を防ぐ

net.netfilter.nf_conntrack_tcp_timeout_established
動作:ESTABLISHEDかつIDLE状態でRESETパケットを投げ、リストから消すまでの時間(秒)
設定値:2000
理由:無駄なコネクションは長い時間保持しない

net.netfilter.nf_conntrack_max
動作:ESTABLISHEDのリストの最大数(iptablesの管理数)
設定値:1048576 ※1セッション350Bとし、メモリ1GB程度に抑える
理由:コネクションを保持できない事態を防ぐ

net.nf_conntrack_max
動作:ESTABLISHEDのリストの最大数(OS側の管理数)
設定値:1048576 ※1セッション350Bとし、メモリ1GB程度に抑える
理由:コネクションを保持できない事態を防ぐ

net.ipv4.tcp_keepalive_time
動作:keepaliveのタイムアウト時間(秒)
設定値:60
理由:socketの枯渇を防ぐ

net.ipv4.tcp_keepalive_intvl
動作:keepaliveのタイムアウト判定の再試行時間(秒)
設定値:2
理由:socketの枯渇を防ぐ

net.ipv4.tcp_keepalive_probes
動作:keepaliveのタイムアウト判定のリトライ回数
設定値:3
理由:socketの枯渇を防ぐ

net.ipv4.tcp_fin_timeout
動作:FINのタイムアウト時間(秒)
設定値:2
理由:socketの枯渇を防ぐ

vm.overcommit_memory
動作:実メモリ以上にメモリをプロセスに割り当てるオーバーコミットを許すかどうか
設定値:2 ※無効
理由:OOM killerを発生させたくない

vm.overcommit_ratio
動作:最大仮想メモリ領域 ※SWAP+(RSS*(この値/100)
設定値:95
理由:物理メモリを超えない範囲で少し余裕を持たせる

vm.swappiness
動作:実メモリがある状態でスワップを使うかどうか
設定値:0 ※無効
理由:実メモリを使い切るまでスワップは使わせない

vm.min_free_kbytes
動作:メモリのFREE領域の確保量
設定値:524288 (524288/1024 = 512MB)
理由:メモリ確保の容量を常にあけておく

net.ipv4.ip_local_port_range
動作:クライアントとして使用できるローカルポートの範囲
設定値:1024 65500
理由:サーバ発の通信対策

※以下は検討中
net.core.rmem_max
net.core.wmem_max
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem


● IPv6対応の有無
net.ipv6.conf.all.disable_ipv6
net.ipv6.conf.lo.disable_ipv6
net.ipv6.conf.default.disable_ipv6
動作:IPv6周りの設定を有効にするかどうか
設定値:0 ※無効
理由:IPv6は使わない


● ハングアップ時の動作を規定
kernel.panic_on_oops
kernel.panic
kernel.softlockup_panic
kernel.hung_task_panic
動作:ハングアップ時にリブートさせるかどうか
設定値:1
理由:ハングアップしたらリブートさせる


● 設定の反映
変更を反映させる。
# sysctl -p

変更を確認する。
# sysctl -a


OS全体のカーネルチューニングの必要最小限な個所は以上ぐらいであろうか。
しかし、ユーザ単位でのシステムリソース制限も検討が必須である。

さらに、NICのリングバッファ(ring buffer)の設定値も見直した方がいい。

TSO(TCPsegmentation offload)、
GSO(Generic Segmentation Offload)
の扱いも考慮すべきである。
tcを利用したトラフィックコントロール内の
【TSO、GSOの扱い】章を参照。