時計を壊せ

駆け出してからそこそこ経ったWebプログラマーの雑記

#isucon に参加してきました。

うっかり申し込むのを忘れて、定員に達して出れなくなってたので
ぬーん(´・ω・`)ってなってたんですが、
@walf443さんに誘われたので#isuconに参加してきました!
人数が多い方が有利だとの事だったけど正直足手まといになった気しかしないのは秘密。

#isucon ってなに?

Iikanji Speed Up CONtest の略でISUCONだそうです。
reverse proxy1台、appサーバー2台、DBサーバー1台の構成のWebアプリを
いい感じにスピードアップしてあげるコンテストです。
概要: [ http://blog.livedoor.jp/techblog/archives/66528186.html ]
ソースコード等: [ https://github.com/tagomoris/isucon ]

WHKチームの行動まとめ *1

  • gitが無いと俺達はソースの変更も出来ないのかよ!
    • 無いと怖くてとても出来ない。
  • Perlコードのチューニングだけは一流のところをみせてやるぜ
    • Perlの会社らしくDevel::KYTProfでボトルネック解析。
  • ボトルネックは見える、でもこの対策じゃだめなんだろ?
    • memcachedでDBから取ってきた結果をcacheするようにしたがあまり改善せず。
  • ログを…ログを拾うんだ…!
    • どうやらmemcachedへのstoreがやたら遅いらしい
      • Cache::Memcached::Fast のnewのオプションの nowait => 1 外したら速くなった。
      • ・・・なんで?
  • 押してる・・・分かってる! うぅぅわあああああ!!
    • 時間が押してきた
  • キャッシュが遅れてる!!うぅうわあああああああ!!!
    • memcachedにキャッシュしてた新着コメントのあった記事一覧が遅延してテストがこける
  • あああサイドバーがああああ!!うっっごけええええ!!
    • 遅延してテストがこける
  • ああー!遅いっ!
    • 遅延してテストが(ry
  • 回れ!回らんかああ!
    • キャッシュが(ry
  • フルチューンだぜ 信じらんねぇ(スコアが)

ぼくがやったこと

  • Lunch ngircd
  • Create git repository (and lunch git server)
  • プログラムの粗探し
    • 結果、あんま粗無かった。
      • ぱっと見てconfigがcacheされていなかったように見えたけどそんな事は無かった
    • Text::Xslateのcacheが2になっていなかった。
      • defaultは1で、1だとテンプレートに変更があるかいちいちチェックするので速度が落ちる。
      • でもボトルネックじゃなかった。
  • Cache::Memcached::Fastの高速化(Data::MessagePack & Compress::LZF)
    • 最初はCompress::LZOでやろうとしたけどliblzoがうまくリンク出来なくて諦めた。
      • これでだいぶ時間食ってしまったのは秘密。
  • nginxをフロントエンドにする。
    • PCREがうまくリンク出来なくてハマる。
      • ただのprefixパスのtypoでした。
    • 8080番で試しに待受けてみようと思ったけど立ち上がらない。
      • どうやら8080番で別のサービスが立ち上がってるらしい。
      • どうでもいいけどiptablesってコマンドでいじるものじゃないんですか。。。
    • 結果、 id:kazeburo さんの罠にハマるまでもなく時間切れで撃沈

まなんだこと

  • ボトルネックを正確に特定する事が一番重要。
  • 動的に生成するものは可能な限りキャッシュすべし。
  • 変更はボトルネックに対して局所的に、大胆に。
  • 限られた時間なので行動計画を持つ事は重要。
    • 結構行き当たりばったりになってしまった。
      • もちろんですが自戒です。
  • 情報共有を忘れるな。
    • やってることがconflictすると無駄。
    • やってる途中や、やった後に宣言せず、やる前に宣言しろ。
    • もちろんですが自戒です。
  • keep-aliveは問題の原因になる事が多い

つぎやるときは

  • まず負荷分析
    • ボトルネックを正確に特定する事が一番重要。
    • どこがボトルネックなのかチーム内で相談する。
  • どのようにキャッシュするか考える
    • なるべくアプリサーバーに到達しないのが望ましい
  • OSの把握
    • RedHat系のOSは殆ど触った事が無い上に久しぶりに触ったので焦りました
  • スタートまでに用意すべきものを用意しておく
    • お昼ごはん
    • ircd
    • no paste
    • 同じバージョンのOSの検証用サーバー
    • deployサーバーとdeployツール
      • だれかの環境とかReverse Proxyとかと同居させたりとか。
  • 出来れば用意しておきたいもの
    • サブディスプレイ
      • ときどきIRCを見るのを忘れて没頭するので常に見れるようにしておきたい。
    • プロジェクター
      • なんかかっこいい(プロジェクターで各サーバーのtopを見ているチームがあった)

おわり

最初から最後まですごく楽しかったです!
懇親会の最後に20歳とか言ったらえー!?とか言われてしまいましたが、
次こそはスコアでえー!?と言わせられるように頑張ります。
打倒 id:sfujiwara さん!

蛇足

夜更かし良くない。ねむい。

*1:※内容の一部に語弊があります