MS 謹製 RedisSessionStateProvider のバージョンが 1.0.0 になってたのでパフォーマンスを計測してみた
ASP.NET のセッションは色々なデータストアに格納できるのですが、MS 公式で Redis に格納できる Microsoft.Web.RedisSessionStateProvider というセッションプロバイダがあります。
で、こいつのバージョンがつい先日ひっそりと 1.0.0 になっていたので*1、そのパフォーマンスを見てみました。
比較対象
ただ計るだけじゃ面白くないので比較もしてみます。
比較対象は以下です。
- RedisSessionProvider
- Session State Service
- Azure SQL Database(ASP.NET Universal Providers)
Redis 用のセッションプロバイダというと、他に Harbour.RedisSessionStateStore と AL-Redis があるんですが、前者はどうしても動かなくて(こんな時間になったのはこいつのせいだ!)、後者は NuGet パッケージがなくて面倒なので今回はパス。
計測条件
計測にあたっての条件は以下の通りです。
- Web サイト
- ローカルに立てた認証なしの MVC サイト
- /Home/Index に
Session["DateTime.Now"] = DateTime.Now.ToString();
というコードを挿入
- Redis
- Azure Redis Cache の S Standard(1GB のやつ)
- Sesstion State Service
- ローカルの State Service
- SQL Database
- Azure SQL Database の S0 Standard
- ベンチツール
- apache bench 10000 リクエスト 100 並列 を 3 回
- Request per second で比較
計測結果
Microsoft.Web.RedisSessionStateProvider
Requests per second は 2268.98, 2144.88, 2106.48 の平均 2173.45。
RedisSessionProvider
Requests per second は 2247.07, 2324.91, 2355.02 の平均 2309.00。
Session State Service
Requests per second は 2225.07, 2238.02, 2196.72 の平均 2219.94。
Azure SQL Database(ASP.NET Universal Providers)
Requests per second は 39.38, 40.57 の平均 39.98。
遅すぎて 3 回もやれなかった、、、あまりに遅すぎるんですがなんでですかね。何か設定を間違ってる気がする。。。
まとめ
僅差なんでグラフにしてもあんま意味ないんですが一応。
Microsoft.Web.RedisSessionStateProvider、十分速いですねー。State Server とあまり変わらないです。
まぁ Redis が凄いだけじゃね?って気もしますが、昔自分でセッションプロバイダ作ったときは散々だったのでライブラリの実装にも多少は依存するよってことで。
というかぱっと見 RedisSessionProvider が一番速いんで、じゃあそれ使えば良くね?ってなりそうなところですが、排他制御してないので多分そのおかげだと思います。Microsoft.Web.RedisSessionStateProvider が排他制御してるかどうかは分かりませんが。MSDN にもしろって書いてあるしやってるんじゃないですかね多分(適当
ただ、注意点というか計測してて思ったのが、Microsoft.Web.RedisSessionStateProvider はあんまりパフォーマンスが安定しないです。
今回、何度か事前に回して暖めてから計測してるんですが、それが結構遅くて。Redis Cache の問題かな?とも思ったんですが、RedisSessionProvider はそこそこ安定してたのでそこまで関係はなさそう。プロダクション環境で使うなら長期間の負荷試験は行いたいところですね。
ちなみに完全に余談なんですが、今回私の方では計測してない MongoDB のパフォーマンスを 竹原さん が試されています。(今回の検証の参考にさせていただきました。ありがとうございます。)
MongoDBにASP.NETのSessionを格納する - 完結編 - お楽しみはこれからだ!
こちらによると、竹原さんカスタマイズの MongoDB-ASP.NET-Session-State-Store が State Service と概ね同じくらいです。State Service が私の結果とかなり差がありますが、ローカルマシンのパフォーマンスですかね?まぁまぁ今回検証したライブラリ等とほぼ同等と考えていいんじゃないかなと思います。MongoDB もすごいなー。可用性重視なら Redis より良さげかもしれません(Redis の可用性も大概ですが)。
SQL Database はなんかもう色々残念すぎる。
*1:アナウンスが見つからないんですが出してないんですかね?何が変わったんだろ。