個人的なメモ帳

個人的なメモを書いていきます。

ISUCON10予選を19位で通過しました

結果

メンチカツという1人チームで参加し、19位で予選通過しました。
言語はgoで最終スコアは2338点でした。

やったこと

初期準備

  • githubへのコードと設定ファイルのPush
  • mysqlのバックアップ
  • pprofの導入
  • pt-query-digestの導入
  • alpの導入
  • appやmysql, nginxをまとめて再起動するスクリプトやprofileコマンド用のスクリプトの用意
  • サーバのスペックの確認

改善内容

1. nginxでbotに対して503返す
  • これはマニュアルに書いてあったのでとりあえず対応。特にスコアに効いてなさそう?
2. SQLの修正
  • DBのCPU使用率高かったのでSQLから着手
  • ST_Containsで領域内かどうかの判定をすればよいだけのところでestateを取得しにいってたのでestate取得部分を削除
  • countで十分なところをcountに修正
3. indexの追加
  • SQL修正してもSlowquery出まくっていたので対応
  • Slowqueryに対して雑に追加していて、orderのASC/DESC全く見てなかったため効いてなかった気が
4. DBを専用サーバに移行
  • pprofやslowquery、topの結果を見ると明らかにDB負荷が高かったのでDB専用サーバを作成しそちらに移行
5. nginxとmysqlに雑な設定追加
  • 毎回isuconで使ってる設定があったので雑に追加
  • 駄目だったら細かく見て直せばいいやという考え
6. DB専用サーバを2台に変更
  • DB専用サーバ作っても相変わらずCPU使用率が高い
  • appのコードを読んだ感じ、chairとestateは特にJOINする必要もなさそうだったので、それぞれ別DBとして別のサーバに構築
7. gis専用のDBを追加
  • この時点でapp兼nginxサーバ、Chair用DBサーバ、Estate用DBサーバという構成
  • topを見てもDBのCPU使用率が相変わらず高く、それに比べてnginxとappのCPUに余裕がある
  • 上記の様な状態だったので少しでもDB負荷を軽くするためにST_Containsの計算をさせるだけのDBをapp兼nginxサーバに追加
    • 下手な実装よりDBで提供されてる方が性能良いかなという意味で行ったが、ここらへんはgoにあるライブラリ使ったほう性能良かったかも
  • これの完了が18時頃でここでスコアが2000点へ到達

8. ログ周り設定の削除
  • 良い解決方法が全然浮かばなかったので諦めてお掃除ターン
    • mysqlのslowlog設定の削除
    • pprof設定の削除
    • nginxのログ設定削除
    • go実装に入っていたmiddleware.Loggerの削除
9. 虚無
  • 毎年ギリギリでのベンチは失敗する事が多いので、20時に再起動試験やった後は他に対応できるか調査しつつ20:30頃にはベンチ回してフィニッシュ
  • 結果的に18時から3時間は虚無だったので、ここでDB内のデータを見ていじれてればよかった……

反省点

感想部屋見てここらへんやっておけばよかったなと。
視野が狭くなりすぎていたので、気づけていない点はまだまだありそう。

  • DB内のデータを実際に確認して何かしらの傾向がないかの調査
  • index効くようpopularityを負の値に
  • popularityとidをまとめてsort用のカラムに
  • select for updateの削除
    • where stock > 0 でupdateすればよいだけだった……
  • アプリの実装意図考える
    • ちょっとした動作確認とコード見るだけで何をしたいコードなのか細かく見れてなかった

その他

チームについて

毎年3人チームで参加していたのですが、今年は1人チームで参加しました。
自分が1人チーム、3人チームで感じた良さはそれぞれこのような感じでした。

1人チームの方が良かったこと
  • 1人で対応したもの全部把握できているので、複数人作業によって発生するバグなどの原因調査に時間を使わなくて良い
  • 1人1台で検証して後半で3台構成にして……という形ではなく、最初から3台丸々使えることによって本質的なボトルネックの調査が可能
    • 毎年、結果的に複数台構成に出来ずに敗退していたので特に……
  • コミュニケーションコストがかからないので試したいと思ったことをすぐに試せる
3人チームの方が良かったこと
  • 3人分の視野があるのと、ラバーダッキング的な意味で視野が広くなる
  • 始まる前のやり取りや、終わった後に感想や反省点言ったりする楽しさ

作業環境について

今年は1人だったので自宅から参加しました。

  • 使い慣れたキーボード
    • ErgoDoxはいいぞ
  • 使い慣れたデスクトップPC
  • ディスプレイ2枚
  • 座り慣れた椅子
  • ひと目を気にしなくて良い

という環境のおかげでストレスなく参加することができました。
ひきこもりばんざい。

スコア履歴

f:id:buchy12:20200913075011j:plainf:id:buchy12:20200913075006j:plain

感想

開始が遅れたり、ポータルが落ちたりと運営の方たちは大変だったと思いますが、個人的にはそこも含めてうまく進まないのがリアルな感じがあってとても楽しめました。

運営の皆様ありがとうございました。本戦でもよろしくおねがいします。