10Gイーサー向けのプログラムは大変
今日はパートナーさんのところでネットワーク製品の改良版の動作確認などをしてきました。1Gbpsを超えるような帯域での製品の確認はなかなか大変なのです。
普段はテスト環境として、サーバ機と製品を2本の10Gイーサーで接続し、サーバ機の中のVMの1つでサーバプログラム、別のVMでクライアントプログラムを動かし、製品の性能や動作を確認していますが、この構成ではTCPでせいぜい2.5Gbpsくらいまでしかそもそも出ないのです。さらに、セッション数も1万を超えるとかなりVM側がエラーだらけになります。製品のターゲットはさらに上なので、さらに強力な負荷テスト環境が必要なのです。
パートナーさんのところには負荷試験専用のハードがあり、それを使うと10Gイーサー接続で本当に10G近い負荷をかけられます。セッション数も1万を軽く超えることができます。この装置を使うと自社のテスト環境では見つけられない問題がどんどん見つけられます。そのくらい、10Gイーサーでの処理はOSやプログラムにとって過酷なのです。適当に作っても1Gbpsくらいまでなら今どきのサーバ機ならそれなりに動きますが、2Gbpsを超えるあたりからプログラムはもちろんですが、OSのチューニングも必要になり、場合によってはデバイスドライバなどに手を入れる必要も出てきます。
限界性能で何となく動きがおかしいと感じたときには、大抵何らかの問題があるもので、「まあ、大丈夫だろう・・・」と運用を始めると、忘れた頃に問題が表面化することがよくあります。限界テストは潜在的な問題を見つけるのにかなり役立ちます。
今日も、それらしく動いていたので「大丈夫かな」と思っていたのですが、いろいろなテストパターンを確認すると、あるパターンでどうも怪しい感じが。。ひたすら執念深く調べたところ、やはり処理の一部に無駄にCPUを消費してしまう部分がありました。
高負荷状態でしか表面化しないような問題は、デバッグもとても大変です。ログを出そうとするとあまりにもログが出過ぎて、追うのに苦労したり、ログ出力自体が負荷になってしまい、同じ現象が再現しないこともあります。デバッガを使おうと思っても、処理が多すぎて追い切れないこともよくあります。
そんな苦労がありながらも、やっぱりネットワークプログラミングは好きなのですよねぇ・・・。