ひとり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台で色々動いていると無い気がする)
- RedisをRedis::Fastに変えると2000くらいスコアが伸びた
- Time::Pieceの代わりにTime::Momentを使ったら期待に反して2000くらいスコアが落ちた