高性能DHCPサーバ:ProDHCPの高速化
このところDHCPサーバのお問い合わせが増えてきました。きっかけはやっぱりIPv4グローバルアドレス枯渇によりIPv6化を準備したいということで、DHCPサーバのIPv6版を検討し始めたということだと思います。どうせIPv6版を導入するなら、既存のIPv4版の方も再検討しようという流れのようです。
当社の高性能DHCPサーバ:ProDHCPのIPv4版は既にISPさんや大手企業、官公庁、大学などで多くの実績があり、しかも価格がアドレス数、セグメント数に無関係に80万円(冗長化すると140万円)と、大規模向け商用DHCPサーバ製品としては圧倒的に安く、下手すると他の製品の年間保守料金1年分で買うことができてしまうくらいです。ProDHCPとして販売しているほかに、ソリトンシステムズさんのNet'AttestD3にOEM供給もしています。
これまでは大規模な運用でもせいぜい20万IPアドレスくらいで使われていたため、IPv4版はあまりIP払い出し性能を気にせずに開発してきました。設定反映時間の高速さは当初から求められていたのですが、払い出し性能はオープンソースのものと同等以上くらいで問題なし、という感じだったのです。
ところが、IPv6版の相談が増えてくると、当然のように1サーバで200万IPアドレスを管理したいという規模になってきて、もともとIPv6版はそれを見越して高性能に開発してあるのですが、IPv4版も同じ規模で運用したいという相談が増えてきたのです。実際に先日あるサーバで仮リリースした際に、設定は「160万IPアドレス、3.5万セグメント」という、かなり巨大な設定でした。ここまで大規模な設定になると、IP払い出し性能はかなり落ちてしまいます(オープンソースのものも同じ感じです)。
そこで、少しはまじめにIP払い出し処理を高速化してみるか、と先週末くらいから空き時間に改良を始めました。まずはプロファイラを使って、どの処理が遅いか、時間がかかっているかを分析し、処理を見直していきます。基本的に巨大な設定ファイルの情報を探し出すのに時間がかかっているという感じでしたので、
・読み込み時にフラグを持たせて判断を高速化する
・使い回す値をキャッシュする
・頻繁に行う検索のうち、キーが重複しないものをハッシュ検索にする
このくらいの変更で、200万IPを管理した状態で「13トランザクション/秒」だったIP払い出し性能を、「1097トランザクション/秒」(冗長化しても486トランザクション/秒)と、圧倒的に高速化できました。もちろん設定の書き方によって差は大きく出ますが、いずれにしても桁違いに速くなったということは間違いありません。
あまり大きな変更をしてしまうと、複雑なDHCPサーバの処理全体の動作確認が非常に大変なので、本当にピンポイントの変更だけですむ範囲で改良しましたが、なにも工夫していなかっただけに、劇的に速くなるものです。
ここまで速くなってしまうと、200万IPを1ホストで、つまり、1ライセンスで運用できてしまい、それはあまりにも安すぎるのではないか?という、ビジネス的な問題も出てきてしまいましたが、とりあえず技術者としては自己満足なのでした!