大規模TCP/IPサーバ
今日は珍しく一日会社で、プログラミングを中心に仕事をしました。あるお客さんから大規模TCP/IPサーバの開発手法の相談があり、プロトタイプを作って検討するという作業をしました。
大規模TCP/IPサーバを作る際に問題になるのが、1プロセスあたりのディスクリプタ数制限や、プロセス・スレッドの起動オーバーヘッドです。今回の場合、30000コネクションを張りっぱなしで、数十ミリ秒程度で通信を行うという、1ホストでの処理としてはかなり性能要求が厳しいものになります。さらにデータの共有管理も必要です。
TCP/IPサーバでは並列処理を実現するために、マルチプロセス・マルチスレッド・多重化を選択できますが、多重化はかなり複雑なソースになるため、一般的にはマルチプロセスかマルチスレッドを選択します。最近はマルチスレッドが人気ですが、1プロセスあたりのディスクリプタ数制限や、スタックサイズなど、規模が大きくなると配慮が必要な点も増えてきます。
以前、同様な性能要求の厳しいTCP/IPサーバのコンサルティングを行った際にいろいろ試したのですが、一番応用が利く方法がマルチプロセスとマルチスレッドのハイブリッドタイプでした。マルチプロセスを生成し、それぞれのプロセスでスレッドを生成するという方法です。データの共有や排他に少し工夫が必要ですが、設定によって容易に構成を変化させることができるので、環境的用度も高く、上手く作れば非常に良い方法です。
また、TCP/IP接続を受け付けるたびにプロセスやスレッドの生成を行うと処理が遅くなるため、事前起動しておくのが、性能UPのポイントになりますが、多重アクセプトにも注意が必要です。
少々抽象的な説明になってしまいましたが、TCP/IPサーバプログラミングは作り方によって処理能力が大きく変わります。時間がある際に自分なりに試行錯誤してパターンをつかんでおくのがお勧めです。
しかし、年を取ったせいか、他の仕事で頭が疲れているせいか、根気が続かなくなりました。著書で、集中できるのは3時間が限界、と書いたことがありますが、今日の感じでは30分で一休みで、それを4ラウンドくらいしてようやくサーバ側とテスト用クライアントのプロトタイプもどきができたという感じです。頭では、こうすればいけるはず、ということがすぐに閃くのですが、気力がついていかない、という感じですね。ヒントだけ与えて若手に任せた方が良さそうです。