考える×つくる×動かす

主に技術系のことを書いていきます。

ISUCON2014予選に参加してみた

チーム名:「/^o^\マッミョサーン」
最終スコア:26890
チームメイトはid:kazuphと@kokonoka

詳細はid:kazuphが書いていてくれるので割愛します。


ISUCON2014予選でがんばってきた - 僕の車輪の再発明


9月の頭に昨年の過去問を1回4時間くらいやって傾向と対策を練っていました。

基本的なスタンス

・nginxやmysqlのログを見て遅い部分のボトルネックを解消
・インデックスは貼る前と貼った後のEXPLAINをみながら貼っていく
・DBの構造とかを変更
・ロジックで減らせるクエリは極限まで減らす
ミドルウェアに手を入れたりは最後までしない
・最後にキャッシュ出来る部分はキャッシュする


そのおかげで変なエラーが出てベンチマークとか動かない(´・ω・`)とかなくて
基本的には成功法で攻めることができたはず。

やったこと

・全体のロジックを確認
・3回以上ID,PASSを間違えたipアドレスをブロックするipsテーブルを追加
・10回以上ID,PASSを間違えたユーザーをブロックするunlock_usersを追加
・初期で上テーブルにINSERTする初期スクリプトを作成
・usersに最新ログインの日時+IPアドレスを加えた
・login_logを使わなくした
mysqlの設定ファイルを秘伝のタレを利用した
・自分たちで新たに加えたテーブルにインデックスを貼った
・WORLOADが増えるとTCPでTIME_WAITが発生してPORTが専有されてしまうのを解決した

ハマったところ

・login_logのロジックを確認しつつテーブル分割するかキャッシュを使うか決めきれなかった
→これで午前のほぼ時間を費やしてしまった。。
・お昼ごはんのメニュー(結局寿司食べたく出前とった)
・/loginのエラー時にリダイレクトされるのを減らすためにnginxで静的ページを返したかった
MySQLのバージョンアップ(最後で5.6系に変えようと別インスタンスでテストしたけどエラー出て動かなかった)

反省点

・もっとはじめにベンチ前にく初期投入データを見ておくべきだった(これがランダムだと思ってた)
・全体ロジックを確認してUSERSをキャッシュ化してしまうべきだった
・パスワードのHASH処理を始めに計算にしてDBに入れておくべきだった
・nginxでCookieの値を持ってこれるそしてその値を見て静的ページを返せばよかった
・土曜朝じゃなくて金曜朝に海外から帰ってきて万全の状態で挑むべきだった(言い訳ですがw)


今回基本的にはid:kazuphがほとんどコード書いてくれてた。
自分ももっとさくっと書けるようにならないとと反省。


1年強振りのブログ記事でした。
詳細とMySQLの秘伝のタレに関しては別エントリ書きます。