Posted at

Nginx Unit vs php-fpm をゆるーく速度比較してみた

More than 1 year has passed since last update.


はじめに

先ほど投稿したインストールの後、動作チェックもかねてphp-fpmとの動作状況の確認をしてみました。


設定

Rootディレクトリを用意して、とりあえずLaravelのインストール後のWelcome的な画面だけ用意しました。


Nginx unit

公式のMinimumConfigを踏襲。

なんかチューニング出来ないかと色々探すも。。。ないの。。。?

{

"listeners": {
"*:8300": {
"application": "blogs"
}
},
"applications": {
"blogs": {
"type": "php",
"workers": 20,
"root": "/www/blogs/scripts",
"index": "index.php"
}
}
}


php-fpm

childrenはunitに合わせて10にしておく。わりかし適当だけど、sockファイルを利用する。

IP利用にして同じ土俵で測るよりも、リアルにサービスで使う環境で比較したかったのです。

listen = /run/php-fpm/php-fpm.sock

pm = static
pm.max_children = 10
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 10
pm.max_requests = 500


走らせる

ApacheBenchでやります。

アクセスは宅内でL2スイッチ挟んだだけの環境。

# ab -n 10000 -c 10 http://192.168.0.128:81/


Nginx Unit

Concurrency Level:      10

