nakarioのほぼISUCONブログ

ISUCON出るたびブログ書く

ISUCON12予選突破できず無念

予選突破出来なかったけどせっかくなのでやったことを書きます。

僕はチーム「百万円ドリブン」では主にアプリケーションの修正をメインに担当していて、メンバーのaokabiとmurataはそれぞれnginxやmysqlなどのミドルウェア、なんか色々をメインに担当してもらってます。

スコアから書くと14205点でスコア再現性テストで失敗して失格でした。失格については再起動テスト含めて再現性の検証をやっている余裕がなかったので仕方ないとは思ってますが何がだめだったのかは謎のままです。

当日やったこととしては、いつもどおり一通りの計測手法を仕込んだあと、mysqlへの負荷が低すぎるということでsqliteの存在に気づいて、主にaokabiとmurataにsqliteのまま分散 or mysqlへの移行で水平スケーラビリティを確保してもらう方向で動いてもらいつつ、アプリケーションを改善していく方向でやっていました。

ただ、sqliteが通信のオーバヘッドがない分N+1が負荷になりにくいこととかが頭からすっぽ抜けていて、N+1を直したのにスコア変わらないなぁといった感じに空回りしていたなと後になって思います。また、sqlite3で動いていたwindow関数を使ったクエリをmysqlで動かしてみると「ONLY_FULL_GROUP_BYモードが有効だと非集計カラムを参照できない」といったエラーで動かないことが判明して、非効率的なサブクエリとのJOINでなんとか動かすみたいなことをしていたので、こういった情報をちゃんと予習できてなかったなと反省したり(むしろ何で今までのISUCONでこのエラーに遭遇しなかったのかが不思議)。

15:30ごろにaokabiとmurataがmysqlへの移行(/var/lib/mysqlの全置換によるinitialize時間の短縮)を完了してくれて、そこからは各々いつも以上のパフォーマンスを出せたのではないかと思いますが、さすがに時間が足りずスコアが伸び切りませんでした。mysqlサーバを3台用意しておいてinitializeのたびに向き先を変えて、今まで使っていたサーバの初期化を走らせておくっていう副案も抱えていたのでそれをやっても良かったかもですね。競技中はもっとまともな方法で解決できるはずと思っていましたが、たとえ異常な作戦でも有効ならばチャレンジしていく勇気がなければ百万円には届かないのかもしれません。