# The C10K Problem
> 1台のサーバで同時に **10,000 クライアント**を処理するにはどうすればよいか。
[[Dan Kegel]] が 1999 年に公開・継続更新した技術記事。OS レベルの I/O 多重化戦略・スレッドモデル・カーネルチューニングを体系的に整理した、高並行サーバ設計の古典的リファレンスである。
## 核心的主張
- 1999年時点で1台のサーバが10,000クライアントを処理するのは**ハードウェア的に可能**であり、問題はソフトウェアの I/O 戦略にある。
- I/O 戦略は大きく5種に分類され、[[epoll]](Linux 2.6)・[[kqueue]](BSD)が高並行向けの推奨手法として整理された。
- スレッドモデルは M:N の複雑さから 1:1(NPTL)へと業界がシフトした。
- `sendfile()`・ゼロコピー・`TCP_CORK` などのカーネル機能活用でコピーコストを排除できる。
## 5つの I/O 戦略
| 戦略 | 通知モデル | 推奨技術 |
|-----|-----------|--------|
| 1. 非ブロッキング + レベルトリガ | select/poll | /dev/poll(Solaris)、[[kqueue]](BSD) |
| 2. 非ブロッキング + エッジトリガ | 遷移時のみ通知 | [[epoll]](Linux)、[[kqueue]](BSD) |
| 3. 非同期 I/O + 完了通知 | aio_ / IOCP | Linux AIO、Windows IOCP |
| 4. スレッド1本/クライアント | ブロッキング I/O | NPTL(Linux)、libthr(FreeBSD) |
| 5. カーネル内サーバ | — | TUX、khttpd |
## 重要な技術要素
- **[[epoll]]** — Linux 2.6 の推奨エッジトリガ poll 代替。Davide Libenzi が 2001 年提案。
- **[[kqueue]]** — FreeBSD/NetBSD 推奨。エッジ・レベル両対応。ファイル・シグナルも監視可能。
- **Flash Web Server** — mincore() で disk I/O を事前検知し、非同期ワーカーに委譲するハイブリッドアーキテクチャ(Pai et al. Usenix '99)。
- **NPTL** — Ulrich Drepper・Ingo Molnar による 1:1 スレッドライブラリ。10^6 スレッド達成。
- **[[nginx]]** — OS の最高効率イベント機構を自動選択する実用実装例として本記事に登場。
## 歴史的意義
この記事は「イベント駆動 vs スレッド」論争を整理し、[[epoll]]・[[kqueue]] の標準化を後押しした。現代の高並行サーバ(nginx、Node.js、Go の net ライブラリ等)の設計に直接影響している。[[インターネットスケールサービス設計]] が「運用フレンドリーな設計原則」を扱うのに対し、C10K問題は OS レベルの I/O メカニズム選択を扱う点で相補的である。
## 関連概念
- [[C10K問題]] — 問題の定義と背景
- [[epoll]] — Linux 向け解法
- [[kqueue]] — BSD 向け解法
- [[インターネットスケールサービス設計]] — 同時代の関連設計思想