実はここを理解すると、CPU・Linux・PHP-FPM・nginxが全部つながります。
結論から言うと、
WorkerがCPUに命令するわけではありません。
Linux(OS)がWorkerをCPUコアに割り当てています。
ここが重要です。
登場人物を整理する
まず、それぞれ何者なのか整理しましょう。
利用者
│
▼
nginx (プログラム)
│
▼
php-fpm (プログラム)
│
▼
PHP Worker (プロセス)
│
▼
Linuxカーネル(OS)
│
▼
CPU(Core)
それぞれ役割が違います。
CPUは何?
CPUは
計算しかできない部品
です。
CPUは
「次に何をすればいい?」
と待っています。
CPU自身は
- WordPress
- nginx
- PHP
を知りません。
ただ命令を実行するだけです。
PHP Workerとは?
PHP Workerは
Linux上で動いている1つのプログラム(プロセス)
です。
例えば
ps aux | grep php-fpm
すると
php-fpm
php-fpm
php-fpm
php-fpm
たくさん表示されます。
これ全部
Workerです。
Linuxは何をしている?
Linux(OS)が
Worker①
Worker②
Worker③
Worker④
を管理しています。
そしてCPUが空くと
Core1
↓
Worker①実行
少し経つと
Core1
↓
Worker②実行
というように
OSが切り替えています。
これを
スケジューリング
といいます。
WorkerがCPUを使うとは?
よく
WorkerがCPUを使う
と言いますが、
正確には
Linuxが
Workerを
CPUコアで
実行している
です。
イメージ
会社で例えると
CPU
↓
社員
Workerは
仕事
です。
OSは
課長
です。
課長が
社員A
↓
この仕事やって
と言います。
終わると
社員A
↓
次はこれ
と言います。
社員(CPU)は
ただ仕事をしています。
WordPressでは
アクセスが来ると
利用者
↓
nginx
nginxが
PHP必要!
と言います。
すると
php-fpmが
Worker⑦
お願い
と空いているWorkerを選びます。
Worker⑦は
Linuxに
PHPを実行したい
と言います。
Linuxは
Core2空いてる
↓
Worker⑦実行
と割り当てます。
Worker⑦は
WordPress読み込む
↓
SQL実行
↓
HTML生成
を行います。
終わると
Worker⑦
待機
に戻ります。
ここが一番重要
実は
Worker
↓
CPU
ではありません。
本当は
Worker
↓
Linux Scheduler
↓
CPU
です。
つまり
CPUを管理しているのはLinuxです。
だからCPU使用率100%とは?
例えば
CPU
4コア
あるとして
Workerが
100個
いても
Linuxは
Core1
Worker12
Core2
Worker43
Core3
Worker8
Core4
Worker91
しか同時に動かせません(細かくは時間を細切れに切り替えながら実行します)。
残りは
順番待ち
になります。
だから
CPU100%
とは
CPUコアが実行したいWorkerで埋まっている状態
ということです。
次に理解すると一気につながること
このあと学ぶなら、次は
- Linuxのプロセスとスレッドの違い
- CPUスケジューラがどうWorkerを切り替えているか
- nginx WorkerとPHP-FPM Workerは何が違うのか
この3つです。
ここまで理解できると、「CPU使用率100%」「Load Averageが高い」「PHP-FPMのpm.max_childrenを増やすべきか」といった判断の理由まで見えるようになります。