【しーてんけーもんだい】

C10K問題 とは?

最終更新:
💡 1万同時接続を扱うためのサーバー設計の課題

サーバーで1万程度のクライアント接続を同時に扱うための設計上の課題。接続ごとの資源や入出力の待ち方を考える。同時接続数は利用者数や毎秒のリクエスト数とは違う。

📌 このページのポイント
C10K:接続の待ち方を考える 接続ごとに担当 待ちを共有 担当 担当 担当 イベント処理 資源の負担に注意 重い処理に注意 接続数 ≠ 利用者数 ≠ 毎秒の処理件数
少数の接続で待ち方を模式化した図。どちらも処理内容と構成に依存し、1万接続の成功・失敗を保証しない。
ひよこ ひよこ
1万人が同時に使うと必ず落ちるの?
ペンギン先生 ペンギン先生
1万は課題の目安で、全サーバーがそこで必ず止まる境界ではないよ。一人で複数の接続を使う場合もあるし、接続を保っているだけの時間もある。同時接続数と毎秒のリクエスト数は分けて考えよう。
ひよこ ひよこ
何が負担になるの?
ペンギン先生 ペンギン先生
接続ごとにスレッドを用意する方式では、メモリーやスレッドの切り替えなどが負担になる場合があるよ。ただし、その方式がいつも失敗するという意味ではない。処理内容や資源、構成によって結果は変わるんだ。
ひよこ ひよこ
イベント駆動はどう役立つ?
ペンギン先生 ペンギン先生
入出力が進められる接続をOSから知らせてもらい、処理を進める方式だよ。待っている接続ごとに専用のスレッドを置く必要を減らせる。CPUを使う重い処理まで自動で並列になったり、待ちが全部なくなったりするわけではないんだ。
ひよこ ひよこ
NginxやNode.jsは一つのスレッドだけ?
ペンギン先生 ペンギン先生
Nginxはマスターと複数のワーカープロセスを使えるよ。Node.jsにもイベントループのほかにワーカープールがある。イベント駆動という説明から、製品全体が必ず一つのスレッドで動くと考えないでね。
ひよこ ひよこ
その方式なら1万接続は保証される?
ペンギン先生 ペンギン先生
保証にはならないよ。重い処理でイベントループを塞ぐと、ほかの接続にも影響する。メモリー、通信、ファイルや接続の設定なども関わるので、実際に近い処理と接続数で負荷を確かめよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「C10K問題」って出てきたら「1万同時接続を扱うためのサーバー設計の課題」と思えばだいたいOK!
📖 おまけ:英語の意味
「C10K problem」 = 1万程度の同時接続を扱う問題
💬 10Kは1万を表すよ。Dan Kegelの説明は、1万のクライアントを同時に扱えるようにしよう、という課題から始まるんだ。

参考資料

← 用語集にもどる