#isucon 予選、暫定で生き残れたよう。

初めてisuconに参加させてもらいました。 すごい楽しませてもらっています! 坂パスタチーム( code )は1日目6位で、幸い本戦にも参加出来そうです。 またよろしくお願いします!!

運営の方々、ほんとにありがとうございます><

予選が終わってみて思うこと

偏見に満ちていますが、isuconは、 インフラ周りをやっている人が強い印象です。

普段自分がやっていることはアプリケーションが中心です。 もっと言えば、ゲームのイベントや機能を作ったり、 フロント寄りなアニメを作ったりしています。

きっと俺は無惨に殺されるんだろうと思っていました。

やはりダメージを受けましたが、予選をどうにか、、生き延びれたようで、

  • チームメンバーに感謝!
    • id:karupaneruraid:masasuz がいい感じにしてくれるという安心感があったので開発に集中できた!
  • devだけだって、、、できることはある!
    • (もっと頑張らなきゃだけど...)

そんなことを思いました。

予選でやったこと

下準備(2hours)

  • karupaneruraがdeployツールなど足回りを作ってくれる
  • masasuzさんがパフォーマンス計測用のツールやconfなどを把握
  • 自分は、アプリの仕様を把握する
    • コードをいじれる範囲を大きくしたかったので、丁寧に読む
    • コードを読むだけじゃなく、benchmarkによるアクセス傾向とレギュレーションを見て、 硬くいえば、どこまで成果物ができていれば良いかの線引きを把握。
    • 冗長だけど、こんなの書いた。 https://github.com/karupanerura/isucon2013-yosen/blob/master/memo.md

アプリでなんかあれだなーと思った点

下準備を経て、手を入れたいと思ったところ。結構数が挙ってしまった。

  • トップページ( / )や最近追加されたメモページ( /recent/:page ) で、共通して使われていた「メモ抜粋」の項目をまとめる

    • 参照される回数が多かったので、メモ抜粋のデータを取り出すやすくするのは、まずカジュアルだなーと思う
    • usernameをmemosに突っ込もう
      • 実際にアプリとして、運用するならcacheに入れる方が管理しやすいけど、コード書く量多くなるし、キャッシュ層挟んでベンチマークこけるとかはまるのを恐れ、避ける
      • 100件のIN句でRelation作るっていうのもあるけど、usernameの更新機能は無かったので、そこ頑張る必要ないと却下。
    • memos.contentの1行目をmemosにsummaryとして突っ込もう
      • TEXT型だったので、でっかいテキスト持ってくるのやだなーと思った
  • 公開されているメモの件数を表示している

    • 素直な全件COUNT文. やめよう
    • cacheしても良かったけど、まずは、考えることは少ない方がいいので、counter table.
  • メモの詳細ページで、登録されたメモの前後のメモのidを取り出す処理が大げさだった

    • memosを全部取り出していた。おそろしい
  • 最近追加されたメモページのページング処理で、でっかい OFFSET へのアクセスあって、やだなー

  • markdownの処理が、やだなー

  • no index no life

    • memos にINDEXがない。かなしい
    • いい感じの張ってもらいたいなーとmasasuzさんをちらちらする
    • アクセス元を把握するために、テンプレを眺め回ってたら発見。わらた。
    • 他にもないかと、chrome dev toolsのネットワーク見て、変なリクエストないか、見る
  • /signinへのアクセスはない。

    • benchmarkツールのアクセスを見てて発見。わらた。
    • このページのコードをいじる必要はない
    • user,passwdが20文字制限だったので、アプリがリリースした時点から長さが変わっていなければ、VARCHAR(255)は小さくできるなーと思う
  • usernameが存在するかどうかのチェックにusername VARCHAR(255)で検索している。かなしい

    • とりあえず、usernameにhashをかけたカラムを用意しよう
  • 全ページで、user情報がstashされていた。ぬーん。

    • (過去分のメモの詳細をキャッシュに突っ込もうという話があったけど、userデータの扱いを失念していたので、無駄にはまる所だった。あぶない。テンプレ分割すればいいんだけどさ)

飯を食いつつ方針周り話す( 1hour )

  • まずは予選を突破できればいいねと話す
  • アプリではcache層挟んだりせず、素直に駄目なところを改善させてと話す。
  • 15:30過ぎくらいに後半周りのスコアを見て、考えようと後回し
  • つまり消極作戦。
  • frontの置き換えだったり、confのいいかんじの設定をお任せせ><

もくもく( 最後まで )

ほとんど午前中に気づいたことを書くことで終わる 途中色々詰まって、邪魔をする.. orz

  • アプリ側の問題点は結構挙っていたので、実装が間に合わないと嫌だったので、火を見るより明らかな所を直す。

    • どの変更でパフォーマンスが上がったか下がったか分からないと困るので、大人しくbranch切って書き書き。
    • 都度ベンチをお願いする。
    • 完了したら、ローカルのブランチを削除して、branchをtodoリストっぽく扱うw
  • benchmark時に走らせるスクリプトが、うまく動かない、、他の2人にも聞き、結局俺は実装を優先させてもらい、karupaneruraにパス>< すいません

    • 結局、~での指定が悪く、rootユーザでの実行を想定してなかったせいだった、すいませんすいません
  • また自分の変更で、benchmarkこける..焦る、今度は、masasuzさんにいろいろ見てもらう、、すいません

    • refererを教えてもらって、原因を特定、、すいませんすいません。

書いてて、凹んできたw もっとoptsの力があれば、チームの方々の時間を奪わずに済んだろう...

5割くらいは実装できたから、、いいんだ、、本戦頑張る!!

多分本戦であかんかったら、karupaneruraに埋められる。

たられば、よもやま

  • ユーザが登録したメモの前後関係を取るなら、どんなデータを残すのがいいかなーと考える
    • ユーザ毎にメモの登録順序を持つような実装進める

疑似コードはっつけ。

まとめ

もっと点数を伸ばす為には、ドラスティックな変更できる筋力欲しいと思うも、 単純なことを単純にやれる力があることが確かめられて、少し自信になった。 チームでいいお酒飲めるように本戦もがんばろー。

蛇足

早速、坂のパスタ屋に行って来た。うまし!!