ネットワークプログラミングの醍醐味は処理性能の限界への挑戦?
意外と技術ネタが人気なので、気をよくして今週も技術ネタで(本当か!?)。
ITの仕事にはさまざまな分野があり、開発はもちろん、構築、運用など、さまざまな役割が力を合わせることで世界のITを支えてきています。開発の中でも、プログラマーだけでなく、システムエンジニアやテスト担当など、さまざまな役割があります。さらに、プログラマーの中でも、WEB、DB、組み込み、制御、ネットワークなど、多くの分野があります。
人によってはどの分野でもそつなくこなすような仕事の仕方をしている人もいますし、私のようにひたすらネットワークプログラミングばかりやっているような人もいます。
そんなネットワークプログラミングオタクの私にとっての、ネットワークプログラミングの魅力は、やはりなんといっても「処理性能の限界への挑戦」かな、と感じています。
今や社内や家庭内のイーサーネットは、有線であればギガビット(1Gbps)が当たり前になり、インターネット接続も光接続がごく普通になってきたり、あるいは無線LANの高速化や、モバイル回線でのパケット通信の高速化によって、インターネットを利用したサービスを誰もが当たり前のように使う時代になりました。
オフィスや家庭、あるいはモバイルでもそれだけ高速になったということは、それらが束ねられてくる回線事業者では、普通の人には想像もできないような状態になっています。10Gbpsの接続は当たり前であったり、そこに流れるデータ量も想像もできないほどの量になりました。回線事業者側で大量の通信を高速に処理できなければ今の快適なインターネット環境は実現できていないわけです。
処理性能を上げるためには、単体での性能を高めるのはもちろんですし、負荷を分散させるのも効果的です。WEBサーバや動画サーバなどのように、配信するタイプのサービスは負荷分散がマッチしやすいタイプの処理でしょう。
一方、DHCPサーバのように、データの書き換えが行われるタイプのサービスは分散しても排他が必要になり、なかなか単純に負荷分散で性能が上がるものではないものもあります。DHCPなど各拠点のルーターに適当に任せれば良いという手もありますが、商用サービスでは認証やフィルターとの連携のために一元管理したいこともあり、私が手がけているProDHCPは回線事業者では1サーバで300万IP以上を管理しているような状態で使われ、しかも基本的に止めることができない状況で使われています。
開発した当初は10万IPの管理でも処理性能が大変といわれていた時代に作りましたが、あっという間に10倍以上の規模で処理性能を要求される時代になりました。機能追加も繰り返しながら、既にメジャーバージョンで10回近くバージョンアップしてきました。
また、回線事業者を流れるHTTPパケット全てを処理するような製品も開発しており、こちらは10Gbpsの接続で、数万セッションを同時に流しながら複雑な処理をこなしつつ3Gbps程度のスループットを出していますが、これでもまだ足りないと頭を悩ませつつ試行錯誤を続けています。これも実際に作って試してみるまで全く苦労は想像できなかった分野でした。普通にLinuxカーネル配下で処理したのでは1Gbpsちょっとしか出なくて唖然としたものです。おまけに、メタデータの格納にディレクトリとファイルを使ったところ、I/Oが追いつかずにiノードキャッシュなどが肥大化してカーネルパニックになったり、あまりにも多数のTCPコネクションを扱いすぎて、バッファの食い過ぎでこれまたカーネルパニックなど・・・。まさに限界へのチャレンジです。
技術的に処理を実現できるかどうかだけでも難しい課題も多い上に、処理性能と安定稼働の両立はとても大変なのです。が、大変なことほどやりたくなるものなのですよねぇ・・・。