最近、私の会社のプロジェクトで立て続けにBig-ipのコネクション設計で問題が起きている
ので簡単にまとめてみた。
Connection-limitは厳密じゃない
big-ipでコネクションを制限したいと思ったら、connection-limitを設定することを考えると
思います。
しかし、big-ipはここで設定した値に届かない場合でも上限に達したと見なしてエラーを返す
ことがあります。
なぜそんな振舞いをするのかというと、それはbig-ipはTMM毎に処理を分割して行うからです。
TMMとは
Traffic Management Microkernel のこと、らしいですがその中身をあまり意識はしていません。
重要なのはこのTMMがCPUのコア毎に1つ存在することです。
https://packetpushers.net/what-the-heck-is-f5-networks-tmos/ より
実際の振舞い
例えば4コアのbig-ipの、あるpool memberに40コネクションをlimitで設定した場合
実際には0~3の各TMM毎に10コネクションがlimitとして設定されることになります。
- TMM0 10コネクション
- TMM1 10コネクション
- TMM2 10コネクション
- TMM3 10コネクション
通常であれば各TMMにはバランスよく振り分けられるでしょう。そのため、ほぼ実際に設定したLimitに
到達するまでエラーを返すことはありません。
ですが、例のように小さい値を設定していると、多少の偏りが大きく影響します。
厳密にコネクションを制御する為にTMMを1つしか使わない設定にすることも出来ます。
しかし、本来ならば使えるCPUを使わない設定のため性能が落ちることを許容しなければなりません。
まとめ
big-ipでConnection-limitを設定する際は、多少の偏りが発生することを考慮した値にするのが良いかと
思います。