最小の Owin アプリケーションを Heroku にデプロイしてベンチマーク計測してみた

はじめに

heroku-buildback-mono を使えば C# で書いた WEB アプリを Heroku で動かすことができる。 ランタイムは .NET Framework じゃなくて Mono だけど。

Heroku + Mono のパフォーマンスが知りたくなったので 最小の Owin アプリケーションをデプロイして計測することにした。

コンソールアプリケーションのプロジェクトを作成

セルフホストなのでコンソールアプリケーションのプロジェクトを作成する。

NuGet パッケージを追加

NuGet パッケージマネージャーで

を追加。

Visual Studio の場合は、NuGet Package の復元を有効化しておく。 MonoDevelop(Xamarin Studio) の場合は不要だった。

最小の Owin アプリケーションを作成

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using Owin;
using Microsoft.Owin.Hosting;
using Microsoft.Owin.Host.HttpListener;

namespace OwinSample
{
  using AppFunc = Func<IDictionary<string, object>, Task>;

  public class SampleApp
  {
    public SampleApp(AppFunc next)
    {
    }

    public Task Invoke(IDictionary<string, object> environment)
    {
      var stream = (Stream)environment["owin.ResponseBody"];
      using (var writer = new StreamWriter (stream))
      {
        return writer.WriteAsync ("Hello World");
      }
    }
  }

  public class Startup
  {
    public void Configuration(IAppBuilder app)
    {
      app.Use(typeof(SampleApp));
    }
  }

  class MainClass
  {
    private static readonly ManualResetEvent _quitEvent = new ManualResetEvent(false);

    public static void Main (string[] args)
    {
      var port = 5000;
      if (0 < args.Length)
      {
        int.TryParse (args [0], out port);
      }

      Console.CancelKeyPress += (sender, e) =>
      {
        _quitEvent.Set();
        e.Cancel = true;
      };

      using (WebApp.Start<Startup>(string.Format("http://*:{0}", port)))
      {
        Console.WriteLine("Started");
        _quitEvent.WaitOne();
      }
    }
  }
}

Procfile を作成

Procfile には、コンソールアプリケーションを実行するコマンドを記述する。

web: mono OwinSample.exe $PORT

ビルドするとプロジェクトルートに exe が出力されるので、mono コマンドでそいつを起動している。

Heroku にデプロイ

Heroku のユーザー登録と SSH キー登録は済んでいる前提。

$ heroku create <your-app-name>
$ heroku config:add BUILDPACK_URL=https://github.com/friism/heroku-buildpack-mono
$ git push heroku master

を実行し、 Mono のビルドパックを使うようにしておく。

デプロイに成功したら Webブラウザでアクセスしてみる。

f:id:griefworker:20141231143512p:plain

Apatch Bench でベンチマーク計測

Ruby スタックと比較したいので、同じ合計リクエスト発行数と同時接続数で計測した。