Time taken for tests: 92.677 seconds
Complete requests: 10000
Requests per second: 107.90 [#/sec] (mean)
Time per request: 9.268 [ms] (mean, across all concurrent requests)


php-fpm

Concurrency Level:      10

Time taken for tests: 49.755 seconds
Complete requests: 10000
Requests per second: 200.99 [#/sec] (mean)
Time per request: 4.975 [ms] (mean, across all concurrent requests)


結果

うん。。。php-fpmのほうが倍くらいはやいね。。。

ちなみにNginxを通さずUnitへ直接リクエストしても同じくらいでした。


考察


Nginx Unit

CPUの利用状況を見るに、今回のテストではNginx UnitはWorkerへの振り分け規則が上手くなかったのか、効率的でなかった。

以下、Bench中のCPU

Tasks: 102 total,   4 running,  98 sleeping,   0 stopped,   0 zombie

%Cpu0 : 25.8 us, 16.7 sy, 0.0 ni, 51.3 id, 0.0 wa, 0.0 hi, 6.3 si, 0.0 st
%Cpu1 : 37.4 us, 16.0 sy, 0.0 ni, 40.3 id, 0.0 wa, 0.0 hi, 6.3 si, 0.0 st
KiB Mem : 1883484 total, 76940 free, 265784 used, 1540760 buff/cache
KiB Swap: 4194300 total, 4194252 free, 48 used. 697536 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21257 nobody 20 0 612204 86996 67548 R 99.7 4.6 1:34.39 unitd

WorkerProcessは10個存在するのに、同時に動いているのは1プロセスだけっぽい。

psで見た感じ、どこかのタイミングで処理を行うプロセス自体は微妙に切り替わっているっぽい?

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root 20350 0.0 0.0 16028 792 ? Ss 00:17 0:00 unit: main [/usr/sbin/unitd]
nobody 20352 0.0 0.0 26404 664 ? S 00:17 0:00 \_ unit: controller
nobody 20353 0.0 9.5 880712 180196 ? Sl 00:17 0:03 \_ unit: router
nobody 20367 1.3 8.0 567244 151040 ? S 00:18 0:51 \_ unit: "blogs" application
nobody 21215 2.6 5.4 522588 103460 ? S 00:59 0:35 \_ unit: "blogs" application
nobody 21253 4.3 6.3 534060 118920 ? S 01:01 0:52 \_ unit: "blogs" application
nobody 21254 0.6 2.7 467292 51320 ? S 01:01 0:08 \_ unit: "blogs" application
nobody 21255 1.9 4.0 489708 75712 ? S 01:01 0:23 \_ unit: "blogs" application
nobody 21256 4.1 8.0 567392 151608 ? S 01:01 0:50 \_ unit: "blogs" application
nobody 21257 7.8 10.7 622608 202692 ? S 01:01 1:35 \_ unit: "blogs" application
nobody 21258 0.4 2.5 467052 48520 ? S 01:01 0:05 \_ unit: "blogs" application

SourceのIPとかで振り分けたりしてるのかな?今度増やしてやってみる。

でもそうするとProxy噛ましてるときにちゃんと動くんだろうかという心配。

よく見るとメモリ効率も悪い気が。。。RSSちょっと大きすぎない?


php-fpm

全プロセス綺麗に動いてる感じ。言うことなし。

Tasks: 101 total,  12 running,  89 sleeping,   0 stopped,   0 zombie

%Cpu0 : 59.7 us, 39.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.7 si, 0.0 st
%Cpu1 : 67.3 us, 31.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 1.3 si, 0.0 st
KiB Mem : 1883484 total, 861048 free, 161476 used, 860960 buff/cache
KiB Swap: 4194300 total, 4194256 free, 44 used. 1397104 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21464 nginx 20 0 443940 14228 5856 R 21.0 0.8 0:00.80 php-fpm
21463 nginx 20 0 443940 14272 5872 R 20.7 0.8 0:01.27 php-fpm
21454 nginx 20 0 443948 16384 7884 R 20.3 0.9 0:05.34 php-fpm
21460 nginx 20 0 444012 14352 5876 R 20.3 0.8 0:02.66 php-fpm
21461 nginx 20 0 443940 14268 5868 R 20.0 0.8 0:02.20 php-fpm
21447 nginx 20 0 443940 14556 6124 S 19.7 0.8 0:05.38 php-fpm
21448 nginx 20 0 443940 14568 6132 R 19.0 0.8 0:05.21 php-fpm
21446 nginx 20 0 444000 16752 8240 R 18.7 0.9 0:05.50 php-fpm
21449 nginx 20 0 444012 16532 8052 R 18.3 0.9 0:05.26 php-fpm
21462 nginx 20 0 443940 14268 5868 R 18.0 0.8 0:01.78 php-fpm
21415 nginx 20 0 59956 6400 1028 R 2.3 0.3 0:00.57 nginx
3 root 20 0 0 0 0 S 1.0 0.0 0:01.89 ksoftirqd/0
21416 nginx 20 0 59956 6164 844 R 0.7 0.3 0:00.35 nginx

メモリの利用状況も激増する感じでもなく、安定したものでした。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root 21444 0.1 1.6 443488 31788 ? Ss 01:25 0:00 php-fpm: master process (/etc/php-fpm.conf)
nginx 21445 7.7 0.7 443940 14528 ? R 01:25 0:01 \_ php-fpm: pool www
nginx 21446 8.8 0.8 444000 16724 ? R 01:25 0:01 \_ php-fpm: pool www
nginx 21447 8.4 0.7 443940 14528 ? R 01:25 0:01 \_ php-fpm: pool www
nginx 21448 7.4 0.7 443940 14532 ? R 01:25 0:01 \_ php-fpm: pool www
nginx 21449 7.8 0.8 443928 16472 ? R 01:25 0:01 \_ php-fpm: pool www
nginx 21450 7.6 0.7 443940 14528 ? R 01:25 0:01 \_ php-fpm: pool www
nginx 21451 8.0 0.7 443940 14532 ? R 01:25 0:01 \_ php-fpm: pool www
nginx 21452 7.6 0.7 444012 14616 ? R 01:25 0:01 \_ php-fpm: pool www
nginx 21453 7.4 0.7 443940 14524 ? R 01:25 0:01 \_ php-fpm: pool www
nginx 21454 8.1 0.8 443948 16380 ? R 01:25 0:01 \_ php-fpm: pool www


おわりに

環境構築のついでにちょっと試したレベルの簡易レポートでした。

恐らく単一ホストからのアクセスじゃNginx Unitの全力は引き出せないっぽい。

複数ホストに分散してBenchかけたときにどうなるのか、暇があれば検証したい。

しかし一方で、仮説が正しければ内部ネットワークの特定サーバからAPI呼ばれる場合などは処理が分散しないってことであって、利用シーンは選ぶものになっている印象。

フロントとして不特定多数から大量にアクセスがあるときにはアリなのかも。

でも現状こんな感じならphp-fpmでいいかなって。。。

Nginx Unitは公式の薄いドキュメントをさらっと呼んだ程度なので、こうしたらもっと早くなるよ!とかあったら教えてください。

暇があったらソースも読みたいなーと思ってます。