【勉強メモ】C10K問題【マルチプロセス・マルチスレッド】

はじめに

この記事は自分の勉強のメモとして残します。

C10K問題とは

C10K問題(英語: C10K problem)とは、Apache HTTP ServerなどのWebサーバソフトウェアとクライアントの通信において、クライアントが約1万台に達すると、Webサーバーのハードウェア性能に余裕があるにも関わらず、レスポンス性能が大きく下がる問題である。
ja.wikipedia.org

原因

  • プロセス数の上限に達する

Apacheは一つのリクエストに1つのプロセスを対応させる。32bit Linuxではプロセス数は32767が上限であるため、それ以上のリクエストが受け付けられなくなる。

コンテキストスイッチとは1つのCPUが複数のプロセスを並行処理するために、それまでの処理の内容を保存し、
新しい処理の内容を復元すること。1リクエスト1プロセス方式では、リクエストが増えるとプロセスも増えるため、
コンテキストスイッチのコストが無視できなくなる。

上の二つの問題はシングルプロセス・マルチスレッドにすればかなり軽減されるらしいが、それでも以下のような問題が残る。
(※プロセスのコンテキストスイッチはメモリ空間の切り替えを行わなければならないためコストが高い。一方マルチスレッドだとメモリ空間は共有しているため、メモリ空間切り替えの必要がない。)

1プロセス当たりのファイルディスクリプタの上限は基本的には1024となっていて、マルチスレッドでリクエストごとに例えばDBサーバに接続することとなると、その分だけファイルディスクリプタを消費してしまう。

解決策【Nginx】

Nginxとは従来のWebサーバのようなマルチプロセスやマルチスレッドでリクエストに対応する手法ではなく、一つのプロセスで複数のリクエストを1スレッドで処理する手法を採用している。(実際にはコアの数程度のプロセスを生成するマルチプロセスではあるようだ。)
また何かしらのイベントが発生するまで待機し、発生したイベントによって処理を行うイベント駆動という手法や、リクエストを順番通りではなく効率的に行う非同期処理という手法も採用している。

イベント駆動についてはこれがわかりやすかった。
https://openstandia.jp/pdf/140228_osc_seminar_ssof8.pdf