合計リクエスト発行数&同時接続数 Requests per second[#/sec] Time per request(mean, across all concurrent requests)[ms]
-n 100 -c 100 29.40 34.015
-n 1000 -c 100 55.60 17.985
-n 1000 -c 1000 42.18 23.710
-n 3000 -c 1000 47.78 20.930
-n 2500 -c 2500 39.52 25.305
-n 3000 -c 2500 43.83 22.815

Mono スタックよりも Ruby スタックの方が性能が良かった。 今回の計測では、ともにアプリケーションサーバーを使っていないから、参考にしかならないけど。

最小のRackアプリケーションをHerokuにデプロイしてベンチマークを計測してみた

Heroku の Ruby スタックの性能が知りたかったので、 下記ような最小の Rack アプリケーションを Heroku にデプロイし、 Apatch Bentch でベンチマークを計測してみた。 Rack アプリケーションは unicorn とか使わず rackup コマンドで動かしている。

require "rack"

class SampleApp
  def call(env)
    [200, { "Content-Type" => "text/html" }, ["Hello World"]]
  end
end

run SampleApp.new

計測結果は下表の通り。すべてのリクエストが成功したものだけを載せている。

合計リクエスト発行数&同時接続数 Requests per second[#/sec] Time per request(mean, across all concurrent requests)[ms]
-n 100 -c 100 33.51 29.838
-n 1000 -c 100 57.03 17.536
-n 1000 -c 1000 36.64 27.924
-n 3000 -c 1000 45.05 22.199
-n 2500 -c 2500 41.33 24.193
-n 3000 -c 2500 45.79 21.838

同時接続数は 2500、合計リクエスト数 3000 あたりが上限だった。

2015 年の抱負

毎年恒例、最初のエントリでは今年の抱負を書くことにする。

2015 年の抱負は『最適化』。

プライベートで使える時間が減ることが確定しているので、 ダラダラとテレビやネットを見るのを止めて、 プライベートプロジェクトを進める時間を捻出したい。 情報収集は電車の中や休憩中といった隙間時間でやるようにし、 限られた時間を有効に使えるように自分を最適化していく。

あと、2014 年にリリースできなかった iOS アプリと Web サービスは必ずリリースする。 特に Web サービスは関わっているのが自分だけではないので悠長にしていられない。 iOS アプリはいい加減完成させないと、普段の情報収集が不便で仕方ない。

さらに、今年は原点回帰で.NET、特に ASP.NET に力を入れようと思っている。 ここ数年、プライベートでは Ruby(Rails) や iOS といった、WEB とモバイル寄りの技術ばかり触ってきたけど、 .NET Core のオープンソース化と .NET Server Framework の発表は、 プライベートでもコミットしたいと思い直すほどの衝撃ニュースだった。 今年のエントリは .NET ネタが増えると思う。

2014 年ふりかえり

おそらく 2014 年最後のエントリになるだろうから、 この一年を振り返ってみる。

年始に掲げた今年の目標は 「アプリまたはWebサービスをリリースしまくる」 だったけど、 結果は iOS アプリの Bitissues を RubyMotion と Swift で2回作り直しただけ、という惨状。 無理やり評価するとしたら、新しいプログラミング言語に挑戦したことしか良いところがない。

11月から年末にかけて作っていた iOS アプリは、70% ほど実装したところで止まってしまった。 これから先は、デザインとか使い心地といった、細かな部分なので時間かかりそうだ。 自分が使いたくて作っているアプリだから必ず完成させる。

プライベートプロジェクトで関わっているWeb サービスは、結局年内にリリースできなかった。 こちらは実装ほとんど終わっている。いや、PayPal 使った課金まわりが残ってるか。 残るタスクは主にドキュメント。サービスの性質上、ドキュメントは必須なので・・・。 そろそろリリースしたい。

あちらこちらに手を出して、どれも中途半端になってしまった。 自己採点するなら 50 点。つまり不可。 来年こそはがんばりましょう、ってところだな。

BISTRO NEW PORT

久しぶりに、けやき通りにある『ビストロニューポート』に行ってみた。 6年ぶりくらいかも。かなりご無沙汰だったな。

f:id:griefworker:20141224184253j:plain

久しぶりすぎて、メニューが変わったのかどうかも分からない。

f:id:griefworker:20141224184739j:plain

ドリンクを1杯必ず注文しないといけないみたいなので、 『ファジーネーブル』を選んでみた。甘いので酒が苦手な自分でも飲みやすい。

f:id:griefworker:20141224185139j:plain

まず最初に注文した料理は『かぼちゃのニョッキクリーム 煮』。 ニョッキ自身の味もさることながら、ソースが絶品。 1・2位を争う人気メニューというのも納得の旨さ。

f:id:griefworker:20141224192151j:plain

ニョッキはソースが多めで余るので、パンを一緒に注文するのは必須。 『ガーリックトースト』はソースをつけるの躊躇するくらい、そのまま食べても旨い。

f:id:griefworker:20141224192209j:plain

行ったのはちょうどクリスマスシーズンだったので、クリスマスっぽいメニューをと思って、 チキンも注文。黒板に書いてあるおすすめメニューなんだけど名前忘れてしまった。 皮がパリパリで香ばしい。肉汁も凄い。

f:id:griefworker:20141224192730j:plain

野菜も食べないとバランス悪いから、バーニャカウダを注文。

f:id:griefworker:20141224193532j:plain

〆に『卵がひらくオムライス』。 刻んだ野菜の食感が良い。デミグラスソースがほんのりビターで大人の味。 この店のオムライスが一番好きだな。

f:id:griefworker:20141224195240j:plain

6年ぶりくらいにニューポート行ったけど、やっぱりどれも旨かった。 思い出が美化されていたんじゃなくて良かった。

関連ランキング:洋食 | 赤坂駅薬院大通駅桜坂駅

げんこつ

福岡市内のラーメンランキングでじわじわと順位を上げ、 最近1位に躍り出た『博多ラーメン げんこつ』。 用事で近くまでいったので、せっかくだし、お昼を食べに寄ってみた。

f:id:griefworker:20141221120430j:plain

メニューは、ラーメンだけでなく、餃子やから揚げといったサイドメニューも多い。 がっつり食べたい気分だったので、ラーメンとチャーハンのセットを注文。 麺を無料で増量できるみたいなんだけど、気付いたのが注文した後で遅かった。残念。

f:id:griefworker:20141221120948j:plain

ラーメン屋のチャーハン。 こいつはハズレが無いし外せない鉄板でしょ。

f:id:griefworker:20141221121041j:plain

ラーメンは、非常にクリーミーとしか表現しようがない、まろやかな豚骨スープ。 これほどクリーミーなスープはお目にかかったことが無い。 中細麺との絡みも上々で、麺を増量しておけばよかった。

f:id:griefworker:20141221121335j:plain

福岡市郊外にあるから、車を持っていない自分にとって行くハードルが高いけど、 期待通りの味で旨かった。

関連ランキング:ラーメン | 野芥駅賀茂駅

洋食ワイン ヴァン

うにクリームパスタが食べたくて、福岡市内で評判が良さそうな店を探して見つけたのが、 けやき通りにあるイタリアンの店『VIN』。

f:id:griefworker:20141220113357j:plain

開店して直ぐに行ったから座れたけど、席数少ないから予約したほうがよかったかも。 事実、半分くらいは予約席だった。

席に着いたら、早速うにクリームパスタのセット (1300 円)を注文。

するとまずは前菜が出てきた。 鴨は臭みがまったく無くて、柔らかくて旨かった。 にんじんはアンチョビソースがこれまた旨い。 パンにのっているのは豚肉のパテ。

f:id:griefworker:20141220114552j:plain

お次に出てきたのはサラダ。 自家製クルトンがカリカリで好み。 オリーブがほんのり苦くて良いアクセントになっていると思う。

f:id:griefworker:20141220114719j:plain

そして待望のうにクリームパスタ。 第一印象は「うにでかい」だった。 磯の風味とソースの甘さが絶妙。 うにクリームに海苔これほど合うとは思ってなかったけど、 よく考えたら合わないはずがないな。 真似したい。

f:id:griefworker:20141220120006j:plain

デザートは葡萄のジェラートとマドレーヌ。

f:id:griefworker:20141220120917j:plain

アフターのドリンクはブレンドコーヒーを選択。 この日も凄く寒かったんで温まるわぁ。

f:id:griefworker:20141220120923j:plain

パスタにサラダとドリンクだけでなく、前菜とデザートまで付いて 1300 円というのは かなりリーズナブル。 今まで食べたうにクリームパスタの中では一番旨かった。 うにクリームパスタが食べたくなったら、この店が筆頭候補だな。 大満足。

関連ランキング:ビストロ | 赤坂駅桜坂駅薬院大通駅