Mackey's Lab

博士を取るまでの備忘録

高並列性サーバプログラムの実装(サーベイ編)

より多くのクライアントからの同時アクセスを捌くためにサーバプログラムのパフォーマンス改善が必要になってきた。世に言う C10K 問題とかその話に近い。C10K 問題については下記の Web サイトを参考にすると良いが、簡単に言うと「ハードウェアの性能上は問題なくても、あまりにもクライアントの数が多くなるとサーバがパンクすること」である。

TheC10kProblem

この文章は10年以上前に書かれたものであるが、ハードウェアの性能が劇的に向上した現在でもこの問題は考慮する必要がある。解決法(最適な実装方法)に関しては未だ議論が絶えないように見えるというかノウハウになっていて具体的な実装方法はあまり出てきてないように思える。解決策についていろいろ調べて出てくるのはこれらのサイトである。

インターネットサーバでの Pthread と epoll (1)

ネットワークプログラムのI/O戦略 - sdyuki-devel

特に2つめのブログでは I/O 戦略を非常に詳しく解説しているので一読を勧める。このブログでは 1 コネクション 1 スレッド実装に対して「Webサーバーには本当に向いていない」と言及しているが、一方で現実的に 1 コネクション 1 スレッドでも問題ないと評価しているブログも見つけた。評価方法が不明確ではあるが、ハードウェアの性能向上を考えると十分あり得る結論だと思う。ここら辺は自分で計測し、評価をとってみようと思う。

Kazuho@Cybozu Labs: 「サーバ書くなら epoll 使うべき」は、今でも正しいのか

 結論としては「ネットワークプログラムのI/O戦略」という記事が勧めている、マルチスレッド・イベント駆動方式 (Wavy 方式) を採用することにする。この実装については下記のブログにて述べられている。
マルチコア時代の高並列性IOアーキテクチャ Wavy - Blog by Sadayuki Furuhashi

ただし今回はなるべくシンプルな実装を心がけるために、タスクキューを利用しない。