hoge な blog

メモとかtipsとか

ISUCON12予選の参加記

こんにちは、akitoです。

team: using namespace std; で参加しました。(5・7・5) (members: hidollara, sh4869)
誰と出ようかな〜と思っていたのですが、二人ともお誘いしたら快く参加を決めてくれて感謝です。

本記事では、ISUCON12予選の高速化のために行った手順についてのメモを残します。

リポジトリ: using-std/isucon12q

事前準備

使用したミドルウェア・コマンドの類は以下のとおりです。 資料やOSSなどの著作物を公開してくださった皆様に感謝します。:bow:

  • alp
  • pt-query-digest
    • MySQLのクエリを集計して解析するツール
  • kaz/pprotein
    • さくらのクラウド上に立てて使用しました
    • ログを集計し、ブラウザ上で確認できるようにする全部入りツールです
    • めちゃくちゃ便利でした。
    • (当日の問題ではSQLiteを使う箇所があったため、その部分はサーバのコンソール上で確認しました)
  • Discord
    • はい

当日

役割分担

メインの役回りは以下のとおりです。
自分はほとんど点数に貢献できなかったので、本当に感謝です。

  • akito: インフラ・設定周り(logとかDB分割とか)
  • hidollara: アプリケーション周り(キャッシュとかIndexとか)
  • sh4869: アプリケーション周り(N+1とかbulk insertとか)

サーバ構成

最終的な構成は、以下のとおりです。

  • Host1 nginx + app + SQLite(tenant)
  • Host2 MySQL(admin)
  • Host3 なし(本当はSQLiteを剥がしたかった)

全体の時系列

  • 10:00~
    • マニュアルを読み
    • git push
    • deploy用のMakefileの作成
    • pproteinの設定の有効化
    • (2717点)初回ベンチ
  • 12:00~
    • (3376点)Host2にmysqlを分ける
    • (4004点)sqliteにndexを追加する
    • (????点)SQLiteJSONログをはく
      • JSONログを集計する JSコードも同時に作成
    • (????点)InterpolateParams=true の設定を追加
  • 13:30~
    • (5606点)dispenseID() でuuidを使う
    • (????点)playersの投入をbulk insertする
    • SQLiteで管理されているデータを /initialize 時に更新しようとする
      • SQLite*.db ファイルごとにテーブルを全てreadして、その結果を逐一Bulk insertした
      • 33秒くらいかかっていたので、ちょうどタイムアウトしてしまう
      • revert
    • この辺から"write tcp 127.0.0.1:3000->127.0.0.1:38182: write: broken pipe" みたいなログが出てくる
  • 16:00~(この辺からメモが怪しい)
    • JWTKeyをメモリ上にキャッシュ
    • RankingのN+1の解消
    • middleware類のチューニング
      • max connection とか file limit とか
  • 17:00~
    • 再起動試験
    • app×2構成にするか検討するが、実装が間に合うか&可能なのか がわからず、断念
    • "write tcp 127.0.0.1:3000->127.0.0.1:38182: write: broken pipe" みたいなログが出ており、減点されていたが、原因が解明できず終了
    • logの停止
    • お祈りフェーズ

やりたかったこと

  • JSONログの停止
    • 忘れてた
  • 3台目をDBサーバとして使う
    • MySQLにdumpしたかった
    • (NFSでマウントして使うとかもあったらしい、気づかなかった)
  • error: broken pipe の解消

おわりに

SQLiteに面食らってしまいましたが、とても面白い問題でした。 エラーの解消ができなかったのが心残りです。

再起動試験は通っているんでしょうか...
インフラ面で強くなりたい(願望)。