LinuxのTCPチューニング

WEB系エンジニア?はLinuxカーネルパラメータをチューニングして性能を上げたりしているようですが、その辺に興味があったのでメモっときます。正しいかどうかの確証は全くありません。あしからず。ちなみに僕自身はこの手のパフォーマンスチューニングは経験無しです。

カーネルパラメータといってもいじる項目はいろいろあるようでDB周りだと共有メモリのサイズをいじったりするんだと思いますが、今回はTCPの話です。

なおこのエントリを書くにあたってプロのための Linuxシステム構築・運用技術 (Software Design plus)の4章やLinuxカーネル2.6解読室の24章を参考にしました。

TCPチューニング関連でググってみると参考になりそうなのはこの辺。

見落としがちなLinuxのWEBチューニング | Act as Professional

Hadoop徹底入門の10章でもtcp_fin_timeoutを60秒から30秒にするチューニング事例が紹介されています。

tcp_fin_timeoutが何かって言うと

ソケットを強制的にクローズする前に、最後のFINパケットを待つ時間(n秒)を指定する。DoS攻撃対策のために必要。defaultは60秒。

http://linux.mini13i.com/?kernel%2F%A5%B7%A5%B9%A5%C6%A5%E0%A5%D1%A5%E9%A5%E1%A5%BF#fb158897

だそうです。図にするとこんな感じだと思う。

netstat -natでTIME_WAITがいっぱい出ている場合は上述のタイムアウト時間を減らすことにより対処できるようです。

tcp_fin_timeoutネタはこれで終了して(早!)次はSYN再送ネタ。

最近こんな記事がアップされました。

SNSプラットフォームでは、5秒以内に応答を返さなければならないというルールがあり、5秒を超えてしまうとサービスが止められてしまいます。アクセスの増加によって、ドラゴンコレクションのネットワーク内でパケットロスが発生しました。SYN再送が繰り返される際に、1回目の再送で3秒使ってしまい、プラットフォームの5秒ルールに抵触したのです。ドラゴンコレクションのアクセス規模では、一瞬にして1000エラーをカウントしてしまい、プラットフォーム側でシステム障害と判定され、メンテナンスステータスにされてしまいます。この問題に対し、コナミでは2つの処理を行いました。一つは、SYN再送を1秒に固定するようOSカーネルの設定を変更しました。

大規模ソーシャルゲーム「ドラゴンコレクション」運営の最前線で得られたノウハウ ~チューニングと運用、18のポイント~ (2/4):CodeZine(コードジン)

SYN再送を1秒に固定するようOSカーネルの設定って何だろってのがテーマです。

まずTCPのスリーウェイハンドシェイクってこんな感じですよね。

SYNの再送は初期値が3秒で倍々ゲームで増加していきます。何回再送するかはtcp_syn_retriesで設定します(デフォルト5回)。

待ち時間(秒) イベント
3 SYN送信
6 1回目再送
12 2回目再送
24 3回目再送
48 4回目再送
96 5回目再送

調べた限りでは「SYN再送を1秒に固定するようOSカーネルの設定」は存在しない気がします。ただし「SYN再送を1に固定するようOSカーネルの設定」なら上述のtcp_syn_retriesを1にすれば出来る気がします。