君は牛を二頭持っている

ウェブエンジニアのブログ。はてなブログ以外のブログサービスいろいろ探し中

Plackアプリをパフォーマンスチューニングする話

これはPerl Advent Calendar 2014の22日目のために書かれたエントリです。 前日のエントリは @ytnobody さんによる『MeCab? それDockerでできるよ』でした。

このエントリでは、ひどく遅いPlackアプリケーションをシュッと高速化しちゃおうという話のつもりでしたが、なんやらかんやらの事情が働いて時間がなくなったのでシュッとさせるために便利なCPANモジュールの紹介をさせて頂こうと思います。

今回紹介するモジュール

Devel::NYTProf - search.cpan.org

Plack::Middleware::Profiler::NYTProf - search.cpan.org

Plack::Middleware::Debug - search.cpan.org

シュッとさせる前に

「うわっ…私のアプリ、遅すぎ....?」となった時に人が取るべき行動としては、次のようになるかと思います

  1. 全体的にどれぐらい遅いかを見る
  2. 各処理の部分別にパフォーマンスを確認する
  3. 支配的に遅い箇所があればそこから直す

今回話をするモジュールはこの中で、特に2のステップで処理別にパフォーマンスを確認したい時に非常に便利です。コードに手を加えるにもまずは計測しましょう。

Devel::NYTProf

相当あちこちで紹介されつくされたDevel::NYTProfですが、まあ今回のAdventCalendarでは紹介されてないので改めて.

Devel::NYTProfはソースコードの行単位でプロファイリングしてくれるモジュールです。 ごく一部ですが、以下のような情報が記録できます - 呼び出し回数 - 平均スループット(1回の呼び出しあたりの所要時間) - 呼び出し元 このモジュール自体は汎用的なプロファイラなので、Plackアプリ以外でも利用できます。

Plack::Middleware::Profiler::NYTProf

上で紹介したDevel::NYTProfをPlackアプリケーションで使いやすい形にしてくれたものです。 この時点で残り10分のため、詳細は後日改めてリベンジ版で述べさせて頂きますが - PIDごとにレポートが出力される - レポ―トを出力する条件が指定できる などなど便利機能が付いています。

Plack::Midleware::Debug

すみません、あと3分しかないので後日に述べさせて下さい。お願いします。

その他

最近はこんなのもあるよと紹介してもらって、ここで書こうとして全く書けなかったネタ stevan/p5-plack-debugger · GitHub

まとめ

後日、実践版を書きます。 1分後に迫った明日ですが、id:papix さんが、お母上のお誕生日とのことですので何か書いてくださるとのことです。おめでとうございます。

AOJのAPI叩くスクリプト書いた

きっかけ

後輩がこんなの作って「お、ええな」と思ったので
部内AOJ進捗比較

つかいかた

``` bundle exec ruby get_aoj.rb user_id ```

その他

今回はRubyの入門として作ったのでこれを使ってもうちょっとちゃんとしたもの作りたい

ISUCON 2014予選に参加して恥を晒してきました

大分遅れましたがISUCON4に参加してボコボコにされてきました。
ISUCONってなんなの?って人はこの記事読むと良いです。
ISUCON4 オンライン予選の参加登録を開始しました : ISUCON公式Blog

すごく大雑把に言うと「Webサービスをいい感じにパフォーマンスチューニングしてスピードアップさせちゃう」*1大会です。

3人でLINE本社に行ってオンサイト予選行ってきました。ちなみに日曜日の方です。
LINE株式会社様、会場をお貸しいただきありがとうございました。

流れ

レギュレーション : ISUCON公式Blog

基本的には公式サイト見ればわかるので特徴的なところを

  • 開始したら参加者はAmazon EC2で競技に使うイメージ(AMI)を使ってインスタンスを立ち上げることができる
    • m3.xlarge(練習で付けて一日消し忘れてたら15$ぐらい持って行かれた。)
    • 提出するインスタンス以外には特に縛りはない
  • CentOSベースのLAMP環境が入っており、色々な言語で実装されたアプリケーションの中から一つを選んでパフォーマンスチューニングする
  • リクエストをたくさん捌ければ捌けるほどスコアが上がる
    • デフォルトだと2000点ぐらいのものが、DB(MySQL)のテーブルのインデックスをしっかり張ったり、ベンチマークのリクエスト数をアプリケーションの許す限り限界まで上げてみたりする
    • Memcached入れたりNginxの設定書いたり
    • DOM要素弄ったりするとベンチマークに通らなかったりする
  • ベンチマークを走らせて良いスコアが出たら、そのスコアを提出することができる
    • 何回でも提出することができるが、最後に提出したスコアが採用される
  • そんなこんなで終了したら、時間中に最後に提出したスコアを出したインスタンスを提出する

