2013年8月アーカイブ

Starlet が HTTP/1.1 に対応しました。これによりでnginxのupstream keepaliveなどが捗ると思われます

https://metacpan.org/release/Starlet
https://github.com/kazuho/Starlet

ながらくStarletはHTTP/1.0 + keepaliveなサーバでしたが、version 0.20にてHTTP/1.1に対応しました。具体的に対応したスペックは以下。

  • HTTP/1.1 keepalive
  • Transfer-Encoding: chunked (Request & Response)
  • Expect
  • HTTP Pipelining

StarmanMonocerosとだいたい同じ動きをするようになっていると思われます。

なお、導入にあたっては、リバースプロキシ等と組み合わせた場合の動作パターンが変わる場合があるので、確認してからの本番投入をお願いします。問題等があればgithubのissueでお知らせください

ベンチマーク

これでStarman、Starlet、MonocerosがHTTP/1.1に対応したのでweighttpwrkなどHTTP/1.1対応のベンチマークツールを使ってベンチマーク・比較が出来ます。そこで今回はwrkを試してみました

今回ベンチマークに使った各ソフトウェアのバージョンは以下になります

You have Starman (0.4006)
You have Starlet (0.20)
You have Monoceros (0.19)
You have EV (4.15)
You have Guard (1.022)
You have Plack (1.0029)
You have HTTP::Parser::XS (0.16)

サーバは以前と同じXeon L5630 2.13GHz 4コア/8スレッド を2つ積んだサーバ。

それぞれ以下のオプションで起動します。MonocerosとStarmanは1接続あたりのKeepAliveリクエスト数の上限設定がありません。

[Starman] plackup -s Starman -E produnction --workers=16 --max-requests 10000  -a app.psgi
[Starlet] plackup -s Starlet -E produnction --max-workers 16 --max-keepalive-reqs 10000 --max-reqs-per-child 10000  -a app.psgi
[Monoceros] plackup -s Monoceros -E produnction --max-workers 16 --max-reqs-per-child 10000 --max-readahead-reqs 500 -a app.psgi

もうひとつ、”OK”を返すベンチマークもしました

[Starman] plackup -s Starman -E produnction --workers=16 --max-requests 10000 -e 'sub{[200,[],["OK"]]}'

Starlet、Monocerosもapp.psgiのみ変更

app.psgiの中身は

use Plack::Builder;
use Plack::Request;
my $length = 12;
my $body = 'x'x$length;
builder {
    enable 'AccessLog', logger => sub { };
    sub {
        my $env = shift;
        my $req = Plack::Request->new($env);
        my @params = $req->param('foo');   
        [200, ['Content-Type'=>'text/plain'],[$body]]
    }
};

となっています。

ベンチマークに使った wrk のオプションは

$ wrk -c 15 -t 5 -d 10 'http://x.x.x.x:5000/foo?foo=bar&bar=baz&baz=hoge&hoge=foo'

です。5スレッド起動し、合計15接続で10秒間リクエストを送信します。keepaliveは有効です。

ベンチマーク結果とYAPC::Asiaのトーク宣伝

さて。結果

starlet020.png

Starletがかなり良い数字となりました。”OK”を返すだけのベンチマークではStarmanの2倍程度、app.psgiでも差が出ていますね。

このあたりのなぜStarletが速いのか、Starmanとどこか違うのかについてはYAPC::Asia 2013 Tokyo の僕のセッションで触れようと思うので興味がある方もない方もぜひ聞きに来てくださいませ!

YAPC::Asia Tokyo 2013 にて「PSGI/Plack・Monocerosで学ぶハイパフォーマンスWebアプリケーションサーバの作り方」というはなしをします。

トークの内容は

先日、MonocerosというPlack::Handler(サーバ)をリリースしました。MonocerosはStarmanやStarletと同じくPrefork型ですが、AnyEventを使い、C10Kのような多数のコネクションを捌くことができる特徴を持ち、非常に高いパフォーマンスを備えています。

このセッションではStarmanやStarlet、Twiggyといった各Plack::Handlerの内部構成の簡単な紹介、Monocerosを実装する上で学んだPlack::Handlerの構成や作成方法から、forkやUNIXプロセス、Linux TCPの話を交えて、高性能なWebアプリケーションサーバの作り方について紹介します。

今では当たり前となったPlack/PSGI対応Webアプリケーションですが、どのPlack::Handlerを使うべきなのか、なかなか自信をもって選ぶことができていないのではないでしょうか。本セッションはそんな方の助けとなることを目指しています。

Starman、Starlet、Monocerosや他のPlack::Handlerのやや低レイヤーでの比較や、TCP/IP周りでの最適化の話と、それぞれの特徴やベンチマークやPlack::Handlerを選ぶコツなどを喋る予定です。

YAPC::Asia Tokyo 2013 のチケットの販売は8/11で締め切りです。学生は無料です。ぜひ来てくださいませ!

