ひとりISUCONしてみた

自分の実力だけで何点出せるのかチャレンジしたかったので、公式の解説や予選参加者のエントリーを読むのは我慢して頑張ってみた。言語はPerl

https://github.com/nkwhr/isucon4-qualifier

結果

11:34:06 type:info      message:finish benchmark workload: 10
11:34:11 type:info      message:check banned ips and locked users report
11:34:12 type:report    count:banned ips        value:688
11:34:12 type:report    count:locked users      value:4703
11:34:12 type:info      message:Result not sent to server because API key is not set
11:34:12 type:score     success:215325  fail:671        score:46514

一応予選のクリアラインは突破出来た。ただ二日に分けて計10時間くらいやっていたのでアウトだけど・・・

やったこと

  • 静的ファイルをNginxで返す
  • カーネルパラメータのチューニング
  • セッションがファイルに保存されていたのでmemcachedに変更
  • StarmanをStarletに変更
  • MySQLをRedisに置き換え

他の人の実装見てみたら大体みんな同じことしてた。

感想

予想していたより高いスコアを出せたのは嬉しいけど、見積っていた時間の倍くらいかかってコーディング力が低さを痛感した。

ログイン履歴とレポート周りはMySQLを捨てて、Redisのソート済みセット型を使った方が良さそうだとすぐに思いついたんだけど、いざ書き始めると細かいミスでエラーを量産したり、初期ダミーデータのことを考慮してなくてFAILしまくったり、MULTIを使って書き込んでいたらレポートの集計が合わなくなったりと、自分で書いたコードのデバッグに時間がかかり過ぎた。0.3%くらい/mypageのIPアドレスが合わない原因が未だに分かってないし。

本当に予選に出ていたとしたらパニックって完走できないままFAILしていたと思う。そして何よりミドルウェア周りのチューニングがほとんど出来なかったのが悔しい。この後2時間くらいNginxやRedisをチューニングしてみたけど大してスコアを延ばすことは出来なかった。

チャレンジしてみて得られた知見

  • 無理にローカルで開発してデプロイするより、サーバ上で直接コードを書き換えた方がいい
  • カーネルパラメータのチューニングは大事
  • Redisのconfはチューニングするメリットがあまりない (Redisがボトルネックになっている場合は効果があるかもだけど、1台で色々動いていると無い気がする)
  • RedisRedis::Fastに変えると2000くらいスコアが伸びた
  • Time::Pieceの代わりにTime::Momentを使ったら期待に反して2000くらいスコアが落ちた