Azure WebAppsのパフォーマンステスト

今んとこの気持ち
-------------

IOがとりあえずダメっぽい。
ログファイルへの出力を全くしないようにしたら若干改善したけど、どうやってログ取るのっていう問題が当然出てきて未解決です。

前段
----

AzureのWebAppsでアプリケーションを構築しているところですが、なんだか微妙に遅くて困っています。
構成としてはWebApps(PHP)+SQL Serverです。SQL Serverがマネージドサービスだったので…。
基本的なところは既に動いています。
しかし体感的な話になり申し訳ないところですが、レスポンスタイムが想定より遅く、安定しません。

とりあえず色々計ってみています。いろんな理由で検証環境とかプランがブレるのはご容赦ください…。

おおまかなベンチマーク
-----------------

[php-framework-benchmark](https://github.com/kenjis/php-framework-benchmark)というものがあります。

PHPの各フレームワークのHello worldにabでアクセス、スループットを集計するというベンチマークです。フレームワークの超基本的なスループットを比べるためのものですが、とりあえず目についたので実行してみました。

結果が雑ですが……、まずAzure。

### Azure (P1)

|framework          |requests per second|relative|peak memory|relative|
|-------------------|------------------:|-------:|----------:|-------:|
|fuel-2.0-dev       |               0.09|     1.0|       0.87|     1.0|
|laravel-5.1        |               0.23|     2.6|       1.63|     1.9|
|fuel-2.0-dev       |              10.35|     1.0|       0.87|     1.0|
|laravel-5.1        |              15.73|     1.5|       1.63|     1.9|
|fuel-2.0-dev       |               3.77|     2.7|       0.87|     1.0|
|laravel-5.1        |               1.40|     1.0|       1.62|     1.9|
|fuel-2.0-dev       |              10.72|     0.0|       0.87|     1.0|
|laravel-5.1        |               0.00|     0.0|       1.63|     1.9|
|fuel-2.0-dev       |              10.00|     1.6|       0.87|     1.0|
|laravel-5.1        |               6.40|     1.0|       1.63|     1.9|
|fuel-2.0-dev       |              10.88|     1.0|       0.87|     1.0|
|laravel-5.1        |              17.57|     1.6|       1.63|     1.9|
|fuel-2.0-dev       |               9.62|     1.0|       0.87|     1.0|
|laravel-5.1        |              29.46|     3.1|       1.63|     1.9|
|fuel-2.0-dev       |              10.61|     1.0|       0.87|     1.0|
|laravel-5.1        |              11.64|     1.1|       1.62|     1.9|
|fuel-2.0-dev       |              11.33|     1.0|       0.87|     1.0|
|laravel-5.1        |              38.12|     3.4|       1.63|     1.9|
|fuel-2.0-dev       |               9.61|     1.0|       0.87|     1.0|
|laravel-5.1        |              40.25|     4.2|       1.63|     1.9|

インスタンスはP1を1台。ロジックが入ってないとはいえ瞬間最大40req/sが出たのは意外でしたが、結果のばらつきがとても大きい。途中で全部タイムアウトしたりします。

タイムアウトの回数も数えるべきだった（TODO）

次、自前のMBP。

### MBP (Core-i5 8GB SSD256GB)

|framework          |requests per second|relative|peak memory|relative|
|-------------------|------------------:|-------:|----------:|-------:|
|fuel-2.0-dev       |              34.99|     1.7|       0.00|     nan|
|laravel-5.1        |              21.04|     1.0|       0.00|     nan|
|fuel-2.0-dev       |              32.83|     1.6|       0.00|     nan|
|laravel-5.1        |              20.86|     1.0|       0.00|     nan|
|fuel-2.0-dev       |              35.09|     1.6|       0.00|     nan|
|laravel-5.1        |              21.51|     1.0|       0.00|     nan|
|fuel-2.0-dev       |              35.10|     1.6|       0.00|     nan|
|laravel-5.1        |              21.46|     1.0|       0.00|     nan|
|fuel-2.0-dev       |              36.61|     1.7|       0.00|     nan|
|laravel-5.1        |              20.96|     1.0|       0.00|     nan|
|fuel-2.0-dev       |              35.91|     1.7|       0.00|     nan|
|laravel-5.1        |              21.62|     1.0|       0.00|     nan|
|fuel-2.0-dev       |              36.69|     1.7|       0.00|     nan|
|laravel-5.1        |              21.32|     1.0|       0.00|     nan|
|fuel-2.0-dev       |              37.32|     1.8|       0.00|     nan|
|laravel-5.1        |              21.09|     1.0|       0.00|     nan|
|fuel-2.0-dev       |              32.64|     1.5|       0.00|     nan|
|laravel-5.1        |              21.75|     1.0|       0.00|     nan|
|fuel-2.0-dev       |              32.72|     1.5|       0.00|     nan|
|laravel-5.1        |              21.92|     1.0|       0.00|     nan|

ビルトインサーバですが安定。タイムアウトもなし。メモリが取れてないのは何か拡張が足りないからっぽい。

次、Windowsが怪しいのかと思い、Windows機がないのでさくらで借りました。ディスクは早いが他は貧弱。

### さくらのVPS for Windows(最安プラン 1core 768MB SSD30G)

|framework          |requests per second|relative|peak memory|relative|
|-------------------|------------------:|-------:|----------:|-------:|
|fuel-2.0-dev       |              13.67|     1.0|       0.00|     0.0|
|laravel-5.1        |              14.37|     1.1|       6.62|     0.0|
|fuel-2.0-dev       |              15.51|     1.0|       0.00|     0.0|
|laravel-5.1        |              14.92|     1.0|       6.62|     0.0|
|fuel-2.0-dev       |              15.51|     1.0|       0.00|     0.0|
|laravel-5.1        |              15.00|     1.0|       6.62|     0.0|
|fuel-2.0-dev       |              15.33|     1.0|       0.00|     0.0|
|laravel-5.1        |              15.67|     1.0|       6.62|     0.0|
|fuel-2.0-dev       |              15.75|     1.0|       0.00|     0.0|
|laravel-5.1        |              15.59|     1.0|       6.62|     0.0|
|fuel-2.0-dev       |              15.75|     1.0|       0.00|     0.0|
|laravel-5.1        |              15.84|     1.0|       6.62|     0.0|
|fuel-2.0-dev       |              15.92|     1.0|       0.00|     0.0|
|laravel-5.1        |              15.51|     1.0|       6.62|     0.0|
|fuel-2.0-dev       |              15.92|     1.0|       0.00|     0.0|
|laravel-5.1        |              15.59|     1.0|       6.62|     0.0|
|fuel-2.0-dev       |              15.75|     1.1|       0.00|     0.0|
|laravel-5.1        |              14.59|     1.0|       6.62|     0.0|
|fuel-2.0-dev       |              16.00|     1.0|       0.00|     0.0|
|laravel-5.1        |              15.43|     1.0|       6.62|     0.0|

ビルトインサーバかつスペックが貧弱ですが、ほぼほぼ安定。

AzureのWebAppsは、実際はIIS+php-fpmという構成です。IISと相性が悪いのかも？（TODO）あとFastCGIのキューに限度があり、50-100を超えると一律エラーになるようなので、そこも考慮しないといけない気がします（TODO）


ネットワーク
---------

pingが通らないので、[curlで計測](http://please-sleep.cou929.nu/curl-write-out-option.html)する。静的ファイルを取得するレスポンスタイムを計ってみます。
AzureはS2、とあるIaaS（CentOS）です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37937/ab389f34-dfc8-8d0b-eae9-07f8ca2114f0.png)

100回測った時のヒストグラムです。

横軸がレスポンスタイム、縦軸はそのレスポンスタイムの回数なので、Azureのほうが良好ですし、バラつきも少ないです。

ネットワークまわりが原因である可能性は低そうです。

IO
--

Azure WebAppsはディスク付きのIaaSです。インスタンスが複数になっても大丈夫なように、ディスク（Dドライブ）が共有されています。
噂によるとSMB共有だそうです。それは遅いのでは…ということで測りました。

[超簡素なベンチマーク](https://gist.github.com/kuwa72/a69b0d1807727ff7eeb6)です。

### MBP

![image](https://qiita-image-store.s3.amazonaws.com/0/37937/1c6dbd97-990f-c4c5-7951-e418064317be.png)

安定。

### Windowsノート

![image](https://qiita-image-store.s3.amazonaws.com/0/37937/2eb405cd-0c55-6cab-b5e1-8d3b184c6379.png)

2.5インチHDDの割に健闘していると思います。

### さくらのVPS for Windows

![image](https://qiita-image-store.s3.amazonaws.com/0/37937/6be0732b-acde-913b-6307-7b51befd9beb.png)

RWの点がバラけ気味ですが、SSD速い。

### Azure WebApps（P1）

![image](https://qiita-image-store.s3.amazonaws.com/0/37937/d7a0ba83-b391-80ff-a807-0f53c48ac489.png)

遅い…。数十バイトのファイルの書き込みに6秒、読み込みが5秒、削除が12秒だとさすがにどうしようもないのでは…。

継続中…。