まいんだーのはてなブログ

はてブなのはてブロなのどっちなの

ISUCON3 本戦参加報告

引き続きチーム「50ms or die.」で本戦に参加してきました。

f:id:myfinder:20131109100811j:plain

謝辞

はじめに運営の皆様、出題の @fujiwara さん、サーバ提供のデータホテルさまには予選含め、限られた時間でいろいろ絞り出して戦うという、とても得難い機会を頂けたことを感謝申し上げます。

結果

1800なんぼでfailという結果に終わりました。いわゆる「die.」です。
スコアレスでdieしてしまった前回よりはマシだけど、結果に結びつかなかった点は反省して次に繋げたい。

ただ、前回のような絶望感はなく、いかに時間内にやり切るかという挑戦ができたのでとても充実した時間になりました、この点は自身進歩したなと感じてます。

詳細はチームの @__kan さんや @bonnu も書いてくれると思いますが、私も覚えている限り何を思って取り組んだかといったあたりはまとめておきます。

やったことのまとめ

  • プロファイリング

@bonnu さんに Devel::NYTProf を使ってどういうところが問題になりそうか調べてもらいました。
結果としてコード読んだらすぐわかるconvertまわり以外は特に何もなかったという結論に。。

  • DB の slowlog チェック

コード読んだら join したりサブクエリ発行してたりする所があったのでこの辺怪しいかもと思って slowlog 出したり explain して確認したけど、まったくボトルネックではなかった。。

  • 課題解決へのアプローチ

DBもアプリもボトルネックではないので、配信をスケールさせること、という認識は昼までのプロファイリングやslowlogを見てわかったので、まず1台で高速化し、その後スケールアウトさせるアプローチを考えました。

  • 時間内に出来た実装

複数台でリクエストを受付、投稿された画像がどのサーバに入っているかをDBに入れておき、reploxyするという戦略で実装していきました。
が、最初の「1台で速くする」というアプローチを引きずり、初期データの収容先を1台に集中させてしまったため、そのサーバがサチる状況になっていたのは明らかにミスでした。
これを解消するために初期データを散らそうと対応を始めた所でタイムアップして終了でした。

当日までの流れ

以降は上記にまとめた内容がどんな流れで進んでいったかという記録です。

前日まで

予選の反省を踏まえて、できるだけ即手を入れていくのではなく、素の状態からボトルネックを列挙して優先度つけて潰していこう的な方針を確認しつつ、事前に「まずやること分担」を決めた。

  • サーバのログイン環境/nginx化/nginxのログ/mysqldumpslowをdocrootにおいちゃう対応: myfinder
  • 一発デプロイ/データクリーンアップ対応: kan
  • NYTProf等のプロファイリング対応: bonnu

あとgithubにprivate repoを作ってwikiを使えるようにしたりなどはしておいた。

当日の昼まで

奥の会議室が確保でき、他のチームを気にせず喋れたのでチャットログはほとんど残っていないけど、プロファイリングを取ったりslowlogを確認したりをまず進めた。

結果的にプロファイル見てもslowlog見ても問題になりそうなのがsystem関数呼んで変換しているところが圧倒的すぎたし、DBのデータサイズも大したことがなかったのでこのへんは全くボトルネックにならないということはすぐにわかった。

なので、この時点で「帯域小さいからスケールアウトさせて、サーバ間での画像共有どうするか」に問題を絞って構成を皆で考えて進めればよかったのだが、1台で速くするという所をすぐ捨て去ることができなかった。

当日の昼以降

1台ではどう頑張ってもアレ以上行かないね〜となったタイミングで、複数台化に取りかかりはじめた。これが15時〜16時頃だった記憶。
複数台でリクエストを受付、投稿された画像がどのサーバに入っているかをDBに入れておき、reploxyするという戦略を取るつもりだった。
時間内にできた実装では、初期画像のリクエストがすべて1台に集中し、その1台が帯域を食いつぶしてスループットが上がらないという問題を抱えていた。
初期画像はすべてのサーバに置いていたので、すべてのサーバで初期画像の保持を分散させておけばよかったわけだが、この時点で残り30分だったため、あがいたけど結局間に合わなかった。

構成変更の判断が遅かったため、大きくスコアを伸ばすところに至らず時間切れという結果に。

おわりに

DB設計変更、アプリケーションの書き換えやMySQLのチューニングが今までの主戦場だった所から、今回は大幅に変わった点は脱帽で、 @fujiwara++ でした。
まさに総合力勝負だったと思います、引き続きこの戦いを生き抜けるよう研鑽に励みたいと思っております。

