IPVSのthreshold

LinuxのIPVSにはthresholdの機能があって、あらかじめ指定しておいた数以上の接続は受け付けない
ようにできるんだけども、keepalived-1.1.12以前ではこの機能に対応してなかったんですね。
そんで、1.1.13で対応してくれたようなので使ってみようかなあと思ったんですが、以前にIPVSを検
証したときに、この辺でちょっと問題があったことを思い出しました。


それは「ESTABLISHED以外のステートも1セッションとしてカウントすること」です。


そもそも、なぜこんな仕様になっているのかわからないんですよね。
たとえば u_threshold = 100 とかに設定して一気に100セッションを張ると、それ以上のセッション
は張れなくなります。ここまではいいのですが、接続が切れても TIME_WAITから解放されるまで新し
いセッションを張る事ができないんです。


「先にFIN送るからTIME_WAITせにゃならんのじゃ」とか「TIME_WAITは接続が切れた状態じゃないぞ」
とか言いたいことがいっぱいあるかもしれませんが、とりあえずそれはおいとくとして、、、、、


できればWEBサーバに余裕ができた時点でどんどん新しい接続を受け付けたいんですよね。
thresholdってWEBサーバが過負荷に陥らないように決められた数以上の接続を抑止するためのものだ
と思うのだけど、これだと短時間にアクセスが集中すると簡単に全サーバが接続不能に陥ってしまい
そうです。数ミリ秒のオーダーでレスポンスを返してソケットをクローズしているのに、TIME_WAIT
が完了しないと新しい接続を受け入れられないなんて悲しすぎます。
でもまあ、悲しんでいても仕方がないので、カーネルソースを少しいじってみることにしました。


net/ipv4/ipvs/ip_vs_conn.c をこんな感じにしてみます。
これでESTABLISHEDだけをカウントしてくれるようになるかもです。

--- ip_vs_conn.c.olg    2007-03-16 01:58:41.000000000 +0900
+++ ip_vs_conn.c        2007-03-16 01:59:31.000000000 +0900
@@ -373,8 +373,7 @@

 static inline int ip_vs_dest_totalconns(struct ip_vs_dest *dest)
 {
-       return atomic_read(&dest->activeconns)
-               + atomic_read(&dest->inactconns);
+       return atomic_read(&dest->activeconns);
 }

ただ、l_thresholdにも影響ありそうなのが気になりますが、後の事はとりあえず動かしてみて
から考えてもいいかなあと(^^;

でも、もう3時だ、、、今日はmakeだけしてねんねしま・・・