apacheのmpm, プロセスとスレッド
apacheのmpmについて
もともとapacheについて理解を深めるためにサーバー作ってたので、apache見ないと意味が無い。 というわけでapacheがどうやって頑張るのかについて調べる。
モジュール一覧 ここを見る限り、とてもたくさんのmpmがあるみたいだが、会社で利用しているのはpreforkかworkerなので、これらについて見てみる
preforkはリクエストに対してプロセスをforkして対応するのに対して、workerはプロセスの中でスレッドを立ち上げてスレッドで対応するという感じ?(よくわかってないから対応するという曖昧な言葉を)
わかりやすい解説がここ(Apache マルチプロセッシングモジュール(MPM):Prefork と Worker の違い)にあった。
ここも参考になった。ApacheのMPMについて
で、それってどう違うのかっていう話で、まだよくわかってない。
プロセスよりはスレッドのほうが軽そうな印象はあるけど、スレッドだとスレッドセーフである必要があったりとか、スレッドのどれかに問題が発生した時プロセス全体(同一プロセスの他のスレッド?)が影響を受けたりとかあるようだ。
apacheとか抜きにしてシングルプロセス、シングルスレッド、マルチプロセスなどについてまとまった情報があったので参考にした。
Linuxネットワークプログラミング(シングルプロセス、シングルスレッドで多重化)
なるほど、Linuxネットワークプログラミングバイブルとか読めば知りたいことが色々と知れそうなので今度読む。
ただ、書いててやっぱり思うのはまずプロセスとスレッドの違いがわかってないよというところ。
プロセスとスレッド
大いに参考にさせて頂いた。
おかげさまでなんとなく理解できた気がする。
プロセスはプログラムを実行する独立した最小の単位みたいな感じ?実行に必要な資源だったり実行の状態を持っている。
スレッドはプロセスの中に複数存在できるもので、処理の最小単位という感じか。
ただ、軽量プロセスとか読んでるとプロセスとスレッドの違いがよくわからなくなってくる。1つのプロセッサでは1プロセスしか動かないので、スレッドを分けても複数プロセッサを活かせなかったらしい。そこで最近のカーネルでは、カーネルからはスレッドをプロセスとして扱えるようになっているらしい!つまり複数のコアで処理できると。
これのおかげでプロセスとスレッドの違いがだいぶわからなくなっている。
別にカーネルから見たらプロセスなだけで、こちらからみれば1プロセスの中の処理の単位がスレッドと考えれば良さそう。
参考にしたページも詳解Linuxカーネルを読んで書いてるから、詳しく知るにはそれ読むかなぁ。いやー、破産する。
まとめ
- apacheはいくつかの方法で大量のリクエストをさばく
- prefork
- workerなど
- mpmでどのモジュール使ってるかというのを見て、ディレクティブセットの設定見て、それの上限越えるような状況になればきっとapache死ぬんだろうな、と思うので調べてみる。
よくわからないまとめだ
本読もう