タグ

ブックマーク / blog.nomadscafe.jp (49)

  • wrkでunix domain socketなHTTPサーバをベンチマーク - blog.nomadscafe.jp

    wrkに無理矢理なpatchをあてて、unix domain socket経由でHTTPサーバをベンチマークできるようにしてみました。 kazeburo/wrk at unixdomain pullreqはしてない。 GazelleやRhebokといったアプリケーションサーバを作っていますが、TCP経由のベンチマークではEphemeral Portの枯渇やTIME WAITの上限にあたってしまい、ベンチマークがしづらいという問題があります。 そこでnginxをreverse proxyとして設置し、nginxとアプリケーションサーバ間をunix domain socketで繋いでベンチマークをとっていましたが、nginxがボトルネックになりやすく、直接アクセスしたいなと考えていたので、やってみました。 これを使ってRhebokとUnicornの “Hello World” ベンチマークを行

    kazuhooku
    kazuhooku 2015/01/28
  • h2o と server_starter で graceful restart with Docker - blog.nomadscafe.jp

    h2o はserver_starter経由のgraceful restartをサポートしているので試してみた。ついでにdockerで動かしてみた。 h2o/h2o 実際にwrkでベンチマークしながらコンテナにHUPシグナルを送り、graceful restartを行ってみたのが次の動画 左上がh2oをdocker経由で起動しているウィンドウ、HUPを受けてh2oのプロセスを入れ替えている様子がわかります。。左下はwrkの実行、右側はコンテナにHUPを送ってます。 HUPシグナルはdocker killを使って送ります。 $ docker kill --signal="HUP" $(docker ps |grep kazeburo/h2o|awk '{print $1}') wrkの結果はこんな感じ。エラーは出ていません vagrant@vagrant-ubuntu-trusty-64:~/

    kazuhooku
    kazuhooku 2015/01/22
    wow! great!!
  • Docker と SO_REUSEPORT を組み合わせてコンテナのHot Deployにチャレンジ - blog.nomadscafe.jp

    Docker と SO_REUSEPORT を組み合わせてみる。おそらくその1」のその2です。 結論から言うと、「単体ではリクエストの取りこぼしが若干あるけど、Reverse Proxyを工夫すればコンテナのHot Deployを実現できるかも」という感じです。 Rhebok の SO_REUSEPORT 対応 前回は簡単に検証するためにmemcachedを使いましたが、今回はアプリケーションサーバが対象ということで、 unicornの2倍ぐらい速いRackサーバであるRhebokに手をいれてSO_REUSEPORT対応しました。version 0.2.3〜です。 rhebok | RubyGems.org | your community gem host 起動時に ReusePort オプションを追加します。 $ bundle exec rackup -Ilib -s Rhebok

    kazuhooku
    kazuhooku 2015/01/08
    アッー!!! > 「サーバを終了した際に、そのプロセスのListen SocketのQueueに残っていたコネクションが解放される(RSTが送られる?)ために起きるエラー」
  • Docker と SO_REUSEPORT を組み合わせてみる。おそらくその1 - blog.nomadscafe.jp

    SO_REUSEPORTはLinux Kernel 3.9からサポートされている機能で、複数のプロセス/Listenerから同じTCPポートをbind可能にして、Kernelが それぞれのプロセスに接続を分散してくれるという機能です。preforkなサーバはlistenしてからworkerをforkし、それぞれでacceptを行うという手順を踏みますが、SO_REUSEPORTを使えばその手順を踏まなくても複数プロセスから同じポートをListenして処理の並列性をあげたり、hot-depolyが実現できます。 Docker のHost networking機能とSO_REUSEPORTを使って、複数のコンテナから同じポートをbindできれば、コンテナのhot-deployができるんじゃないかと思ったので、試してみました。 SO_REUSEPORTについては以下のblogが参考になります。

    kazuhooku
    kazuhooku 2015/01/07
    linuxのREUSEPORT、確かにホットデプロイには使えそう。preforkサーバの負荷分散には(負荷に応じた分散にならないので)使えないと思うけど
  • Unicornの2倍のパフォーマンスを実現したRackサーバ「Rhebok」をリリースしました - blog.nomadscafe.jp

    “Hello World”なベンチマークでUnicornに比べ2倍高速に動作するRackサーバをリリースしました。 rubygems: http://rubygems.org/gems/rhebok github: https://github.com/kazeburo/rhebok PerlのGazelleをベースに作っています。Rackアプリケーションの運用経験がほぼないので、機能不足があると思います。issue等で教えて頂ければ幸いです。 なぜ高速に動作するアプリケーションサーバが必要なのか Unicornは高速に動作します。多くのアプリケーションにとっては十分でしょう。それでもRhebokでさらに上のパフォーマンスを出そうとしたのは、技術的なチャレンジの他に以下のようなアプリケーションで高速なアプリケーションサーバが必要とされると考えているからです。 ソーシャルゲーム、広告サーバ、

    kazuhooku
    kazuhooku 2014/12/19
  • ISUCON4 で優勝してきました!!! #isucon - blog.nomadscafe.jp

    去年に引き続き、ISUCONにLINEの選抜チーム「チーム生ハム原木」で出場して優勝することが出来ました!!!! @tagomoris、@sugyan お疲れ様でした!! #isucon 2014で優勝しました - すぎゃーんメモ 最後の最後、残り15分でnginxの設定を行う場所を間違えていたということに気付き、ローカルのベンチマークでしか検証ができず、どの程度のスコアになるのか、またfailするのか分からない状況でしたが、結果的に良いスコアになってほっとしました。 自分でも何度も言いながら「nginxのrewriteはinternal redirect」の大原則を忘れていました。はい。1日100回唱えるようにします。 予選アプリケーションの復習 劇的なスコアは出ていませんが、地道に復習をしていて、 $ ~/benchmarker bench --workload 8 07:26:29

    kazuhooku
    kazuhooku 2014/11/10
    変態だ / ExpiresつけないとIf-Modified-Since送ってこないクライアントライブラリなんてあるのか…
  • listen()のbacklogが不足した際のTCP_DEFER_ACCEPTの動作について - blog.nomadscafe.jp

    TCP_DEFER_ACCEPTは、LinuxでサポートされているTCPのオプションで、サーバ側で使用した場合にはaccept(2)からのブロック解除をTCP接続が完了したタイミングではなく最初のデータが到着したタイミングで行ってくれるオプションです。 Webサーバ・アプリケーションサーバではリクエストが到着してからaccept(2)のブロックを解除するので、リクエストの到着をWebサーバ・アプリケーションサーバで待つ必要がなくなり、特にprefork型のサーバでは効率的にプロセスを使えるようになるという利点があります。PerlではStarletがこの機能を有効にしています ところが、某サービスでTCP_DEFER_ACCEPTが有効にも関わらず、accept後のreadでデータが読めず、最悪の場合、デフォルトのtimeoutである5分間プロセスがストールすることがありました。strace

    kazuhooku
    kazuhooku 2014/05/08
    ふむふむ。なんかLinuxのTCP_NODELAY実装のタイムアウトについてUbuntuあたりにプロキシとの絡みのissueがあった気がするけど思い出せない
  • HTTP::Entity::Parser をリリースしました - blog.nomadscafe.jp

    HTTP::Bodyと互換性のある HTTPのEntityをパースするモジュールをリリースしました。 https://metacpan.org/release/HTTP-Entity-Parser https://github.com/kazeburo/HTTP-Entity-Parser/ HTTPのEntityってのは、こういう範囲を指します。 POST /foo HTTP/1.1 # Not part of the entity. Content-Type: text/plain # ┬ The entity is from this line down... Content-Length: 1234 # │ # │ Hello, World! ... # ┘ 元ネタは「java - What exactly is an HTTP Entity? - Stack Overflow」

    kazuhooku
    kazuhooku 2014/02/05
    おー
  • Q4Mを簡単に導入する方法 for MySQL 5.6 - blog.nomadscafe.jp

    以前、「Q4Mを簡単に導入する方法 - MySQL Casual Advent Calendar 2011」で紹介したQ4M専用MySQLのセットアップスクリプトのMySQL5.6対応版を作りました。 kamipo先生によると、プラグインをあとからビルドしてMySQLに追加する事は推奨されていないとのことなので、Q4MのソースコードをMySQLのソースコードツリーにコピーしてから一緒にビルドします。これは同じくkamipo先生のmysql-buildを参考にさせて頂きました。 #!/bin/sh set -e MYVER=5.6.15 Q4MVER=0.9.11 CDIR=$(cd $(dirname $0) && pwd) cd /usr/local/src if [ -f $CDIR/mysql-$MYVER.tar.gz ]; then cp $CDIR/mysql-$MYVER.t

    kazuhooku
    kazuhooku 2014/01/30
    kazeburo++ kamipo++
  • 一時ファイルとdentry cacheとメモリ - blog.nomadscafe.jp

    わりと長い間悩んでいたんだけど、最近解決したのでメモ。 サービスで利用しているsmalllightの画像変換サーバが、Apacheが使っているメモリ以上のメモリを使用し、Swapしたりメモリ枯渇でサーバがダウンするなどのことが何度かありました。 ↑メモリの動きはこんな感じ いろいろ調べた結果「dentry cache」なるものがメモリ多くを占めていることがわかりました。dentry cacheはディレクトリやファイル名とinodeとを結びつけに使われるキャッシュです。smalllightでは画像を変換する際に一時ファイルを作成するので、その情報が残るようです。 手元で再現させる 番で使っているサーバはCentOS5系ですが、手元のVagrant上のCentOS6(ファイルシステムはext4)で、再現させてみました。 use Parallel::Prefork; use File::Tem

    kazuhooku
    kazuhooku 2014/01/09
    サーバの場合swap起こしたら負けなんだから、swappiness下げておく、って運用がいいのかなと思ってる / swappiness=0 でもダメだったとのこと
  • Starlet が HTTP/1.1 に対応しました / wrkによるベンチマークとYAPC::Asiaのトーク宣伝 - blog.nomadscafe.jp

    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 StarmanやMonocerosとだいたい同じ動きをするようになっていると思われます。 なお、導入にあたっては、リバースプロキシ等と組み合わせた場合の動作パターン

    kazuhooku
    kazuhooku 2013/08/26
    「なぜStarletが速いのか、Starmanとどこか違うのかについてはYAPC::Asia 2013 Tokyo の僕のセッションで」wktk
  • Monoceros が HTTP/1.1に対応しました & nginx と組み合わせたベンチマーク - blog.nomadscafe.jp

    C10K対応Prefork型高速PSGI/Plackサーバの Monoceros をHTTP/1.1に対応させました。 https://metacpan.org/release/Monoceros https://github.com/kazeburo/Monoceros MonocerosではHTTPのKeepAliveに対応して、大量の接続を捌く事ができますが、リリース時点ではHTTP/1.0 KeepAliveにしか対応していませんでした。しかし、nginxのupsream などでは、keepaliveを有効にしてHTTPセッションを使い回したい場合にHTTP/1.1が求められます。 以前このあたりの事をしらべてblog書いています nginx-1.1.x で httpなupstreamにもkeepaliveができるようになったので検証してみた https://blog.nomads

    kazuhooku
    kazuhooku 2013/05/17
    あとで
  • Monoceros というPrefork型だけどC10Kの接続を捌くことができるPSGI/Plackサーバ書きました - blog.nomadscafe.jp

    Monoceros というPSGI/Plackサーバ書きました https://metacpan.org/release/Monoceros https://github.com/kazeburo/Monoceros StarmanやStarletのようなPreforkなアプリケーションサーバでは、コネクションの維持イコールプロセスの占有なので、HTTPのKeepAliveは無効にするのが一般的ですが、負荷の高いサービスではTIME_WAIT状態のソケットが溜まったり、SYN-ACKの再送問題などあり、KeepAliveを使いたいという欲求があったりなかったりします。 Monoceros はリクエストを処理するworkerの他に、イベントドリブンで動くコネクション管理プロセスを立てて、クライアントからの接続ソケットをunix domain socketを使いプロセス間でやりとりします。待機

    kazuhooku
    kazuhooku 2013/05/14
    kazeburo++ slowloris対策とか運用系の話も聞きたい
  • 数字を出力するコマンドを定期的に実行して、秒間の変化量を memcachedプロトコルで取れるサーバを書いた - blog.nomadscafe.jp

    Nagiosを使っていると、その瞬間の絶対値だけじゃなく、差分や変化量を取得してその数値を監視したくなりますよね。ならないとしたら、今すぐこの記事を読むのをやめて病院に行って下さい。 Nagiosで変化量を測定するには、プラグインの中で前の数値をどこかファイルにでも保存し、比較するという手があります。このcheck_bandwidthはその方法を取っているようです。 ただ、これだと汎用性があまりないので、監視対象サーバ側に定期的に指定したコマンドを実行して、その数値を外部から取得できるサーバを書いてみました。 CPAN: https://metacpan.org/release/App-derived *出てくるまで時間がかかるようです github: https://github.com/kazeburo/App-derived 使い方 インストールはcpanmで $ cpanm -n

    kazuhooku
    kazuhooku 2013/02/07
    (素朴な疑問)なんでSQLじゃないんだろ
  • File::RotateLogs っていうログをファイルに記録していくモジュールを書いた - blog.nomadscafe.jp

    「君のPSGIファイルを僕のミドルウェアでいっぱいにしたい」という台詞を思いついたけど使い道がない kazeburo です 似たようなログ記録モジュールはCPANにいくつかあるんだけど、File::RotateLogsっていうのを書いてCPANにあげました https://metacpan.org/release/File-RotateLogs 特徴は以下の通り strftimeベースのファイル名生成 秒数指定のrotation rotation時に最新のファイルへのsymlink 古いログはforkしてバックグラウンドで削除 使い方 Proclet と組み合わせると my $app = builder { enable 'AccessLog'; $app; }; my $rotatelogs = File::RotateLogs->new( logfile => '/path/to/ap

    kazuhooku
    kazuhooku 2012/08/31
  • cron等をつかって外部のAPIに問い合わせる場合は、毎時0分を避けるのが大人のマナー - blog.nomadscafe.jp

    なんかtwitterで書いたらウケたっぽいので cronをつかって外部のAPIに問い合わせる場合は、毎時0分をさけるのオススメ!!!!お兄さんとの約束だ!!! — masahiro nagano (@kazeburo) August 9, 2012 某サービスのAPIへの問い合わせ件数を調べると、毎時 0分台(0秒から59秒)のアクセスは1分から59分までの1分間の平均アクセス数の5倍から8倍にもなります。 これはおそらく、crontabの設定が 0 * * * * /path/to/call_foreign_api になっていることが多いからじゃないかなぁと思うのです。 その結果、サーバのロードアベレージは このように毎時0分だけ跳ね上がってしまいます。サービスを快適に提供できなくなる可能性があるので、APIの利用を制限したり、サーバを追加しなければなりません。これはサービス利用者、サー

    kazuhooku
    kazuhooku 2012/08/10
    毎分0秒に固まる問題について
  • Net::DNS::Lite と resolv.conf の関係 - Net::DNS:Lite 0.09 の変更点について - blog.nomadscafe.jp

    昨日でたNet::DNS::Lite-0.09の変更点に関する話。 Furlと組み合わせて使うと幸せになれる Net::DNS::Lite のtimeoutとretry回りは若干変わった実装になっていて、 use Net::DNS::Lite; my $r = Net::DNS::Lite->new( server => [qw/8.8.8.8 8.8.4.4/] ); $r->resolve("google.com", "a"); このように実行すると、 #サーバ一覧 [server,timeout] my @retry = ( ['8.8.8.8',2], ['8.8.4.4',2], ['8.8.8.8',5], ['8.8.4.4',5], ['8.8.8.8',5], ['8.8.4.4',5] ); 2秒=>5秒=>5秒とタイムアウト時間が変化しつつ、上の順番でサーバ一覧が作ら

    kazuhooku
    kazuhooku 2012/06/22
    kazeburo++
  • Proclet という supervisor モジュール書いてリリースした - blog.nomadscafe.jp

    FreeBSD・OpenBSDと他で ps -e の動作が違ってハマってしまいましたが、Proclet という簡単なsupervisor・プロセス管理モジュールをCPANにあげました。 Proclet - minimalistic Supervisor https://metacpan.org/module/Proclet GrowthForecastでは、growthforecast.pl というスクリプトを実行するだけでWebサーバと2つのWorkerが起動します。CloudForecastのように個別に実行が必要になると使うのも面倒ですよね。 growthforecast.pl を実行後、pstreeで見るとこうなってます。growthforecast.plがsupervisor的に動作し、終了したプロセスがあれば自動で起動し直します。 -+= 70330 kazeburo perl

    kazuhooku
    kazuhooku 2012/06/18
  • 「Mobageを支える技術」を読みました - blog.nomadscafe.jp

    DeNAさんの「Mobageを支える技術」を献頂きました。nekokakさんありがとうございます。 今日発売です このは4部構成になっています Part 1 ソーシャルゲーム開発技術 Part 2 ソーシャルゲーム運用技術 Part 3 ソーシャルゲーム効率化技術 Part 4 ソーシャルゲーム分析技術 最初はガラケーやスマホなどのどちらかというと、フロントよりの話があり、Part2と3で、インフラ・データベース・アプリケーションのチューニングなどの話題が出て、Part4ではデータマイニングが紹介されます。目次をみるだけでもDeNAを支える技術をできるだけ多く盛り込んだだということがわかります。その分、若干書評が書きにくく、万人にお勧めするのが難しいだなと思いました。 DeNAがさばいている35億PV/dayというリクエスト数と同等レベルのアクセスを相手にしければならないエンジニア

    kazuhooku
    kazuhooku 2012/06/13
  • チート対策とhttp_loadに仕掛けた罠の話 #isucon - blog.nomadscafe.jp

    完全に文化祭疲れで昼寝3時間ぐらいしてしまいましたが、懇親会で聞かせて頂いた話やblogやtwitterをみる限り好評だったようで、うれしく思っています。ISUCONに参加して頂いた方、社内で協力して頂いた方ありがとうございました いくつか至らぬ点がありますが、明日以降に公式にフォローさせて頂きたいと思っています。 さて、既に公開されているので見た方は多いと思いますが、今回ISUCONで使ったベンチマークツールは大きく分けて次の3つのツールに分かれています。 (1) 1post/secでコメントを投稿し、1秒後にコメントをしたページと、インデックスおよび適当な記事のDOMチェックを行う node.js (2) http_load + patch (3) css/js/imageのMD5値を検証する perl script 最終的な順位はhttp_loadが行ったリクエスト数で決まるのでもし

    kazuhooku
    kazuhooku 2011/08/29
    「こういう嫌がらせはどうかとかありましたらblogなどなどで書いてもらえるとうれしい」