ISUCON10に出て予選突破しました
isucon10に「牡蠣の鋭利な殻が指に突き刺さり利き手を負傷」チームで出場し予選を突破したようです。
簡単に当日までにやったことと、当日やったことを書いていきます。
当日までにやったこと
今年は予選通過したいねとチームで話し合い、練習を多く行ってきました。9回ほどれ過去問を解いたと思います。
チームの練習がない時はインフラの設定項目を見たり、デフォルトで設定することをまとめたりしていました。 普段業務では全くインフラをやらないのでいい勉強になりました。(予選で知識不足は痛感しました)
チームで何回も練習を行ったことで当日いい感じに動けた気がします。 特に何かあったときの判断軸が良かった気がします。
当日やったこと
チームの担当としては
- アプリと全体指揮: pinkumohikan
- アプリ全般: キュアセブン
- インフラ(アプリも少し):僕
で行いました。
12:00
競技が開始したのでサーバーに入り、インフラの構成をまとめたりバックアップをとったりしていました。 この時点でベンチを回すことができませんでした。 負荷が見えないと設定変更ができないのでレギュレーションを熟読していました。
13:00
ベンチを回しスロークエリを解析してキュアセブンにインデックスを貼ってもらうお願いをしました。
その間にベンチ中の負荷を見てくれていたpinkumohikanがDBのマスター/スレーブ構成を提案してくれていたのでDBのサーバ分離に取り掛かりました。
練習では一回も取り組んでいませんでしたが、初めての構成でしたができてよかったです。
16:00
マスター /スレーブができたので検索系のクエリを全てスレーブを見るように書き換えました。
裏でインデックスを色々貼ってくれていたのでもう一度スロークエリの解析をしました。
また、mysqlとnginxの設定変更をしました。
(スコアはあまり上がらなかったです)
18:00
以下クエリがN+1として発生していたので指定された範囲に座標があるかの計算ロジックをプログラム側で行うように改修をはじめました。
SELECT * FROM estate WHERE id = ? AND ST_Contains(ST_PolygonFromText(%s), ST_GeomFromText(%s))`, coordinates.coordinatesToText(), point)
ここで1つのクエリでできるのではとは思ったのですが、やり方が思いつかず。(DBに計算させることで負荷が上がることを避けたかった)
論文を読んで座標計算方法を勉強しました。
各点の内角の総和が360になるのが学びです。(実装ミスったので違うアルゴリズムを使いました)
※実装をミスった原因はifの条件を反転してしまって範囲外の座標を取得していたことのようです。
20:00
N+1を改善していい感じにしたつもりだったのですが、ベンチ結果がFailしてしまったので運営に一旦お問い合わせをしました。
その間に再起動試験をしたところmysqlが再起動しなかったので、焦りました(10分前)
間違えてリブートかけてしまったことで気が付けました。
まとめ
5年目にして初めて本戦に出ることができるのでいい結果を出せるように練習していきたいです。
あと今回インフラ面の改修を入れていなく知識不足を痛感しました。勉強しておこうと思います。
予選に出た方のブログや感想戦を読んでみます。
余談
ここ最近ISUCONは若手ものづくり集団 Oysters - oystersjpのメンバーで出ています。
みんながブログ書いてくれるはずなのでまとめていきます。