プログラミングisuconは初回からずっと出ているのでこれで3回目。僕、の3人で出場するのですがお互いの予定の折り合いがつかず、僕は出場できない可能性が出てきました。僕は一人ソロ活動で社外の友人(@gom_oh)や元社員(ttoz)を誘って「うさぎ工房」として予選登録しました。僕自身がOps側である所や、メンバーのプログラマはPerlのPSGI/Plackは初めて触る二人だったので集まって過去ISUCONで自家製ISUCONしたり、クエリ最適化について勉強したりといった準備をしました。結果はスコア的には5300でfinish。ちなみに弊社の本チームである「進撃の超大型パティスリー兄弟」チーム側はなんと総合4位で予選通過!さすがです!若干悔しさもあるけど、弊社から本戦にいく人がいて、本当に嬉しかったです。おめでとうございます!そちら側の詳細はきっと彼らが記事にしてくれるはず。phpMyAdminを立ち上げるまず、MySQL関連の操作でphpMyAdminしか使えない僕はphp5.5をソースコンパイル。ビルドインサーバーとして立ち上げました。0.0.0.0:3000my.cnfを設定APIキー登録して初回ベンチが確認する。初回ベンチですぐにDBボトルネックとわかったので、my.cnfを以下に変更。1342177280インデックスを張りました最終的にはcreated_atとか使ってなかったので無駄だった。;ここらへんで1500くらいだったかな。フロントエンドはVarnishフロントエンドはVarnishを使用。編集や削除はされないようだったので、なんとかリクエストヘッダの値から「ログインしているか否か」を判別して全体キャッシュできないか考えてましたが、リクエストヘッダで判断できる材料がなく、また、Plackとか全然わからないのでヘッダーの修正とかはできませんでした。結局フロントエンド側での大規模なキャッシュは僕の力では厳しそうだったので静的ファイルだけvarnishでキャッシュ。設定の主要部分だけだけど以下のような感じ。(deliver);}スキーマとかSQLの改修ここらへんで2500くらいだったかな。この時でもDBボトルネックはまだまだ明らかでしたのでここでメンバーの@gom_ohがDBに以下の改修を行いました。内容は公開IDの一覧だけのテーブルを作ってtopページやrecentページのDB負荷を削減する、といった感じの修正となります。CHARSET=utf8;'public_idというmemosテーブルでパブリックに公開しているだけのmemo_id一覧を入れるテーブルを作成しました。DESC;上記は初期スクリプトで実行。100);これでスコアが5000くらいになりました。Markdownの結果をmemcacheでキャッシュその他はMarkdownの処理が重かったので、ここだけmemcacheでキャッシュとか、ちまちまして5300くらいに。ポート11211につないでましたが。あとどこかのタイミングでStarmanからStarletに変更しましたがスコア的に動きはなし。最終的にはまだまだDBがボトルネックなまま5300でフィニッシュとなりました。初日に「1位の人とか人間なの?」と思ってたのですが、2日目の弊社メンバーが1位に輝いてて、出先からの発表見てのけぞった。どんな事をしたのか聞くのが楽しみです。競技中も楽しかったのですが、普段なかなか会えない友達や元同僚と集まってお菓子ほおばりながら共通の目的をもって取り組んだ時間が勉強になったし楽しかった。今まで以上にソースを見たりDB構造を見たり、という部分に入っていけたのがよかったです。反省点としては、[READMEをしっかり読んで意識を共有しておけばよかった]workloadがAMI提出時のコマンド入力で気づきました。「ただボトルネック調査の為に負荷を大きくできる」くらいの認識しか持ってなくて(んなわけないのに)、、、試せる事はちゃんと試すべきでした。結果、一度もWorkloadを変更してなかった!![とりあえずperlだろみたいな雰囲気になってた。]やりたい事をちゃんとやれる言語でやる道も検討したらよかったと。PHPで着実なボトルネック修正で予選抜けたところもあってそう思いました。「こうしたら早くなりそう!」→「Perl、、というかPlackって奴でどうやんの。」→「わからん」、のコンボが多かった。ISUCONは参加者は楽しいけど、運営の方々は本当に大変そうで少し申し訳ない気持ちに。運営の皆様本当にありがとうございました。結果を管理サーバに送信しましたちょっとあがった。