[Analysis]
Web2.0の先にあるC10K問題
2007/01/09

個々のクライアントがサーバに要求する処理量は小さなものでハードウェアの性能上は問題がなくても、あまりにもクライアントの数が多くなるとサーバがパンクする――。これが最近Web開発者の間で話題となっている「C10K問題」(クライアント1万台問題)だ。
プロセス番号が足りなくなる
パンクするのは例えばプロセス番号だ。
Ajaxの実装として最近注目されている技術に“Comet”(コメット)と呼ばれるものがある。HTTPのセッションをあえて切断せずに、サーバとクライアント間でつなぎっぱなしにするテクニックだ。Cometを使えばクライアントからのリクエストに応えるだけでなく、サーバ側からも不定期に情報を送り出すことができる。例えば、Web上でチャットサービスを実装するには、通常はクライアント側からサーバに一定間隔でポーリングすることで、ほかのユーザーの発言分をサーバから取得して表示するが、Cometのモデルを使えば、誰かが発言したとたん、サーバ側からすべてのクライアントに差分の発言テキストを送信できる。
CometとAjaxを組み合わせることで、きわめてリアルタイム性の高いWebアプリケーションを作成できる。チャットサービスの「Lingr」、Wikiのように編集できてリアルタイムに編集内容が変化する付箋紙サービス「Wema3」、Web上のホワイトボード共有サービス「Thinkature」などは、すべてCometを使ったサービスだ。
Lingrのような軽いサービスでネックとなるのはプロセッサパワーでもストレージのI/O速度でもネットワーク帯域でもない。同時接続ユーザー数が万のオーダーに達したとき、現在のOSやサーバのプログラミングモデルが現実に合わなくなってくることだ。
LinuxなどUNIX系のOSでは、メモリ上で実行中のプログラムに与えられるプロセス番号は符号付き16ビット整数だ。つまり、デーモン(サーバプロセス)も含め、すべての実行中のプロセスには1〜32767までのユニークな番号が与えられていることになる。ところが、HTTPサーバのApacheなどはクライアント1台からのリクエストに対して1つのプロセスを生成するため、必然的に同時接続数は3万クライアント程度が上限となる。IRCのように参加者が能動的に発言するとは限らず、時間があるときや必要なときにだけ発言するような利用法であれば、ハードウェア性能的にもネットワーク性能的にも1台のサーバで10万クライアントを扱うことができても、プロセス番号が足りないという理由でこのモデルは破綻する。
このように、1万クライアントには対応できても10万クライアントには対応できないという状況が「C10K問題」だ。Cはクライアント、10Kは1万を示す。
1スレッドで多数のクライアントに応える
1クライアントに1プロセスというモデルは、軽い処理をこなすには、いかにも無駄が多い。では、マルチスレッドにして1スレッドに1クライアントを割り当てればいいかというと、それでもまだ別の問題がある。多くのOSでは、万単位のスレッド生成ということを前提として設計されていない。例えば、特別な設定をしていないLinuxでは、1スレッド当たりデフォルトで2MB程度のスタックメモリを割り当てる。1万クライアント=1万スレッドであれば20GBのメモリが必要になる。これでは、仮想メモリを使うとしてもパンクしてしまう。
もちろん、64bit対応のLinuxを使って力技で解決してもいい。プロセス番号不足も、仮想化技術を使って1台の物理サーバ上に仮想サーバをパラレルに走らせれば、ある程度はスケールアウトが可能だろう。しかし、C10K問題の本質は、やはりOSやサーバプロセスの設計が、Web2.0的なサービスに不向きになってきていることにある。最新のLinuxでは3万2000個を超えるスレッドを扱ったり、スレッドごとに消費するスタックの量を減らすことも、カーネルパラメータの設定で可能だが、まだ標準的といえるほど普及したテクニックではない。
進むノウハウの蓄積と開発環境の整備
C10K問題が及ぶ範囲は広い。すでに書いたようにサーバ側ではOSのスレッドやサーバの設計モデルがネックとなっている。膨大な数の「軽い処理」を要求してくるクライアント1万台環境では、細かなI/Oが多数発生するため、I/O関連のライブラリの整備も始まっている。現在、一部の先進的な開発者が試行錯誤しながら個別に実装しているCometについても、HTTPサーバでの対応やライブラリの整備が望まれる。実際、その名もずばり「Cometd」というプロジェクトなどが始まっている。
クライアントについても、同時接続セッション数の上限が比較的小さな数値に設定されていることも、いずれ問題となってくるかもしれない。例えばタブブラウザを使って多数のチャットルームに同時にログインしたとき、今のところ何が起こるかよく分からない。特定の実装に対する個別の組み合わせの検証はできるが、一般論としての挙動は、あまり前例がなく予測不能だ。
Ajax普及が本格化してきたのが、ノウハウの蓄積や開発環境の整備が一巡したからだとすると、Cometのようにクライアント1万台(あるいは1万セッション)を扱うC10K時代のWebアプリケーションの時代の幕開けも、もうすぐそこまで来ているのかもしれない。
関連記事
情報をお寄せください:
最新記事
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜CCNA編〜
| ◆ | 企業の仮想化に足りない“発想”とは? 仮想化運用管理のキモは意外なところに! New! |
| ◆ | 操作もマニュアルも分かりやすい! ユーザー視点で開発されたPC管理ツール New! |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |

| ◆ | セキュリティを知り尽くす上野氏が登壇! @ITメールソリューションLive! in Tokyo |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
| ◆ | 世界に通用するストレージの作り方とは? 製品に込めた思いを富士通の開発者に聞く |

| ◆ | OSSで手間も時間も、障害も減った―― 「マピオンの事例」オープンソース活用法 |
| ◆ | 「ノートPCの持ち出し禁止」で大丈夫? 情報漏えいを防ぐ管理手法とインフラは? |
| ◆ | 1日の処理を1秒に――MySQLの達人が語る 「コスト削減」できるチューニング |

| ◆ | ドキュメント作成を自動化して、SEの作業 効率を大幅アップ! Visio 2007の魅力 |
| ◆ | 急速に広がるHyper-Vでのサーバ仮想化 そのベストプラクティスをデルが解説 |
| ◆ | @IT主催セミナーで語られた、「担当者に 求められるセキュリティ対策」をレポート |

| ◆ | @IT「Windows 7」 特設サイトオープン! 最新情報・移行ノウハウを公開しています |