MySQL Casual Talks vol.5 開催報告

先日MySQL Casualやりまして、登壇者の皆様ありがとうございました。
今回も非常に和やかでカジュアルな雰囲気の中でイベントが平和裏に終わり大変良かったと思います。

さて、イベント中に参加者アンケートを取らせてもらったので、その報告をいたします。

参加者80-90名くらい?に対して有効回答25を頂きました。
2割超が回答してくれたのでまぁ回答率はそんなものだと思って以降の内容をご覧ください。

何度目の参加ですか?

  1. 初参加: 9
  2. 2回以上: 16 (うち2回目が10)

何気に初参加の方が多く、2回目という方も多かったようです。

開催方式の是非

  1. 良い: 20
  2. 開催方式とかどうでもいい: 5

"悪い"を選択した方はいらっしゃいませんでしたが、ご意見に"良し悪し"を追加して欲しいというものがありました、皆さん遠慮せずに悪いを選んで意見をいただいてもよかったのに。。。
まぁちゃんと来る人にとっては開催方式なんてどうでもいい話なので、これにワザワザ回答頂けるくらいきっちりした方には愚問だったかもしれません。
とはいえ、おおむね好評価のようでした。
最近Oracleさんが入館しやすくなり、方式との相性も良い感じだと思ったので、次があるなら変えずにやっていこうと思います。

次回登壇して欲しい人

  1. @kazeburo さん: 2
  2. @sh2nd さん: 1
  3. @nippondanji さん: 1
  4. @matsunobu さん: 1
  5. @tagomoris さん: 1
  6. @frsyuki‎ さん: 1

名前が上がった方は @frsyuki さん以外1回以上登壇いただいてる方ですが、ネタがあれば何度でもご登壇いただけると幸いです。
というか MySQL Casual で @frsyuki さんはだいぶ異色の取り合わせな気がしますね、そんな希望もありましたよということで報告させていただきます。

今後聞きたいテーマ

  1. MariaDB: 5
  2. MySQL vs MariaDB: 1
  3. MySQLの運用: 1
  4. MySQLのDev寄りのトーク: 1
  5. Labsの詳しい所: 1
  6. mroongaの実践: 1
  7. MySQLを動かしているハードウェアまわり: 1
  8. percona toolkit: 1
  9. percona XtraDB Cluster: 1
  10. パフォチュー: 1
  11. オプティマイザやメモリアロケータ変更まわり: 1

みんな MariaDB 気になってるんですね〜
もう誰か MariaDB Casual Talks やればいいと思うよ。

おわりに

ということで前回今回と事前登録不要/先着順受付で開催してみたわけですが、人があぶれることもなく、時間通りに来た人はちゃんと入れたので、人の入りにお悩みの方はこのやり方でイベントやればいいんじゃないと改めて実感しております。
疑問質問などあれば @myfinder までいただければと。

それでは。

WEB+DB PRESS Vol.77 Perl Hackers Hub に寄稿しました

今月発売の WEB+DB PRESS でやっている Perl リレー連載に記事を書きました。

内容は YAPC::Asia 2013 でトークしたテスト関係の話題。
基本的なテストからCI、更には高速化についてまでをまとめていますので、読んでいただければと思います。

WEB+DB PRESS Vol.77

WEB+DB PRESS Vol.77

  • 作者: 中川勝樹,山内沙瑛,賈成カイ,小俣裕一,沖田邦夫,澤村正樹,卜部昌平,吉藤博記,片山暁雄,平山毅,舟崎健治,吉荒祐一,今井雄太,八木橋徹平,安川健太,門脇恒平,佐藤太一,近藤宇智朗,奥野幹也,天野祐介,伊藤直也,住川裕岳,北川貴久,菅原一志,後藤秀宣,久森達郎,登尾徳誠,渡邊恵太,中島聡,A-Listers,はまちや2,川添貴生,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2013/10/24
  • メディア: 大型本
  • この商品を含むブログを見る


この記事を書いていて「そういえば Perl アプリケーションの基本的なテストについてまとまった記事ってなかったよな〜」とおもったので、これから本格的に Perl アプリケーションを書いていく方には前半の基本的なテスト部分が特におすすめです。

その他気になるトピックとして「スマートフォンテスト最前線」という特集があります。
スマートフォン広告におけるRTBもようやく本格化してきて、Web面だけでなくアプリ面が出てきたり、そのバリエーションも増えています。
今後、デバイスが増えてきてもリリースサイクルを早く、クオリティを高くしていくためにもこの辺りは引き続きアンテナをはっていきたいところです。

