DynamoDBやSQSといったAPIを高頻度に使うときに忘れずにセットしておきたいカーネルパラメータ
DynamoDB, SQSなどは、Linux内部から高頻度に HTTP APIを叩きに行くことになる。( Fluentdやら、memcachedやらも同じかも)
通常のLinuxのカーネルパラメータ設定で、本番環境や、負荷テスト環境に使うと、おそらくネットワーク障害のような状況に陥るはず。
その時、「DynamoDBの IOPS不足?」「 SQSのAPI スロットリング?「AWSの限界?」と思う前に、これチェック!
netstat -an
この結果に、大量のTIME_WAITが表示された場合は、 エフェメラルポートが枯渇して socket作れない状態に陥っている。つまり、DynamoDBやSQSまでパケット届いていない状態なのでAWS側は原因ではない。
ということで、エフェメラルポートを最大限使うようにカーネルパラメータを設定しておくことを忘れないようにするためのメモ。
$ sudo cp /etc/sysctl.conf /etc/sysctl.conf.bak $ sudo vi /etc/sysctl.conf $ sudo diff /etc/sysctl.conf /etc/sysctl.conf.bak #変更内容確認 < net.core.somaxconn = 10240 < net.core.netdev_max_backlog = 10240 < net.ipv4.tcp_max_syn_backlog = 10240 < net.ipv4.tcp_max_syn_backlog = 10240 < net.ipv4.tcp_tw_recycle = 1 < net.ipv4.tcp_tw_reuse = 1 < net.ipv4.ip_local_port_range = 1024 65535 < net.ipv4.tcp_fin_timeout = 10 $ sudo reboot #reboot # reboot後に再度ログインして確認 $ cat /proc/sys/net/ipv4/tcp_tw_recycle 1
これでOK