秋に第三回が開催されるISUCONですが、学生さん限定で「ISUCON 夏期講習」が開催されました。イベントは、tagomorisからWebアプリケーションについての座学を行ったあとに、ISUCON2の問題にチャレンジしてみるという内容でした。

参加者の中にはWebアプリケーションの開発・運用を既にやっている方もいましたが、それ以外の方にとっては、普段からプログラミング言語に触れていても、サーバの設定やデータベース・Webアプリケーションのチューニングといったものは未知の世界で、何から手をつけて行ったら良いかわからず、苦労していた方が多かったように感じました。

今回の「ISUCON 夏期講習」では、ISUCON2の問題に取り組む環境としてEC2の仮想サーバを用意しました。参加者には事前に環境を構築してもってきてもらうという予定でしたが、ノートPC上の仮想サーバなどでは性能が出にくく難しいだろうということで、EC2のサーバを使えるように準備しました。サーバは快適に使えたのようで参加者の評判も上々でした。

仮想サーバはISUCON2のパフォーマンス計測ツールとアプリケーションを動作させやすいように各言語の実行環境がプリインストールされているだけの簡単なものですが、そのまま捨てるのももったいないのでAMIとして公開します。

AMI ID: ami-e5fb6ae4
AMI Name: isucon_summer_course_2013
Region: Asia Pacific (Tokyo)

AWSに不慣れなのであまりよろしくない設定があるかもしれません。問題があれば指摘お願いします

「ISUCON 夏期講習」サーバのつくりかた

EC2のインスタンスを起動する際に、上記のAMIを指定して起動してください。インスタンスタイプはなんでも構いませんが、ベンチマークツールとデータベースと課題のアプリケーションを同じサーバで動かすのでコアが複数個あるインスタンスタイプでないと正常にパフォーマンス計測ができません。今回の夏期講習では「m3.xlarge」を選択しました。スポットインスタンスを活用するとリーズナブルに遊べると思います。

サーバが起動したら、「ec2-user」でログインしてください。

$ ssh -i keyfile.pem ec2-....amazonaws.com

ISUCON2の環境は「isu-user」ユーザにて構築してあります。

$ sudo su - isu-user

パスワードは設定していませんで、適宜設定するなりsshの公開鍵を設置すると良いかと思われます。

「isu-user」にてログインすると、ホームディレクトリに「isucon2」ディレクトリがあります。これはgithubのisucon2 repositoryをcloneしたものです。計測用ツールのみセットアップされています。

アプリケーションを動かすには、「ISUCON2のつくりかた」および「isucon2/webapp」の下の各言語ディレクトリの「README.md」を参考にしてください。各言語の実行環境はperl/ruby/pythonについてはxbuildでセットアップ、phpはrpmにてインストール済みです。

perlであれば、

$ cd isucon2/webapp/perl
$ carton install
$ carton exec -- plackup -s Starman -E production --preload-app app.psgi

として実行できます。デフォルトでポート 5000 で起動します。(carton/cpanfileは今回のイベントのために追加しました)

計測ツールはsupervisordにて起動されていて、ポート 5001 で起動しています。ブラウザにてアクセスしてください。次のような画面が表示されます。

isucon-mgr.png

ベンチマークを動かすには、ID/パスワードが必要ですが、ID/パスワードは「isucon2/tools」ディレクトリ内のconfig.jsonに書かれていますので確認の上ログインしてください。

今回の環境で perlのアプリケーションを動かした場合、チケット販売数で600強、スコアで81万前後の数値となるようです。なお、ISUCON2の時よりも負荷を掛けるツールの平行数が少なく設定されていますので、単純に比較は出来ないかもしれません。

ちなみに、自分が前回のハックを使わずに、30分ぐらいでトライした結果はこれ。

isucon-hs.png

変更点はここに置きました。ぜひ、皆様も良いスコア(小さいスコアが良いスコアです)を目指してチャレンジしてみてください!

参加者の皆様ありがとうございました。

おまけ

Webアプリケーションのパフォーマンスについても学べる良い本が最近でました。過去2回のISUCON出題者・参加者が執筆している章があるのでぜひ読んでくださいませ

Perl徹底攻略 (WEB+DB PRESS plus)
大沢 和宏 cho45(さとう) 小林 篤 和田 裕介 嶋田 裕二(xaicron) 牧 大輔(lestrrat) 奥 一穂 広木 大地 伊藤 直也 長野 雅広 藤原 俊一郎 伊藤 智章 まかまか般若波羅蜜 小飼 弾 近藤 嘉雪 中川 勝樹 宮川 達彦 tokuhirom 藤 吾郎(gfx) 村瀬 大輔
技術評論社
売り上げランキング: 1,535
Web開発の基礎徹底攻略 (WEB+DB PRESS plus)
小飼 弾 田籠 聡 近藤 宇智朗 並河 祐貴 赤松 祐希 井上 誠一郎 ミック 天尋 左石 和田 裕介
技術評論社
売り上げランキング: 728