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

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

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はサーバ管理やテスト周りについて特にキャッチアップ出来ればと思っており、特に単体テストを超えた所のお話を是非伺いたいです。

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

うわさの yrmcds を CentOS6.4 で動かしたメモ

@ymmt2005 さんの開発した yrmcds の開発シナリオ(何が欲しいのか)を読んで、これは適用出来るシーンがあるんではなかろうかと思い、早速手元で動かして確認してみようとしたので記録。

gcc-4.8.1のインストール

最新のgccが必要なのでまずはそちらからインストールする必要があります。
kawa0810さんのエントリを参考にして、gcc-4.8.1をインストールしましょう。
prefix を /opt あたりに指定して閉じ込めておけば扱いも面倒がないので良いかと思います。

yrmcdsのビルド

ドキュメントの通りやれば良いです。
IPv6 が無効だとビルドは通るけど実行時にコケるので、ipv6.conf を変更して適用しておいたほうがいいです。

$ cat /etc/modprobe.d/ipv6.conf
alias net-pf-10 off
options ipv6 disabled=1 # この行

また、gcc を /opt とかに入れた場合 Makefile の指定を変えたりする必要があるので書き換えましょう。
その他で、nobody/nogroup指定になっていたりするところを直さないと「そんなグループないよ」と言われます。

diff --git a/Makefile b/Makefile
index 343437a..740da3c 100644
--- a/Makefile
+++ b/Makefile
@@ -10,7 +10,7 @@ CPPFLAGS = -I. -DCACHELINE_SIZE=$(shell getconf LEVEL1_DCACHE_LINESIZE)
 CPPFLAGS += -DDEFAULT_CONFIG=$(DEFAULT_CONFIG) -DUSE_TCMALLOC
 OPTFLAGS = -gdwarf-3 -O2 #-flto
 WARNFLAGS = -Wall -Wnon-virtual-dtor -Woverloaded-virtual
-CPUFLAGS = -march=core2 -mtune=corei7
+CPUFLAGS = -march=core2 -mtune=native
 CXXFLAGS = -std=gnu++11 $(OPTFLAGS) $(shell getconf LFS_CFLAGS) $(WARNFLAGS) $(CPUFLAGS)
 LDFLAGS = -L. $(shell getconf LFS_LDFLAGS)
 LIBTCMALLOC = -ltcmalloc_minimal
@@ -40,7 +40,7 @@ install: $(EXE)
        cp etc/logrotate /etc/logrotate.d/yrmcds
        cp etc/yrmcds.conf $(DEFAULT_CONFIG)
        cp $(EXE) $(PREFIX)/sbin/yrmcds
-       install -o nobody -g nogroup -m 644 /dev/null /var/log/yrmcds.log
+       install -o nobody -g nobody -m 644 /dev/null /var/log/yrmcds.log

 #lz4/lz4.c:
 #      svn checkout http://lz4.googlecode.com/svn/trunk/ lz4

yrmcdsの動作確認

/path/to/yrmcds を実行すれば起動するので、telnetとかで動作確認が取れます。

$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats
STAT pid 56124
STAT time 1373377451
STAT version yrmcds version 0.9.0
STAT pointer_size 64
STAT rusage_user 0:75988
STAT rusage_system 0:120981
STAT curr_items 0
STAT total_items 0
STAT bytes 0
STAT limit_maxbytes 1073741824
STAT threads 10
STAT gc_count 1
STAT slaves 0
STAT last_expirations 0
STAT last_evictions 0
STAT evictions 0
STAT last_gc_elapsed 71548
STAT total_gc_elapsed 71548
END
get test
END
set test 0 0 4
hoge
STORED
get test
VALUE test 0 4
hoge
END
delete test
DELETED
get test
END
stats
STAT pid 56124
STAT time 1373377481
STAT version yrmcds version 0.9.0
STAT pointer_size 64
STAT rusage_user 0:205968
STAT rusage_system 0:180972
STAT curr_items 0
STAT total_items 1
STAT bytes 0
STAT limit_maxbytes 1073741824
STAT threads 10
STAT gc_count 4
STAT slaves 0
STAT last_expirations 0
STAT last_evictions 0
STAT evictions 0
STAT last_gc_elapsed 52120
STAT total_gc_elapsed 226951
END

おわりに

statsが取れるので、既存のmemcachedの監視運用ノウハウがそのままつかえるので運用に投下するまでは簡単に出来そうです。
memcachedプロトコル(ほぼ)互換なので、既存のmemcachedクラスタに入れて試験などするのもそれほど苦にならないでしょう。

レプリカ周りはまた別途確認したいと思います。