Linux
nginx
CentOS

nginx - カーネルパラメーターのチューニング

概要

  • L7ロードバランサーやAPサーバで使うnginxを設計する際に、パラメーターチューニング大事だなと思ったので書き残します。
  • 大体この辺り本番に合わせて適値を見つけて設定していくのが良いかなぁと思いました。
  • CentOS 6系です
  • ipv6の設定は無視してます。。

チューニング

パラメーター 内容 default値
net.core.rmem_max = 16777216 TCPとUDPの受信バッファのデフォルトサイズと最大サイズ。 124928
net.core.wmem_max = 16777216 TCPとUDPの送信バッファのデフォルトサイズと最大サイズ。 124928
net.nf_conntrack_max = 1053616 ESTABLISHEDのリストの最大数(OS側の管理数) 可変
net.ipv4.conf.default.accept_source_route = 0 ソースルートが指定されたパケットを拒否。本来は経路のテストを行う目的であるのでoffにする 1
net.ipv4.tcp_rmem = 4096 349520 16777216 データ受信バッファ サイズ 可変
net.ipv4.tcp_timestamps = 0 NAT環境下で、複数ホストがクライアントのときに、WAN側のサーバに接続が切られる対策 1
net.ipv4.tcp_fin_timeout = 5 FINのタイムアウト時間 60
net.ipv4.tcp_syn_retries = 3 tcpのSYNを送信するリトライ回数。
この回数SYNを送ってもダメなら諦める
5
net.ipv4.tcp_synack_retries = 3 接続を受付側としてオープンするとき、 カーネルは SYN に ACK を詰め込んで送り、先に受けとった SYN を確認する。 5
net.ipv4.tcp_syncookies = 1 SYN flood攻撃対策 1
net.ipv4.ip_local_port_range = 10000 65535 TCP/IPの送信時に使用するポートの範囲
可能なら 1024-65535が良いが、iptablesやAWSだとNetworkACLとかで
同様に必要に応じて開放しておかないとパケットが途中で止まってハマるから注意。
$ cat /proc/sys/net/ipv4/ip_local_port_rangeで確認できる
32768 61000
net.ipv4.tcp_tw_reuse = 1 自分からの接続を使い回す。tcp_tw_recycleは相手からの接続を使い回す。 0
net.ipv4.tcp_tw_recycle = 0 相手からの接続を使い回す。 0
net.ipv4.tcp_rfc1337 = 1 RFC1337に準拠させる。TIME_WAIT状態のときにRSTを受信した場合、TIME_WAIT期間の終了を待たずにそのソケットをクローズする 0
net.ipv4.tcp_fin_timeout = 5 タイムアウトはできる限り短いほうがいい 60
net.ipv4.tcp_max_tw_buckets = 65536 システムが同時に保持するtime-waitソケットの最大数。
DoS攻撃を防げるため、低くするのはやめたほうが良い。
動的
net.ipv4.tcp_orphan_retries = 0 こちらからクローズしたTCPコネクションを終了する前の再送回数。
webサーバだとリソースを消費する可能性があるため、低くしたほうが良い
0
net.ipv4.tcp_keepalive_probes = 5 TCP が keepalive プローブを送る数。この数に達すると、 その接続が壊れたとみなす。
9
net.ipv4.tcp_slow_start_after_idle = 0 keepaliveしててもしばらく通信がなかったらcongestion window sizeをresetする。
keepaliveを利用しており、かつ輻輳が少ない環境ではoffが良い。
1
net.core.netdev_max_backlog = 65536 パケット受信時にキューに繋ぐことができるパケットの最大数 1000
net.ipv4.tcp_max_syn_backlog = 65536 ソケット当たりのSYNを受け付けてACKを受け取っていない状態のコネクションの保持可能数。
この値を超えたものに関してはOSはSYNパケットを拒否することになる。
溢れたパケットはnetstatで確認できる。
ただし、この値はnet.core.somaxconnより大きかった場合、net.core.somaxconnの値を優先する。
1024
net.ipv4.conf.eth180.arp_ignore = 1 ぶら下がってるAPサーバ群にarpに応答させない(MACアドレスを覚えさせない)
IPとmacアドレスが関係ずけられると、送りたい機器に通信できなくなる。
0
net.ipv4.conf.eth180.arp_announce = 2 ぶら下がってるAPサーバ群にarpに応答させない(MACアドレスを覚えさせない)
IPとmacアドレスが関係ずけられると、送りたい機器に通信できなくなる。
0
net.core.somaxconn = 65535 一度に受け入れられるTCPセッションのキューの数。
TCPのセッション数をbacklogで管理し、それを超えたものはキューに格納される。
このキューの数をここで設定する
128
vm.swappiness = 0 実メモリがある状態でスワップを使用しない 0
vm.overcommit_memory = 2 実メモリ以上にプロセスにメモリを割り当てない 0
vm.overcommit_ratio = 99 OOM killerで勝手にkillするくらいだったら、メモリ不足を検出してエラー処理をさせる。
vm.overcommit_memory = 2のときに設定する
50
kernel.shmmax = メモリのByte数 共有メモリの最大サイズ。サーバーの搭載メモリ(1GB)に合わせて変更するので 動的?
kernel.shmall = 68719476736 システム全体の共有メモリ・ページの最大数 68719476736
kernel.msgmnb = 65536 1つのメッセージキューに保持できるメッセージの最大値 65536
kernel.msgmax = 65536 メッセージキューIDの最大値 65536
kernel.sysrq = 0 SysRqとは、サーバでキーボード操作ができなくなったとき、カーネルが昨日してれば特定のキー(Alt + PrintScreen)で割り込める。使わないので0 0
kernel.core_uses_pid = 1 コアダンプ時、".PID"をコアファイル名に追加しない 0