tpdn blog
2018-09-16

ISUCON8予選に参加して見事に敗北した


9/15のISUCON8予選にチーム「メガBIG丼」の一員として出ました。 順位は・・・

39位 23,601 メガBIG丼 (3)

http://isucon.net/archives/52467371.html

見事に敗北。ここに記録を残しておきます。

ちなみにBIG丼とはこういうもので、一部の人間にとってはソウルフードのようなものです。もうお店なくなったけどね。 そういえば復活してたのだった。 https://twitter.com/ranran_tsukuba

https://tabelog.com/ibaraki/A0802/A080201/8001530/

メンバーは、この手の事をやる際によく集まる?いつもの3人組です。

練習・準備

なし!マジで何もしてませんwwwwww

真のノープランです。計画なし!練習なし!場所の確保もなし!

この辺自分がちゃんとやらないといけなかったのに何もやってなくてマジすいません。

というわけで・・・

  • ぶっつけ本番
    • とはいえ過去のISUCON予選・本戦は経験してる(!?)し、普段それなりのシステム扱ってる人間3人なのでボロ負けはしないでしょ
  • 連絡はSlackでシンプルに
    • 過去に予選に参加した時の残骸が残っていたのでそれを活用

問題を解く

今回のお題はイベントの座席を予約したりキャンセルしたりするサイトという感じでした。

問題はすでに公開されているようです。 https://github.com/isucon/isucon8-qualify

役割(?)

文字通り何も決めてなかったのでなし崩し的にこうなったという感じではありますが

結果的に

  • KIM_TPDN:DBとかWebサーバとかのチューニング
  • hktechno:アプリコード修正、N+1絶対殺すマン
  • x86_64:各種環境構築、サーバー複数台体制

という感じになりました。まあ手を出せる人がとりあえず色々やってた感。

言語

言語は全員が確実に理解できる言語がPythonなのでPythonになりました。

前半戦

とにかく初期スコアがほしい

とりあえず何もせずベンチマークを回して初期実装のスコアを取りたいが、なぜかエラーが発生してスコア0。 サーバーを見た感じアプリはポート8080で走っているように見えるけど、リバースプロキシ的なものが動いてなくて80でアクセスできない模様。

そこでnginxを投入。h2oが初期で仕込まれてたらしいのでそれ使うのもありかもしれないですが、慣れないもの入れるよりは慣れてるもののほうが良いだろうという考えです。

設定いじり

nginxのconfigいじり

staticなファイルに関するアクセスも全部flaskに飛んでたのでnginx直で返すようにし、例によってcache-controlをいれたりしました。 静的ファイルも一応得点源ではあるので。

MariaDBのconfigいじり

見る感じメモリちゃんと使ってる感じがなかったので、InnoDBの設定いじったりしてメモリ使うようにしました。

アプリ側改造

N+1なウンコクエリやインデックス不足なスキーマをいじったり、json書き出し部分にujson入れてわずかながらの点数稼ぎやったりと手を加えてます。

ここまでやって・・・

お昼ぐらいには20000近いスコアが出ていました。

ただし、ここまではサーバー1台構成。

ここからスコアを上げていくにはサーバー増やすしかない気がするので複数サーバー構成に。

あとアプリからエラーがじゃんじゃん出てペナルティ食らっているようなので、それもつぶしつつ。

後半戦

複数サーバー構成

複数サーバーをこんな構成で組みました。

  1. nginx, app1担当 (worker 4)
  2. app2担当 (worker 5)
  3. db, app3担当 (worker 3)

試しに回したところ、最高スコア37582が出て、チーム内からこれは来たんちゃうかという喜びの声が(死亡フラグ)

無慈悲なFail連発

複数サーバー構成にするとFailが連発するように。先ほどの結果はまぐれだったのか。

データの不整合を解消しようといろいろ考えるが・・・

結局・・・

エラーが解消できなかったので、あきらめてアプリサーバー1台+DBサーバー1台で戻して動くように設定変更。 サーバー3台使ってない( ^ω^)・・・

あとは再起動対策で各種serviceがenabledになっていることを確認し、競技時間終了。

最終スコアは23601。運が良ければ本戦行ける気がしないでもないですが、まあそんなわけなかった。

感想・反省

なんだかんだ言っていろいろ無駄に時間がかかったのはよくなかったですね。

事前に誰が何するか決めるとか、複数サーバーにしたときにどんなトラブルが起こりうるかを事前に予習するとか、複数サーバー前提にコピペで動く簡易デプロイツールライクなもの(単にscpなりrsyncするやつとかで十分)用意したり、便利なものが最初から入ってるオレオレnginx用意したり、これ入れればとりあえず安泰なconfig用意したりとかできることはいろいろあったなと。

そのへんやってればあと1時間半くらい時間稼げて最後の追い込みで何かできた気がします。

うーん、悔しい。