あわせて読みたい

Perl徹底攻略 (WEB+DB PRESS plus)

Perl徹底攻略 (WEB+DB PRESS plus)

ISUCON3 予選参加報告

結果

暫定14位で本戦出場できることになったので、前回よりは進歩したかと思います。
既に @__kan さんと @bonnu さんがエントリをあげていますので、ポイントよりも推移に関してログを抜粋して行こうかと。

前日まで

チャンネルを作り、ざっくりと「個別の環境を作って、自分がやっている改善施策を共有しつつ3並列で違う事を試していく」という方針を決めた。

[13/09/30 11:47:18] まいんだー: まいんだー がタイトルを "ISUCON対策会議室" に設定しました
[13/09/30 11:48:19] Satoshi Ohkubo: 当日集まってやりたいっすね
[13/10/03 16:26:10] まいんだー: 土曜日の飲酒を禁止といたします!
[13/10/03 16:27:01] Satoshi Ohkubo: そっすねー。体調整えてきましょう。
[13/10/03 16:28:50] ふしはらかん: 我々の作業の流れとしては、口頭とこのチャンネルでやりとりしつつ
[13/10/03 16:29:07] ふしはらかん: 全員で↑のインスタンスにSSHで入って作業する、みたいな感じになるですかね?
[13/10/03 16:32:44] まいんだー: 個別にAMI起動してもいいですけどね。
[13/10/03 16:49:31] ふしはらかん: そういえば、これちょっと気になってたのだった http://twitter.com/fujiwara/status/385672841355468800
[13/10/03 16:49:41] ふしはらかん: が、そもそもそこまで最適化できるのかがまず壁かw
[13/10/03 16:50:01] まいんだー: failしないことですね。
[13/10/03 16:50:08] まいんだー: 我々前回死んでるから。
[13/10/03 16:50:08] Satoshi Ohkubo: いかにシングルでパフォーマンスを上げるかw
[13/10/03 16:50:19] まいんだー: 同じアプローチを取らないように
[13/10/03 16:50:24] まいんだー: 3並列でいろんな事をためす
[13/10/03 16:50:42] ふしはらかん: 完走して負けるのは仕方ないけど、不戦敗はしない、をとりあえず目標に
[13/10/03 16:50:50] Satoshi Ohkubo: はい。
[13/10/03 16:50:59] ふしはらかん: そうですね、何やるかは示し合わせつつやってきましょう

1日目

何か情報が出てこないものかとタイムラインをちょいちょい見ていました。
この時点では当然ながら情報が何も出てこないので、目指すべき数値みたいなのを共有するにとどまっている。

[13/10/05 17:30:07] まいんだー: ISUCON情報が全然出てこない。
[13/10/05 17:31:05] ふしはらかん: まあ、当落と順位以外しゃべっちゃ駄目って言われてますしねえw
[13/10/05 18:18:29] まいんだー: 1位 : 33830.4点
5位 : 19412.5点
10位 : 9061.7点
[13/10/05 18:18:30] まいんだー: うーむ
[13/10/05 18:20:56] まいんだー: 当落スコアとしては2万を最低ラインと考えて、まずはそこを目指しましょう。
[13/10/05 18:22:04] ふしはらかん: うい
[13/10/05 18:22:33] まいんだー: デフォで1000〜3000くらいみたいな話だったので
[13/10/05 18:22:52] まいんだー: やはり前回同様かなと。
[13/10/05 18:29:16] ふしはらかん: 予選だし、ある意味前回の復習的な感じなのかも
[13/10/05 18:30:59] ふしはらかん: お、walf443のpixivチーム勝ち抜いとる
[13/10/05 21:32:50] まいんだー: 勝たねば。
[13/10/05 21:36:41] まいんだー: 山形組強いな。

2日目午前

開始時点ではこんな状況、当日にカード登録を変えたのでインスタンスが起動できないというしょうもない事態が発生し、隣の @Yuryu に助けてもらってインスタンスは無事作ることができた。
インスタンスの起動まで確認できていたから、登録を変えるみたいなことをする必要はなかった、余計なことはしない方がいい。。

[13/10/06 8:35:33] Satoshi Ohkubo: おはようございます。
体調もよく、これからスタジオに向かいます。
[13/10/06 9:56:53] ふしはらかん: すみません、まさかの現時刻起床です……
[13/10/06 9:58:11] Satoshi Ohkubo: おお
[13/10/06 9:58:49] ふしはらかん: えっと、作業等考えると、このまま自宅からリモートよりも会社向かったほうが良いですかね?この時間なら
[13/10/06 10:03:25] Satoshi Ohkubo: たぶん最終的には効率がよいと思いますー
[13/10/06 10:03:52] ふしはらかん: 了解です。とりあえず向かいます

