限界にチャレンジ:DHCPサーバの高速化
「高性能DHCPサーバ:ProDHCPの高速化」で、ProDHCPの性能UPを書いたところ、実は結構お客さんが読んでくれていたみたいで、「おっ!これなら1台で巨大ネットワークでもいけるね」とか盛り上がっていたという情報が、客先で作業していたメンバーから届きました(すばらしい情報網!)。
まあ、実際にはそう簡単ではなく、設定の複雑さによって性能もかなり左右されるのですが・・・
とはいえ、「どうせならもっと高速化してみるか!」と、さらに改良をしてみました。時間がかかっているポイントはプロファイラでわかっていると同時に、作った本人はよくわかっているので、どこを改良すればよいかはわかっているのです。わかっているのに放置してきたのには理由があり、「非常に面倒な処理なので、触りたくなかった」ということなのです。
メンバーから、「次の相談は、200万IP、4万サブネットを1サーバで、と言われてますが・・・」と言われたので、まあ、200万IPくらいなら前回の高速化で何とかなると思っていたのですが、さらに、「実は、700万IP、14万サブネットを1サーバで、とも言われてます・・・」と。。「そりゃ、無理だよ!」と言ったものの、どのくらいひどい状況になるか、実験してみなければなりません。
まあ、その前に、手をつけたくなかった面倒な処理の高速化を行い、いざ性能測定!
【ハードスペック】
model name : Intel(R) Core(TM) i5 CPU 650 @ 3.20GHz
stepping : 2
cpu MHz : 3201.000
cache size : 4096 KB
RAM:3758548
●想定規模
Total Subnet No = 40003
Total Lease No = 2040508
[ProDHCP]
実行サイズ:348.128MB
払い出し性能:342 five-way handshakes per second.
再起動:44秒
[ProDHCP以前のバージョン]
実行サイズ:341.992MB
払い出し性能:15 five-way handshakes per second.
再起動:51秒
[ISC]
実行サイズ:716.144MB
払い出し性能:14 five-way handshakes per second.
再起動はリースデータを埋めることが困難なので割愛:100万件の払い出し状態で4分近くかかるので・・・
●最大想定規模
Total Subnet No = 140003
Total Lease No = 7140508
[ProDHCP]
実行サイズ:1197.340MB
払い出し性能:126 five-way handshakes per second.
再起動:16分40秒
[ISC]
実行サイズ:2376.052MB
払い出し性能:13 five-way handshakes per second.
再起動はリースデータを埋めることが困難なので割愛
200万IP、4万サブネットは、まあ何とか使える気がしますが、700万IP、14万サブネットはかなりひどいですね。。しかし、製品の性能をリリース前に公開してしまうのもどうかと思いますが、まあ、あくまでも技術ネタですので。。
この結果は負荷テストツールを使った測定結果ですが、こういう大規模なネットワーク向けのプログラムでは、実環境で問題なく使えるかどうかがポイントです。負荷テストツールの負荷と実環境での負荷は結構違うもので、やっぱり最終的には実環境で様子を見なければ安心できないと思います。ということは、実環境の1回目はかなり緊張するもので、お客さんとの信頼関係もとても大切です。
ちなみに、私は毎回ProDHCPの改良の後は、すぐに会社の本番DHCPサーバとして動かしてしまいます。問題があったときに、メンバーからすぐに「あれ?」と声が上がるので、デバッグに最適です!?会社のDHCPの設定はかなりリースタイムを短めにしているので、結構すぐに「ネットワークがおかしい!」と誰かが叫んでくれます。。
いずれにしても、こういうことをやっているときが、プログラマーとして一番幸せを感じるのでした。