こんにちは! 情報システム部の高野です。
前回、予告した通りASP.NET Coreのパフォーマンス検証をしました。
dblog.athome.co.jp
検証環境
- IISにAspNetCoreModuleを使ってホスト
- IISからKestrelへリバースプロキシ
- WindowsのNginxからKestrelへリバースプロキシ
- CentOSのNginxからKestrelへリバースプロキシ
の4種類です。
OSは、
Windows 2016 server
CentOS7.2
です。
.NET Coreのバージョンは1.0.1です。
チューニングは基本的になにもせずデフォルト値でなにが速いのかを検証します。
リバースプロキシしている3つは、Webサーバとアプリケーションは同サーバで実行しています。
CentOSの方は、Kestrelもサービス化して常駐するようにしました。
Windowsのリバースプロキシしている方は、サービス化がちょっと面倒だったので
コンソールから起動している状態です。
負荷
tsungというツールで1秒ごとに100ユーザずつ増やしながら
1ユーザが10リクエストするようにして1分間流します。
検証項目
tsungの結果とASP.NET Core、各Webサーバのログから出しています。
ASP.NET Coreのログは、NLogを使い
Asyncにしてバッファリングもしてログの書き出しがパフォーマンスになるべく影響のないようにしてあります。
検証するプログラムは、下記のただ文字列を返すだけのものです。
public class PerfTestController : Controller { public string Greeting() { return "Hello World!"; } }
結果
各ログの平均値
tsung | Webログ | APログ | |
01.IISホスト | 1.81 ms | 1ms | 0.14ms |
02.IISリバプロ | 5,310ms | 5,260ms | 1.54ms |
03.Win+Nginx | 530ms | 832ms | 1.63ms |
04.CentOS+Nginx | 1.90ms | 0.74ms | 0.09ms |
Windowsでのリバースプロキシが間違ってるんじゃないってくらい遅いです。
特にWindowsのNginxの方は、Webサーバのログの方がtsungより大きくなっているので
明らかにおかしいのですが、何回やってもこのような結果になりました。
Webサーバのログを見てもIISにホストした場合やCentOS+Nginxに比べて
1秒間に半分ほどしかリクエストを捌けてません。
なんで同じようにリバースプロキシしているのにWindowsの方が圧倒的に遅いのか
納得いかなかったので
CentOSの方もサービス化せずにコンソールで起動して検証をしてみました。
tsung | Webログ | APログ | |
CentOS+Nginx | 11,1640ms | 5,572ms | 757ms |
やっぱりコンソールで起動するとかなり遅くなりました。*1