事前にやったこと


高度な情報戦の図

  • 過去の資料とかGotanda.pm(http://gotanda-pm.github.io/about.html)とかの発表資料を見つつ、チームメンバーで集まったり、各自で戦略練ったりしてた。
  • 最初は頑張ってローカル環境でVM使って練習環境立てようとしてたけど、Rubyのバージョンとかで引っかかって結構時間かかってしかも全員統一感ない感じの環境が出来上がってしまいそうだったので諦めてEC2に
  • 環境構築周りはある程度シェルスクリプトにしたものの、全然足りてなかった
  • 個人的感想だとホストは「提出用(絶対に壊さない)」+個人に1台ずつぐらいはあると嬉しい。
    • 特に今回はAmazon Web Services様のご厚意により利用可能クーポン(たしか25$分ぐらい?)をご提供いただけることとなったとのことなので豪快に使えた。ありがとうございます。
    • 逆に検証用とか言ってポンポン立てていくとだんだん把握できなくなるので面倒
  • 役割分担としてはかなりざっくりと分けるとこんな感じが良いかと思う。
    • インフラ担当:環境構築全般、ミドルウェアの導入、設定
    • アプリケーション:発行するSQLの最適化、テーブル定義の見直しなど。3人チームの場合、こちらが2人

当日

つらかった。

反省


調子にのったツイートしてすみませんでした

  • 素振りをもっと真剣に回数を重ねるべき
  • メンバー間で1週間ぐらい前にディレクトリ構成とかの標準を決めておくべきだった。直前に決めると絶対ミスる
  • 当日でも、「みんなこれは分かってるだろう」みたいなことでも意外と誰か一人しか分かってないこととかあるので、小刻みに確認していくのが大事
  • 他人の話に耳を傾けましょう
  • なんにせよこういう機会は一年に何回もあるわけではないのでもっと大事に活用するべきだった。

その他

Rubyで、PerlのNYTProfみたいなメソッド呼出単位で出力してくれるプロファイラあったら教えて下さいお願いします

*1:個人の見解であり、所属する組織の公式見解ではありません

YAPC行ってきました(2日目のみ)

こんにちはこんにちは。
最後のブログ更新から4ヶ月ぐらい経ってますが、突然のPerlの話題です。
先週の8/30にYAPC Asia(yet another perl conference)の2日目に行ってきたという話です。
概要は公式見たら詳しく書いてますが、Perlに興味あったりPerl書いてる人とお酒飲みたい人がワイワイしたり、会場で便利なツールの紹介をしたり聞いたりして知見を得る場です。
YAPC::Asia Tokyo 2014

Dockerで遊んでみよっかー(@kazeburoさん)

概要

  • Docker Hubなども含めた全体の概念
  • Dockerのアーキテクチャの概要
  • Vagrant + DockerでMac上でVMをセットアップしてHello World
  • Dockerfile、docker buildコマンドについて
  • Dockerの利用例(ここで時間切れ)

発表の感想

  • Dockerで具体的にどんなリソースが隔離されるのかっていうのが今まで話し聞いててもほんわかしたイメージしか付いてなかったので、リストアップしてくれてよく分かった
  • 実際にコマンドラインで動作させるためのHowToをスライドで順を追って解説してくれてるので、とりあえず動かしてみよう!って人にはおすすめ
  • 後半は時間切れになってたけど、多分スライドが十分詳しいので問題ない

Dockerでbashを少しだけ動かしてみて

  • docker run ubuntu:14.04とかやると、CentOS上で動かしててもUbuntuから作ったイメージが実行できてすごい。
  • Vagrantみたいにイメージが手元になければリポジトリ( Docker Hub Registry - Repositories of Docker Images )から落としてくる。すごい。
  • /etc/debian_versionがあって、Ubuntu14.04っぽいのにunameで取得するカーネルのバージョンはやっぱり2.6.xだったりする。この辺りはAufs(UnionFSの後継らしい差分を付けたしていくタイプのファイルシステム)で/etc/以下とかもまるっとコンテナに含まれてるのが分かる。
  • コンテナを作った環境とカーネルのバージョンが違っても動くかというと、そんなことはなさそう。少なくとも新->旧のパターンはシステムコールレベルで存在してないインタフェースを使っているする可能性がなきにしもあらずだと思う。
  • Aufsのパフォーマンスとか色々気になる点はあるので、ある程度情報を整理してからひと通り確認したい

あやかNow

  • Rubyアイドル見てきた
  • 無限コーヒー、無限ジュース最高✌

Perlの静的解析入門とPerlリファクタリングツールApp::PRTのご紹介(@hitode909さん)


概要

感想

全体を通して

  • 発表者の皆様、運営の皆様は局所的にコミケみたいになってた中、本当にお疲れ様でした。また来年もよろしくお願いします。
  • 慶応大学の日吉キャンパス、大学なのにHUBあるのちょっと羨ましすぎる
  • 大学内にセントラルスポーツとかいうジムあるし、格差を感じた
  • 意外と「膝にレガシーコードを受けてしまってな....」みたいな話はなくて、結構モダンなツールを使って開発効率を上げる系の話が多かった気がする。というかあまりPerl関係ない話も結構あったのでそこまでPerl界隈じゃない人も発表できそう
  • 他にも色々と書きたいけどぼちぼち1時間ぐらい書いてるので寝たい

Python3.4で追加されたensurepipの紹介

Python3.4が今年の3月16にリリースされました。
色々追加要素があって、詳細は公式見たほうが良いです。

この中でも特に「pip(パッケージマネージャ)がすごく入れやすくなった」というのが、Pythonをよく使う皆はもちろん、これから使う人には非常に嬉しい要素なはずなので、とりあえず紹介してみます

はじめに

7割ぐらい書いたあたりで、非常にわかりやすい記事を見つけてしまって脱力感を抱いているのでこちらを見たほうがいいかもしれません
Python3.4のensurepip(それとpyvenvの更新)

pipって何よ?

「pip is 何」という問に関して端的に答えるとともにpipに対するこれまでのPythonユーザのイメージを表す端的なツイットがあります


pipはモジュールとかを入れたり消したり検索したり色々できる便利なパッケージマネージャなのですが、今までは以下の様な手順を経て入れる必要がありました*1

  1. 同じくパッケージマネージャであるeasy_install(を含むモジュールであるsetuptools)をインストール*2
  2. easy_installでpipをインストール
  3. めんどくさい( ◞‸◟)

ちょっと前に、もう少し楽になったようですが、いずれにしてもPythonのインストールとパッケージマネージャのインストールが全く別の作業になっていたわけです

3.4でpipの何が変わったの?

pipがセットアップしてすぐに入れられるようになりました。
細かくはどういう感じになっているかというと

  • Python3.4にensurepipというモジュールが付いてくる
  • ensurepipにpipのwheelが付いてくる
  • ここからちょっとどうなってるのかわからないけど、どうにかしてpipのwheelを使ってpipをインストールしている

つまりensurepipというpipをインストール、アップグレードするためのモジュールが追加されていて便利になったって感じです。

使い方

python -m ensurepip

これでsetuptoolsとpipが入るようです

python -m ensurepip --upgrade

これでパッケージマネージャが最新版になります

そのほか

  • 今回の内容はすごく大雑把に書いたけど、とりあえず「pipのインストールの手間が省けるようになったんだなあ」ぐらいの話です
  • 実験中にCentOSでPython3.4をビルドしたんですが、SSLを利用する準備が整っていないと怒られたのでopenssl-develをインストールしました
  • 他にも色々追加要素や変更点があって、個人的には以下のようなものが気になります。誰か教えてください。
  • これを書きながら食べたスタバのデビルズケーキがすごく美味しかったのですが、ガトーショコラと何が違うのかちょっと僕の舌では分かりませんでした。

*1:OSやディストリビューションによって色々な入れ方はありますが、どれでも共通しているやり方として

*2:このステップではスクリプトを落としてくる必要があります https://pypi.python.org/pypi/setuptools

基本情報技術者試験受けた話

本日、大学時代になんだかんだで、受ける機会を逃していた基本情報技術者試験を受けてきました。
会場は世田谷区の国士舘大学で、立命館と比べて人里離れてないどころか区役所とか近くにあって凄みを感じた。
本題の試験の方ですが、余裕だろと高を括ってたら意外と余裕でもない部分があったけど、平均的には合格点を上回ってるはず。午後の方は詳しい配点は分からないけど正答率的には悪くなかった。

午前午後の振り返り + 感想

  • 午前
    • マネジメント・ストラテジ系が特にボロボロに弱い。
    • あとはケアレスミスがいくつかあった。ケアレスミスが社会人になってもなくならないのはかなり辛いものがある。
  • 午後
    • 選択問題の人間擬似アセンブリコンパイラ問題が大変な間違いをして問題を酷く複雑にしてしまったのが大変厳しい。
    • その他のプログラミング系は凡そ良かった。
    • 擬似アセンブリ問題に45分ぐらいかけてしまって他のところに時間をかけられなかったので結構スレスレ

局所的に酷いところと局所的に良いところが両方あったけど色々と良い振り返りにはなった。擬似アセンブリ問題の復習は来週末に。

その他

最近Pythonに関する話をしてないなあと思ったのと、先日Python界隈と認識されたみたいなのも合わせて、Python3.4あたりの新機能とか便利になった部分とかのうち、あまり日本語で紹介されてない
部分を紹介してみようかと思います。