feature image

2020年10月14日 | ブログ記事

ISUCON10本選3位とりました

はじめに

「がんもどき」(@sappi_red, @ryoha, @temma)でISUCON10の本選に参加して、全体3位・学生3位をとりました。
スコアは34767点でした。

ISUCON10 本選の結果発表と全チームのスコア : ISUCON公式Blog
2020.10.6 18:18 更新 ConoHa学生応援賞を訂正2020.10.5 18:22 更新スコアデータに誤りがありましたので訂正いたしました、詳細は本選スコアデータおよび順位の誤りについてをご確認ください---ISUCON10 に参加いただいた皆さん、ありがとうございました!10月3日に開催
スコアの遷移
ISUCON10予選学生2位で通過しました。
はじめに「がんもどき」(@sappi_red [/author/sappi_red/], @ryoha [/author/ryoha/], @temma[/author/temma/])というチームでISUCON10予選に参加して、全体5位・学生2位で予選突破しました。全員、初出場でしたが練習のおかげでスムーズに作業できてよかったです。最終スコアは 3407 でした。 構成仕様実装: Go * 1台目: アプリケーション+Nginx * CPU Usage: 40~60%, memory: 20~30% * 2台目: estateテーブル用DB(mysql 5.…
予選のときの記事

構成

使用言語: Go

やったこと

当日まで

一週間前くらいは技育展の発表の準備をしていて練習したりする時間が取れなかったのですが、前々日と前日には軽くISUCON9の決勝を触りました。

10:00

予選と同じく全員リモートで参加しました。
開始後は@temmaがsshのconfigを書いたりMakefileの調整やツール系のインストールやgitの導入などをしている間に、@sappi_redと@ryohaでマニュアルを読みました。
マニュアルのうち、Webpush関連の部分が長かったので早めにタスク切り分けるためにWebpushは@ryohaに任せて、@sappi_redはそれ以外の箇所のコードを読むことにしました。

Goに切り替えたあとの初回のベンチを10:31に回して6362点でした。

11:00

htopを見ていてMySQLのCPU利用率が高かったのでとりあえずMySQLを2台目に移すことを@temmaに頼みました。移す手間がそこまでないのと最終的には移すことになるだろうという読みが理由です。
その間に@ryohaはwebpushの実装を進めて、@sappi_redはpprof/fgprofの測定しました。

/audeience/dashboardの負荷が支配的だったのでそのあたりを改善するために@sappi_redが下のような変更を入れました。

12:00

12:10に@temmaがMySQLを2台目に分離して、そのままslowqueryの設定とDBのチューニングをしました。
@sappi_redは/audience/dashboardの返答をアプリ側で0.9秒キャッシュするようにしました。

この二つのあとのベンチで11852点が出ました。

その後、@temmaがindexをいくつか張りました。
最終的にはアプリ側も分離するだろうということで仮想ポータルを3台目、仮想ベンチマークサーバーを1台目に残すことを@temmaに頼みました。ここでカーネルパラメータの設定などもしました。

13:00

@sappi_redが/audience/dashboard/contestant/dashboardでsingleflightを利用するようにすることで同じクエリでDBを同時に叩いているのを取り除きました。
このときのスコアが13719点でした。

さらに@sappi_redがsingleflightがより効率よく効くように書き換えました。これは「コンテスト中かつリーダーボードが凍結中」でないときは/audience/dashboard/contestant/dashboardは共に同じ結果を返していることに注目して、singleflightの同じグループになるような変更をしました。
このときのスコアは14162点になりました。

pprofを見るとリーダーボードの構造体をprotobufに変換する箇所でCPU時間を消費していたので、構造体ではなくprotobufの[]byteをキャッシュするようにしました。
これでスコアが16718点まで上がりました。

14:00

このあたりで何でかmasterのコードでベンチが通らなくなって格闘しました。
結局何だったのか今もわかってません。
原因の一つとしてわかっているのはトランザクションを取った後、コミットするのを忘れている箇所があって、その結果MySQLがそれを解放できずに上限にひっかかり落ちてたことです。

15:00

@sappi_redがloginRequired内でgetCurrentContestantを呼ばないように関数の呼び出し順を入れ替えたりしました。スコアの変化はなかったです。

16:00

ここでようやくチーム数上限の存在を思い出して、10だったのを50に変更しました。
これで一気にスコアが29822点まで上がりました。

contestantがread heavyだったので@temmaがメモリに載せるのをはじめました。

clarificationsも多少重かったので@sappi_redが/admin/clarifications/contestant/clarificationsのN+1を解消しました。
ここでスコアが30123点になりました。

もうちょっとチーム数上げたら点数伸びるかなと思って、50から70に変えましたが、30666点でそんなに変わりませんでした。

17:00

@sappi_redが/registration/teamでLastInsertIdをとるのにクエリを叩いていたのをINSERT INTOでの結果を利用するように変えて、31818点がでました。

17:20にcontestantをメモリに載せるのが実装し終えたのですが、DBでdeadlockが発生するようになってしまい、導入するのを泣く泣く断念しました。

17:30になったのでコードフリーズをしてログを取り除いて再起動試験をしました。
ログを取り除いてチーム数上限を調整して、最終的に自分たちで実行したのは34180点でした。

おわりに

@sappi_red: 練習自体は何回か行ったのですが、初参加だったので本番は初めてでちょっと緊張してました。今年はリモートだったので例年よりは幾分かそれが和らいだのもあったかなと思ってます。
とても楽しかったので来年も参加したいです!

@temma: めっちゃ楽しかったです。3人で練習もちょこちょこやるのも楽しかったし、それを通しての発見も多かったですね。来年は優勝suruzo!!

@ryoha: traPのなかよし部(ユニちゃんズ)であるこの三人でわちゃわちゃできて楽しかった~~~~~。来年はすべてをなぎ倒せるようになりたい。現地に行くのはノートパソコン半強制みたいになって辛いのでリモートで助かった。

sappi_red icon
この記事を書いた人
sappi_red

19B。SysAd班。 JavaScript書いたりTypeScript書いたりGo書いたりRust書いたり…

temma icon
この記事を書いた人
temma

19 生命理工学院

ryoha icon
この記事を書いた人
ryoha

美少女ゲームをするためだけに生まれてきた真の戦士です。夢は「グガガガガガ...コレガ....アイ..」ってなることです。

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2019年12月17日
部内ISUCONを開催しました
xecua icon xecua
2020年9月16日
学生枠でISUCON10の予選を通過しました
oribe icon oribe
2020年9月13日
ISUCON10予選学生2位で通過しました。
temma icon temma
記事一覧 タグ一覧 Google アナリティクスについて