その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

ISUCON 3 予選回顧録

ISUCON 3 の予選に出場してきました。そして敗退しました。
全然全然全然全然駄目で駄目な感じでした。
スコアが上がらねえのなんのってもう惨敗でした。

やったことを時系列順に書くとこんな感じ。ちなみに言語はPerlです。

  • とりあえずベンチ走らせてみる
  • mysqld の CPU 使用率がトチ狂っているので、真っ先にここを直した方が良いと指摘
    • インデックスの張り忘れでは? という事で EXPLAIN で確認しようぜ、というのを@さんに任せる
    • ついでに my.cnf 弄ってスロークエリログを吐くようにする
    • mysqld をリスタートする
    • mysqld リスタートすると、プロセス上では起動できてるしコンソールでもログイン出来るんだけど、アプリ側が "MySQL Server has gone." とかエラー吐いて mysqld を認識しなくなる
    • 誰かが言い始めた「しかたねえから再起動しようぜ」
    • とりあえずそれでなんとかなる (なんとかなってない)。追って原因特定してなんとかしようや、という事になる。
  • Apache のプロセス見てみると5個くらい Worker が立ち上がっててそんないらんのでは、という事になる
    • あと、静的ファイル配信とかもしてないっぽかった
    • Apache よくわからんから Nginx にしようぜ、という最悪の舵切りを行う
    • Nginx に切り替える。ついでに Worker は1個に
    • 静的ファイル配信も Nginx 側にやらせることにする
    • スコア上がったので「イケるで!!!」みたいな感じになる
  • my.cnf をチューニングし始める
    • 秘伝のタレ的なものを引っ張ってきて、それをベースにチューニングした
    • 「した」っていうかしたかったんだけど、前述の「再起動しないと駄目問題」にブチ当たって厳しい感じだった
    • 本来ならリスタートしてベンチとって、スコア上がるかどうかみたいなの見たかったけど、その為には再起動しなきゃ駄目みたいなクソな感じだったから泣く泣く「想像」でやる。最悪でしかない。
    • それでもスコア上がったので「イケるで!!!」みたいな感じになる
  • SQL のクエリにあらかた INDEX が張られる
    • CPU 使用率が下がる
    • スコア上がったから「イケるで!!!」みたいな感じになる
  • なんかここら辺から、ベンチ結果が奇妙な FAIL を返却し始める
  • 誰も手を付けていなかったアプリケーション周りに取りかかる
  • Markdown を生成する部分が、外部スクリプトをバッククォートで呼ぶという最悪な仕様だったので直そうとする
    • つうかログ見てみてらこの Markdown を生成する部分呼ばれまくってる
    • モジュールでなんとかしようや、という機運になる
    • Text::Markdown::Discount は使用経験があったので使ってみる
    • 「スコア上がらんやんけ!!!!!!!!!!!!!!!」
    • (後の @ さんの話によると「Text::Markdown::Hoedown だとスコアが2kくらい上がったとのこと」)
    • 「死ぬか~~~~~~~~~~~~~~~~」って感じになる
  • 気を取り直して、"/" にアクセスが来た時にいちいち Users 引きに行ってるのを見た
    • これキャッシュしようや、という感じになる
    • memcached (実際は memcached では無かったんだけど) にキャッシュするように書き換える
    • 「スコア上がらんやんけ!!!!!!!!!!!!!!!」
    • キャッシュ戦略間違えた
  • 気を取り直して、他の部分でも Users 引きに行ってる部分をキャッシュ
    • 「スコア上がらんやんけ!!!!!!!!!!!!!!!」
  • 他の部分も「キャッシュじゃーーーーーーーーーーーーーーーーーーーーーーーー」という感じでキャッシュする
    • 当てずっぽうにキャッシュしても当たるわけがない
    • もちろんスコア上がらず
  • このあたりで僕が「帰ろう」とか「人間はもう終わりだ」とか言い始める
  • 「酒飲みたい」とかも言った
  • 半ばヤケクソで Starlet 化を提案
    • @ さんにやってもらう
    • 微妙にスコアが上がるものの焼け石に水感が否めなく、テンション上がらず
  • あえなく終了


そんな感じでした。
僕は主にインフラとミドルウェア周りを担当していたんですが、結局アプリケーションも弄ってました。
これ本当に失敗で、役割分担しっかりできていなかったの最悪としか言えなかった。
まあ、濃密なコミュニケーションの甲斐あって同じ部分を複数人が担当している、という事はありませんでしたが……

反省点としては

  • 役割分担が上手く行ってなかった
  • SQL でなんとかできる部分あったのに、そこが上手く行かなかったの SQL 力の不足だとしか言えない
  • ログを集計するスキルが足りなかった。ログを基にしてチューニングする、って言うのが上手に出来なかった
  • 切羽詰まってくると、「計測」してそれに基づいて対処するのではなく「想像」でごにょごにょやったしまったから最悪だった
  • 明らかになっている問題はその時点で直さなければ駄目 (今回だと mysqld 再起動問題)。後でやろうはバカ野郎。


いやーしかしマジで mysqld 再起動問題、最悪でした。これなんだったんだ……
もっと my.cnf チューニングする余地あったと思う。ああああ……


最後に非常に英知に富む発言を引用して締めくくります。
f:id:moznion:20131008232906p:plain

また来年お会いしましょう