読者です 読者をやめる 読者になる 読者になる

ISUCON5本選に参加しました!

いい感じにスピードアップコンテスト(ISUCON)の第5回本選にチーム「chatzmers」で参加しました!

isucon.net

with @Maco_Tasu and @m0t0k1ch1

予選を無事に突破し、本選に参加してきました。

やったこと

問題の形式は

  • 各チーム3台のマシンが与えられ、その全てで同じアプリケーションが起動している
  • benchmarkは実行時に指定した1台に対して実行される
  • 3台すべてを使う必要はない

という感じです。
アプリの内容は予選よりも軽めで、幾つかの外部サービスAPIをユーザー指定のクエリで定期取得するというもの。
データ表示用の画面の他に、クエリ設定画面、ログイン/signup画面などが実装されていました。
初期ベンチは1000点前後。

とりあえず1台でkey-pairを作り共有。
全台にsshできるようになったところでnsshを利用してtool類を整備していきました。

postgresql -> mysql

この辺でアプリを眺めてた@MacoTasuが「mysql繋げない」と。
どうやらmysql-serverも動いてる気配がない…ってpostgre?! psqlわかんねーぞ…となりました。
slowクエリ見たりindex張ったり、my.cnf的なものはどれぞ?といろいろ不安を感じ、DBをpostgreからmysqlにしてしまおうと大きくかじを切りました。

「初期化されたpostgreからcsvを吐いてmysqlに流す。」と書くとまあ行けそうな感じがしたの。

結果としてはそんなにうまくいくはずもなく、csvの一部になったjson部分をシングルクオートで囲んだりしてた。(Vimのマクロは直感的で便利!!!)
データにはマルチバイトもあったので、csv吐くところか取り込むところあたりで文字化けにも悩まされてスコアを落とすことに…。これは結局どこで起きてたのかわからないまま終わってしまった。
initializeがpostgreの方にかかっていたり細かなミスもあって、一部文字化けしてるけどとりあえずmysqlでアプリが動いたのが15時くらい。

speedup

時間もない中tryしたこととしては

  • 外部APIのendpointのリストをキャッシュ
  • 認証の方式を変更
  • リクエストを1台のnginxで受けてアプリを2台に
  • etc.

初期実装ではsignup時に決定されるsaltとpasswordからsha-512で生成したhash値をDBに保存し、取得時には毎回postgreのdigest()で再計算していました。
ここの計算コストをカットするために単純にmailアドレスのドメイン部分をpasswordとして置き換えてしまい簡略化しました。(レギュレーション的にokなのか?)

あとは外部APIにリクエストするところが一番のネックになっていたので、ここを並列にしようとParallel::ForkManagerでざっくり書いて見るも結局うまく動かせず…。

そうこうしているうちに決定打を打てないままタイムアップとなってしまいました。

振り返り

migrate?

結果から振り返るとDBの入れ替えは良い選択ではありませんでした。
「migrationが思ったより詰まったなぁ」とか「いやそもそもpostgreももうちょいいじれないと…」というのもありましたが、本質的には今回の出題、DBはほとんどネックになっていなかったのです。

推測するな、計測せよ

ですね。

切り戻し

  • 変更は基本的に各自のbranchで
  • 多種の変更を同時に(同じbranchで)行わない
  • push前にbenchが実行中かどうかを確認
  • benchにfailしたもの、スコアが上がらなかったものはmasterに取り込まない

予選では割りとできてたことが全然できてなかったなぁ。
benchのfail率も予選に比べてかなり高くて、心やすまる時がありませんでした。殆どの時間fail見てた。
慌てていろいろやってたらいつの間にか外暗くなっててさらに焦ったり。

使用言語

chatzmersは予選と同様使い慣れたperlを選択しましたが、今回の出題ならgolangとかのほうがスコア上げやすいかなと思ったり。
なんにせよ問題見てからいろいろ選べるようだと強いですね。勉強しよう。
けど

sub hoge : lvalue {}

とか初見だったしperl力もまだまだ足りない…。

success

それでも予選の反省を活かして競技終了前に再起動試験を行い、結果としてはスコアを残すことができました。
激遅ですが僕らのサーバーはリクエストされたページを返します!
これができないと入社1年目に舞い戻ってしまいますのでsuccessできてよかったです。

まとめ

本選も楽しかった!
みんなで同じ会場に集まるのいいですね。ランキング眺めて一喜一憂したり。

練習も含めてISUCONを通してとても良い経験ができました。
出題/運営の皆様には感謝してもしきれません。

次回も参加して、もっとスコアをあげられるよう精進したいと思います。