athome-developer’s blog

不動産情報サービスのアットホームの開発者が発信するブログ

ASP.NET Coreのパフォーマンス検証

こんにちは! 情報システム部の高野です。
前回、予告した通りASP.NET Coreのパフォーマンス検証をしました。
dblog.athome.co.jp

検証環境
  1. IISにAspNetCoreModuleを使ってホスト
  2. IISからKestrelへリバースプロキシ
  3. WindowsのNginxからKestrelへリバースプロキシ
  4. 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

まとめ

この結果だけを見るとASP.NET Coreを動かすのは
ちゃんとサービス化して動かした方が良いってことですね。
まあ上でも書いた通りWindowsでサービス化するのはちょっと面倒なので
IISにAspNetCoreModuleを入れてホストするか
Linuxでリバースプロキシするのが良さそうです。

今回は、文字列を返すだけのAPIで検証してみたのですが
今度は普通にありそうなユースケースで検証してみたいと思います。

*1:上記は、dotnet run -c Release で起動した結果ですがpublishしてから dotnet sample.dllで起動しても同様の結果になりました。