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

# はじめに

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

# 設定

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

## Nginx unit

[公式のMinimumConfig](http://unit.nginx.org/docs-configuration.html#minimum-configuration)を踏襲。
なんかチューニング出来ないかと色々探すも。。。ないの。。。？

```
{
     "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は公式の薄いドキュメントをさらっと呼んだ程度なので、こうしたらもっと早くなるよ！とかあったら教えてください。
暇があったらソースも読みたいなーと思ってます。