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
シュッとさせる前に
「うわっ…私のアプリ、遅すぎ....?」となった時に人が取るべき行動としては、次のようになるかと思います
- 全体的にどれぐらい遅いかを見る
- 各処理の部分別にパフォーマンスを確認する
- 支配的に遅い箇所があればそこから直す
今回話をするモジュールはこの中で、特に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叩くスクリプト書いた
ISUCON 2014予選に参加して恥を晒してきました
大分遅れましたがISUCON4に参加してボコボコにされてきました。
ISUCONってなんなの?って人はこの記事読むと良いです。
ISUCON4 オンライン予選の参加登録を開始しました : ISUCON公式Blog
すごく大雑把に言うと「Webサービスをいい感じにパフォーマンスチューニングしてスピードアップさせちゃう」*1大会です。
3人でLINE本社に行ってオンサイト予選行ってきました。ちなみに日曜日の方です。
LINE株式会社様、会場をお貸しいただきありがとうございました。
流れ
基本的には公式サイト見ればわかるので特徴的なところを
- 開始したら参加者はAmazon EC2で競技に使うイメージ(AMI)を使ってインスタンスを立ち上げることができる
- m3.xlarge(練習で付けて一日消し忘れてたら15$ぐらい持って行かれた。)
- 提出するインスタンス以外には特に縛りはない
- CentOSベースのLAMP環境が入っており、色々な言語で実装されたアプリケーションの中から一つを選んでパフォーマンスチューニングする
- リクエストをたくさん捌ければ捌けるほどスコアが上がる
- ベンチマークを走らせて良いスコアが出たら、そのスコアを提出することができる
- 何回でも提出することができるが、最後に提出したスコアが採用される
- そんなこんなで終了したら、時間中に最後に提出したスコアを出したインスタンスを提出する
事前にやったこと
isucon4、まさかC以外で挑む人はいませんよね???
— OkadaKazuma (@okazu_dm) 2014, 9月 25
高度な情報戦の図
- 過去の資料とかGotanda.pm(http://gotanda-pm.github.io/about.html)とかの発表資料を見つつ、チームメンバーで集まったり、各自で戦略練ったりしてた。
- 最初は頑張ってローカル環境でVM使って練習環境立てようとしてたけど、Rubyのバージョンとかで引っかかって結構時間かかってしかも全員統一感ない感じの環境が出来上がってしまいそうだったので諦めてEC2に
- 環境構築周りはある程度シェルスクリプトにしたものの、全然足りてなかった
- 個人的感想だとホストは「提出用(絶対に壊さない)」+個人に1台ずつぐらいはあると嬉しい。
- 特に今回はAmazon Web Services様のご厚意により利用可能クーポン(たしか25$分ぐらい?)をご提供いただけることとなったとのことなので豪快に使えた。ありがとうございます。
- 逆に検証用とか言ってポンポン立てていくとだんだん把握できなくなるので面倒
- 役割分担としてはかなりざっくりと分けるとこんな感じが良いかと思う。
当日
つらかった。
反省
— OkadaKazuma (@okazu_dm) 2014, 9月 25
調子にのったツイートしてすみませんでした
- 素振りをもっと真剣に回数を重ねるべき
- メンバー間で1週間ぐらい前にディレクトリ構成とかの標準を決めておくべきだった。直前に決めると絶対ミスる
- 当日でも、「みんなこれは分かってるだろう」みたいなことでも意外と誰か一人しか分かってないこととかあるので、小刻みに確認していくのが大事
- 他人の話に耳を傾けましょう
- なんにせよこういう機会は一年に何回もあるわけではないのでもっと大事に活用するべきだった。
*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アイドル見てきた
- 無限コーヒー、無限ジュース最高✌
Python3.4で追加されたensurepipの紹介
Python3.4が今年の3月16にリリースされました。
色々追加要素があって、詳細は公式見たほうが良いです。
この中でも特に「pip(パッケージマネージャ)がすごく入れやすくなった」というのが、Pythonをよく使う皆はもちろん、これから使う人には非常に嬉しい要素なはずなので、とりあえず紹介してみます
はじめに
7割ぐらい書いたあたりで、非常にわかりやすい記事を見つけてしまって脱力感を抱いているのでこちらを見たほうがいいかもしれません
Python3.4のensurepip(それとpyvenvの更新)
pipって何よ?
「pip is 何」という問に関して端的に答えるとともにpipに対するこれまでのPythonユーザのイメージを表す端的なツイットがあります
“What’s pip?”
“A python package manager”
“How do I install it?”
“easy_install pip”
“What’s easy_install?”
“A python package manager”
— Guillaume (@gardaud) 2013, 7月 17
pipはモジュールとかを入れたり消したり検索したり色々できる便利なパッケージマネージャなのですが、今までは以下の様な手順を経て入れる必要がありました*1
- 同じくパッケージマネージャであるeasy_install(を含むモジュールであるsetuptools)をインストール*2
- easy_installでpipをインストール
- めんどくさい( ◞‸◟)
ちょっと前に、もう少し楽になったようですが、いずれにしても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をインストールしました
- 他にも色々追加要素や変更点があって、個人的には以下のようなものが気になります。誰か教えてください。
- statisticsモジュール 9.7. statistics — Mathematical statistics functions — Python 3.4.0 documentation
- デバッグ時にメモリ周りの情報取得に使えそうなtracemallocモジュール 27.7. tracemalloc — Trace memory allocations — Python 3.4.0 documentation
- これを書きながら食べたスタバのデビルズケーキがすごく美味しかったのですが、ガトーショコラと何が違うのかちょっと僕の舌では分かりませんでした。
*1:OSやディストリビューションによって色々な入れ方はありますが、どれでも共通しているやり方として
*2:このステップではスクリプトを落としてくる必要があります https://pypi.python.org/pypi/setuptools
Python3.4の便利機能の紹介をしたい
ensurepipとかstatisticsとかのドキュメントを読んでPythonの知見を深めたい
明日あたりに読む気がする。読みたい。
基本情報技術者試験受けた話
本日、大学時代になんだかんだで、受ける機会を逃していた基本情報技術者試験を受けてきました。
会場は世田谷区の国士舘大学で、立命館と比べて人里離れてないどころか区役所とか近くにあって凄みを感じた。
本題の試験の方ですが、余裕だろと高を括ってたら意外と余裕でもない部分があったけど、平均的には合格点を上回ってるはず。午後の方は詳しい配点は分からないけど正答率的には悪くなかった。
午前午後の振り返り + 感想
- 午前
- マネジメント・ストラテジ系が特にボロボロに弱い。
- あとはケアレスミスがいくつかあった。ケアレスミスが社会人になってもなくならないのはかなり辛いものがある。
- 午後
局所的に酷いところと局所的に良いところが両方あったけど色々と良い振り返りにはなった。擬似アセンブリ問題の復習は来週末に。