ということでアプリケーションを読んだりサーバの状態をちょこちょこ調査開始

[13/10/06 10:47:18] まいんだー: my $memos = $self->dbh->select_all(                                                                                     
    sprintf("SELECT * FROM memos WHERE is_private=0 ORDER BY created_at DESC, id DESC LIMIT 100 OFFSET %d", $page * 100)
);                                                                                                                      
if ( @$memos == 0 ) {
[13/10/06 10:47:22] まいんだー: これは遅い。
[13/10/06 10:59:17] まいんだー: 我々はひとまずdiffとか貼ってく方向で。
[13/10/06 11:00:07] Satoshi Ohkubo: ok です
[13/10/06 11:04:29] まいんだー: どこからも呼ばれてなさそうなupdate文消した。
[13/10/06 11:04:38] まいんだー: last_accessだったか。

この時点でのベンチ結果はこんな感じ

[13/10/06 11:07:23] まいんだー: [isucon@ip-10-121-12-154 ~]$ sudo isucon3 benchmark                                  
Result:   SUCCESS                                                                    
RawScore: 1242.0                                                                     
Fails:    1                                                                          
Score:    1242.0                                                                     
[OK] 結果を管理サーバに送信しました

このあと --init で DB の中身を事前に変えるなどをやり始め、1387までスコア改善

[13/10/06 11:44:15] まいんだー: [isucon@ip-10-121-12-154 ~]$ sudo isucon3 benchmark --init /home/isucon/initialize.sh
Result:   SUCCESS                                                                    
RawScore: 1387.8                                                                     
Fails:    0                                                                          
Score:    1387.8                                                                     
[OK] 結果を管理サーバに送信しました
[13/10/06 11:44:17] まいんだー: もう一歩
[13/10/06 11:44:28] まいんだー: [isucon@ip-10-121-12-154 ~]$ cat initialize.sh                                                       
#!/bin/bash                                                                                          
mysql -uisucon isucon -e 'select * from memos' > /dev/null;                                          
mysql -uisucon isucon -e 'select * from users' > /dev/null;                                          
mysql -uisucon isucon -e 'alter table memos add index id_and_is_private_idx(is_private)' > /dev/null;
[13/10/06 11:44:30] まいんだー: こんな感じ。
[13/10/06 11:45:25] ふしはらかん: あー、一応あっためてるんですかね>mysql

でも暖め自体には意味がない感はいまになって振り返るとあるなぁ...
そして @bonnu さんが nginx 化

[13/10/06 11:52:19] Satoshi Ohkubo: nginx にしたもの
[isucon@ip-10-121-28-177 ~]$ sudo isucon3 test
Result:   SUCCESS 
RawScore: 2683.8
Fails:    0
Score:    2683.8

ここから、 @kan さんが markdown の所、自分がキャッシュを活用するような改善施策に取り組み始める。

[13/10/06 11:53:26] ふしはらかん: markdownのとこ弄ってみようとしてます
[13/10/06 12:14:08] まいんだー: index貼ったら改善。
[13/10/06 12:17:26] まいんだー: keyで引いてるところをmemd化するのやります。

そして、ここまでの施策をぜんぶまとめて @bonnu さんが適用した結果、2742まで進捗。

[13/10/06 12:20:48] Satoshi Ohkubo: 微妙ですけど
Result:   SUCCESS 
RawScore: 2742.5
Fails:    0
Score:    2742.5

そして次の手として @bonnu さんがプロファイリングを取り始め、自分は Starman 以外に差替えて試すなどをやってみた。
結論からいうと Starman を変える必要はなかった。

[13/10/06 12:21:37] Satoshi Ohkubo: まだその程度です。このあと nytprof & starlet 試してみます
[13/10/06 12:26:05] ふしはらかん: むう、いかにも遅いかと思ってmarkdown化の処理をText::Markdown::Discountにしたものの、大してベンチ変わらず
[13/10/06 12:26:18] ふしはらかん: そもそも、ここは結果をいかにキャッシュしないと、みたいな話ですね
[13/10/06 12:27:31] まいんだー: starletizeしてベンチ中。
[13/10/06 12:27:40] ふしはらかん: Text::Markdown::Discount を cpanfileに書いて carton install して
[13/10/06 12:28:11] ふしはらかん: Isucon3::Web の sub markdown を削除して、use Text::Markdown::Discount 'markdown' でいけまする
[13/10/06 12:28:37] まいんだー: starlet化してもさしてかわらず。
[13/10/06 12:30:17] まいんだー: monocerosも入れてみた。
[13/10/06 12:30:27] まいんだー: 裏でkanさんの施策取り込んでみます。
[13/10/06 12:30:34] まいんだー: の裏で更にmemd化を進めてみる。
[13/10/06 12:30:55] ふしはらかん: おっす。自分もうちょいコード読んでポイント探します
[13/10/06 12:32:00] まいんだー: starmanが一番スコア良さそう。
[13/10/06 12:32:22] Satoshi Ohkubo: かなり誤差っぽいっすね。。
[13/10/06 12:32:30] Satoshi Ohkubo: starman <-> starlet
[13/10/06 12:32:39] まいんだー: 差替えの意味はなさそうです。
[13/10/06 12:32:43] まいんだー: やはりセオリーというか歴史に学んでいくしかない。
[13/10/06 12:34:20] まいんだー: 「アプリに処理させたら負け」

この辺の時間で「できるだけキャッシュさせ、必要なら暖める」みたいな方針が見え始める。
まだ時間に余裕はあるからと、キャッシュ化を考えながら、ミドルウェアでもいろいろ出来ないかというところも併せてやっていた。

[13/10/06 12:41:19] まいんだー:   location ~ ^/(images|js|css)/ {
        rewrite_by_lua 'ngx.sleep(2.5)';
        root ../../../staticfiles;
    }
[13/10/06 12:41:25] まいんだー: これをnginxの設定にいれてtestしてみます。
[13/10/06 12:45:39] まいんだー: kazeburoさんの http://blog.nomadscafe.jp/2012/11/isucon2-5.html にあったやつ。
[13/10/06 12:53:10] まいんだー: その前にちょっと OpenRestyで静的ファイル返すのにdelay仕込むkazeburoメソッドを試してます。
[13/10/06 12:53:13] まいんだー: インストールして起動するだけなので。
[13/10/06 12:58:01] まいんだー: うーん
[13/10/06 12:58:08] まいんだー: 画像とかjsそんなに遅くない予感。
[13/10/06 12:58:11] ふしはらかん: nrhd
[13/10/06 12:58:16] まいんだー: openrestyでベンチ中。
[13/10/06 12:58:19] まいんだー: ウヒーダメポ
[13/10/06 12:58:21] まいんだー: 意味なし。
[13/10/06 12:58:26] まいんだー: ということでmemd引き続き。
[13/10/06 12:58:36] ふしはらかん: うい

というのをやってみたものの sleep を入れたらむしろダメだったので、この案は早々に廃止して元に戻した。
このタイミングで、会場にいた全員でランチを取り、状況やらを軽く共有しつつ歓談。Pariya のお弁当は大変おいしゅうございます。

2日目午後

ボトルネックになるリクエストをちゃんと絞り込んでなかったので、改めて「遅いリクエスト」に絞り込んで行く作業を開始。

[13/10/06 13:37:02] まいんだー: /memo/41246 HTTP/1.1" 200 0.103
[13/10/06 13:37:12] まいんだー:  /memo /recent に絞るべき。
[13/10/06 13:37:18] まいんだー: 50ms or die.と戦おう。
[13/10/06 13:37:29] ふしはらかん: おっすおっす

そして粛々とプロファイリングしていた @bonnu さんの共有が上がってくる。

[13/10/06 13:41:21] Satoshi Ohkubo: 本日の nytprof 情報です(ほぼデフォルトコード)
[13/10/06 13:41:22] Satoshi Ohkubo: http://bonnu:8080/isucon/html/index.html
[13/10/06 13:41:34] ふしはらかん: bonnu++
[13/10/06 13:41:37] ふしはらかん: あざす!

ここいらで、方針が一本化されつつあったので、git化して全体で足並みを揃えて進めることに。

[13/10/06 14:40:51] ふしはらかん: なんか、手元であんまり結果が変わらんのですが、超ざっくりrecentキャッシュ版をpushします
[13/10/06 14:41:00] Satoshi Ohkubo: ++
[13/10/06 14:41:11] まいんだー: ああ
[13/10/06 14:41:15] まいんだー: まだキャッシュしてなかったんですね
[13/10/06 14:41:20] ふしはらかん: done
[13/10/06 14:42:04] まいんだー: 見ました
[13/10/06 14:42:09] まいんだー: 完全に手法が一致。
[13/10/06 14:42:13] ふしはらかん: www
[13/10/06 14:43:28] まいんだー: 50ms or die.的にはまだ厳しいですな〜
[13/10/06 14:43:48] まいんだー: $ sudo isucon3 benchmark --init /home/isucon/initialize.sh
Result:   SUCCESS                                                                       
RawScore: 3376.8                                                                        
Fails:    0                                                                             
Score:    3376.8                                                                        
[OK] 結果を管理サーバに送信しました

ここからスコア6000くらいまでは、じわじわとキャッシュ策並びにプロファイリング結果からのコード修正を行っていった。
更に warm up するような施策を入れたのもこの辺。

[13/10/06 16:30:11] まいんだー: [isucon@ip-10-121-12-154 perl]$ sudo isucon3 benchmark --init /home/isucon/webapp/perl/initialize.sh
Result:   SUCCESS                                                                                   
RawScore: 6018.3                                                                                    
Fails:    0                                                                                         
Score:    6018.3                                                                                    
[OK] 結果を管理サーバに送信しました
[13/10/06 16:33:27] まいんだー:  /memo は lognest request で 36ms
[13/10/06 16:33:42] まいんだー:  /recent が
[13/10/06 16:33:44] まいんだー: 0.319 "GET /recent/110 HTTP/1.1
[13/10/06 16:33:46] まいんだー: やはりツライ。

この時、warm upしているのに遅いリクエストがあってなんでだろうと思って調べ始めた。

[13/10/06 16:37:12] ふしはらかん: ぐぬ、何故かwarmup適用後のほうがスコア下がった……>手元
[13/10/06 16:43:09] まいんだー: memcachedからキャッシュが溢れてる疑惑があるので
[13/10/06 16:43:20] まいんだー: 64mだと足りないだろ。。。
[13/10/06 16:43:48] ふしはらかん: うひ
[13/10/06 16:43:52] まいんだー: 8000mまで上げてみました。
[13/10/06 16:44:15] Satoshi Ohkubo: CACHESIZE="8000"
[13/10/06 16:44:18] Satoshi Ohkubo: ですか
[13/10/06 16:44:24] Satoshi Ohkubo: /etc/sysconfig/memcached
[13/10/06 16:45:04] まいんだー: よっしゃ100ms over目立たなくなってる!
[13/10/06 16:45:08] ふしはらかん: ooo
[13/10/06 16:45:26] まいんだー: これは期待。
[13/10/06 16:45:31] ふしはらかん: dkdk
[13/10/06 16:45:48] まいんだー: [isucon@ip-10-121-12-154 perl]$ sudo isucon3 benchmark --init /home/isucon/webapp/perl/initialize.sh 
Result:   SUCCESS                                                                                    
RawScore: 7891.3                                                                                     
Fails:    0                                                                                          
Score:    7891.3                                                                                     
[OK] 結果を管理サーバに送信しました
[13/10/06 16:45:49] まいんだー: きたー
[13/10/06 16:45:54] ふしはらかん: YATTa!!
[13/10/06 16:45:57] Satoshi Ohkubo: ooo!
[13/10/06 16:46:30] まいんだー: evicted_unfetched
evictions
[13/10/06 16:46:32] まいんだー: が出てて
[13/10/06 16:46:34] まいんだー: もしかして?
[13/10/06 16:46:36] まいんだー: と思った。
[13/10/06 16:51:09] ふしはらかん: ここから、もうひとのびさせたいすね

この後の「ひとのび」は @bonnu さんが地道にプロファイリング結果を解析していった所が大きく、特に uri_for あたりのコストを削減したことが大きい。
最終的には遅くなりそうなところをぼちぼち潰して行って、じわじわとスコアをupさせ、10787.2でフィニッシュ。

[13/10/06 17:39:41] Satoshi Ohkubo: 10745
[13/10/06 17:39:42] まいんだー: ++
[13/10/06 17:45:39] まいんだー: nihenさんとかこの時間に革命的な事が起こったとか言ってるしまだいける。
[13/10/06 17:47:51] Satoshi Ohkubo: Result:   SUCCESS 
RawScore: 10774.9
Fails:    0
Score:    10774.9
[OK] 結果を管理サーバに送信しました
[13/10/06 17:48:05] Satoshi Ohkubo: びみょうーに 10774.9
[13/10/06 17:48:09] Satoshi Ohkubo: あげてます
[13/10/06 17:48:16] ふしはらかん: bonnu++
[13/10/06 17:48:23] まいんだー: さすが夜にさしかかってきたから
[13/10/06 17:48:27] まいんだー: bonnu++
[13/10/06 17:48:44] ふしはらかん: 18:00-4:00とかのスケジュールなら圧勝だったか……
[13/10/06 17:55:22] Satoshi Ohkubo: 2013/10/06 17:55:14 done benchmark
Result:   SUCCESS 
RawScore: 10787.2
Fails:    0
Score:    10787.2
[OK] 結果を管理サーバに送信しました

最初のアプリ構成から大きく変えていないので、workloadを最適な値にしてスコアが出せれば、この状態でももっと伸びただろうと考えられる。
ちょっともったいないことをした。。。

17時頃までスコアが伸び悩んでいた原因は、ログや計測まわりの流れを作るのが遅れたことだと考えられる。
まだ本戦が残っているので、この辺の反省を踏まえて効率よく進めたい。

引き続きよろしくお願いいたします。

YAPC::Asia 2013 で Best Talk Awards 第2位いただきました。

まとめ

世界最大級のPerlの祭典「YAPC::Asia 2013」に参加&トークして来ました。
そして参加者の投票で決まるBest Talk Awardsにて第2位をいただきました!
60個近いトークの中での2位です!ありがとうございます><

第2位賞品は「国内技術カンファレンス(Perlに限らない)への参加費用補助」ということで、Perlに限らない国内のカンファレンスへの参加が出来るそうです。
他の言語カンファレンスあまり詳しくないので、おすすめがあれば id:myfinder 宛にメンション飛ばしていただけるとありがたいです><

昨今仕事はOpsを主軸としていますが、蒙古タンメン中本にハマったせいでだいぶDevってしまったので、来年までにまた巻き返したいと思っております。

今回の YAPC を振り返って「もっとこうしておけば」と思った点として、BOFにもっと行っとけばよかった!!という思いが強いです。次回があれば、是非交流の機会をもっと積極的に取りに行きたいです。
毎年良い刺激を受けることができる YAPC::Asia は素晴らしいイベントだと常々思っております。

自分以外のトークについて

perl な web application のためのテスト情報 id:soh335

「フルテストも50msで〜」の前半が完全にかぶっており、急遽前半部分をバッサリ切り落とすトーク構成に変えることになりました。
そのくらい、Perlのテストに関しては高度でよくまとまっているトークなので、ぜひチェックすると良いでしょう。

PSGI/Plack・Monocerosで学ぶハイパフォーマンスWebアプリケーションサーバの作り方 id:kazeburo

前のエントリで気になっているトークとして取り上げましたが、参加前に考えていた以上に踏み込んだ話を聞くことが出来ました。
Webアプリケーション運用しているオペレーションエンジニアは要チェックです。

本当にあったレガシーな話 id:lestrrat

10年以上続くサービスをモダンに作り変える苦労は想像して余りあるほどお察しいたす次第です。
ちょっと頑張れば変えられるものについてはためらわず労力をかけてやっていかないと、どんどん改善が難しくなっていくなという教訓が得られました。
自分が見ているシステムについては、そのような状況を回避していけるよう、追随出来るところは積極的にやりたいと改めて思い直しています。

自分のトークについて

Perl and Riak

下のリンク先も、併せてご覧下さい。
http://yapcasia.org/2013/talk/show/0747d85e-c6c5-11e2-80df-039a6aeab6a4

絶賛挑戦中ですが引き続き進捗があればカジュアルでもシリアスでもアウトプットしていければと思ってます。
あとダイコーン時代はやくこい。

フルテストも50msで終わらせたい

下のリンク先をご覧下さい。
http://yapcasia.org/2013/talk/show/767463b0-d8fd-11e2-971a-72936aeab6a4

こちらが Best Talks Awards で評価いただいたトークでした。
先日のエントリでこの話をする根拠となった問題意識については書いたのでこれ以上ここで言うことはないのですが、聞いていた id:songmu さんが

というtweetをしてくれたのを見て、伝えたいことは伝わったのかなと感じました。
「高速なテストは開発文化を変えます」

おわりに

941さん牧さんを始めスタッフ/ネットワークチームの皆様、スピーカーの皆様、参加者の皆様、たのしいお祭りをありがとうございました。
来年以降の運営はまだ未定のようですが、貢献できることがあれば積極的にやりたいと考えてます。

YAPC::Asia 2013 で PerlプロダクトのテストとRiakについてはなします #yapcasia

YAPC::Asia 2013 とは

アジア最大級の規模の Perl のカンファレンスです。
Perl のカンファレンスですが運用、プロトコル、テスト等開発に関わる様々なトークがあり、和気あいあいとした雰囲気でときには意識高い話もしつつ、ゆるふわにPerlとその周辺技術等への学びや発見を得る事が出来ます。
参加チケット購入はは 8/11(日) #明日!!! までですので詳しくは http://yapcasia.org/2013/ をまず見に行ってください。

フルテストも50msで終わらせたい

下のリンク先をご覧下さい。
http://yapcasia.org/2013/talk/show/767463b0-d8fd-11e2-971a-72936aeab6a4

ではちょっとさみしいのでこのトークを応募した経緯を書いてみます。

自分は仕事で、ワンプロダクトで大きめのPerlアプリケーションを運用しています。
小粒なプロダクトが多く並ぶ環境と違って、ひとつのモノリシックなWebアプリケーションが運用されているとお考えください。
そういったプロダクトでテストを書いたりしていくと、どうしてもフルテストの実行に時間がかかるようになってきます。
最初は数十秒〜数分だったテストも、積み上がると数十分になり、だんだんとテストの実行が億劫になってきます。
億劫になると、人は徐々にフルテストを実行せず、自分の変更範囲のテストファイルを走らせただけで deploy したりするようになってきます。
そうなると、自分の行った変更によって他の人の実装に悪影響が出ていることが仮にあったとしても気付けないままリリースされ、障害となって返ってくる事が多くなるでしょう。

また、開発に携わる人数が増えてくると、相応に開発用に切る branch の数も増えてくるのは必然かと思います。
そうなってくると、ただでさえ時間のかかるフルテストを、単独の CI サーバだけで実行するのは大変厳しくなってきます。

こういった状況/問題意識を踏まえ、自分が関わるシステムでどのように高速にテストを回せるようにしていったかというところについて今回トークをすることにしました。

Perl and Riak

下のリンク先をご覧下さい。
http://yapcasia.org/2013/talk/show/0747d85e-c6c5-11e2-80df-039a6aeab6a4

ではちょっとさみしいのでこのトークを応募した経緯を書いてみます。

memcached以降、KVS はここ数年、様々な実装が出てきて人々を悲喜こもごもの渦に巻き込んでいます。
様々な実装というだけあって、多種多様な NoSQL 実装が出てきており、プロダクションに投下されていっています。
そんな中で私は Riak に注目し、それを Perl アプリで稼働するプロダクション環境に投下すべくいろいろやってきたことが溜まってきたので、この際総括しておこうということで今回トークすることにしました。

まとめ

YAPC::Asia 2013 のチケットは 明日(8/11) に販売終了なのでまだ買っていない人は
http://yapcasia.org/2013/
へアクセスして今すぐ買いましょう。

YAPC::Asia 2013 にて採択されたトークと、気になっているトークについて

YAPC::Asia 2013 に submit していたトークが採択されました&気になってるトークについて書きます。

自分の予定トーク

プロダクトが大きくなってくると、フルテストの実行が遅くなってリリースサイクルが遅くなり、ビジネスチャンスを逃したりやる気がなくなったりしますよね。
このトークでは、そういったプロダクトのテストの類型やCI、更にタイトルにある通りどのようにフルテストを高速に回しているかといったところをお話します。

今年から Riak を徐々に使い始めているので、その流れで得られた知見やアウトプットしたものの総決算的なトークにする予定です。
YAPCまでに打つ予定の新たな施策も内容に含められればと思ってます。

同僚のトーク宣伝

FreakOut 期待の若手 id:cou929 のトークです、Riakのウラ番組なので、Riakには興味ないけどこの時間どこに行ったらいいのかお悩みの方、是非こちらへ。

同僚の id:hiratara さん。一部で物議をかもしている "型" についてのトーク。hirataraさんのプログラミングに対する知見はレビューでお世話になっています。

個人的に気になっているトーク

Monoceros のローレベルな部分に踏み込んで解説が行われるのにとても関心があり、是非聞きたいです。

リポジトリの中には書き捨てたままのツールスクリプトがあったりするのは稀によくあることだと思います。このトークで改善アプローチについて聞けることを期待してます。

サーバ管理ツールは悩ましい問題で、特に自社データセンタとクラウドの併用あたりやメトリクス収集関係についてチェックしたいなと思ってます。

テストのトークをsubmitしているので、今年のYAPCはサーバ管理やテスト周りについて特にキャッチアップ出来ればと思っており、特に単体テストを超えた所のお話を是非伺いたいです。

はてなさんのサーバ管理ツール話と合わせて、今後のサーバ管理周りに活かしたいなと考えてます。