※この記事には2022年のISUCON予選のネタバレがあります。
知り合いと一緒にISUCONの予選に今年も出たのでその振り返りをば。
2021年に引き続いてDB周りのお掃除をしてみたかったので出場しました。
やったこと/やろうとしたこと
説明書を読んでベンチを回す (一般)
問題はリンク集から。 (準備中)
アプリケーションの仕様書とサービスの仕様書に目を通し、ベンチを回しました。
01:24:26.821923 初期化リクエストに成功しました 実装言語:go
01:24:26.821948 整合性チェックを開始します
01:24:43.060690 整合性チェックを終了します
01:24:43.060710 整合性チェックに成功しました
01:24:43.060741 負荷走行を開始します
01:24:48.061472 大会「あわよくばブルーベリーラーメン #7」を作成しました。参加者が増えます。 (類似のログ計2件)
01:24:48.061490 参加者が6人増えました
01:24:48.061494 テナント「メインココナッツ会」を作成しました (類似のログ計1件)
01:24:53.061754 大会「無職興信所カップ」を作成しました。参加者が増えます。 (類似のログ計3件)
01:24:53.061765 参加者が7人増えました
01:24:58.061452 大会「実はパフォーマンス企画」を作成しました。参加者が増えます。 (類似のログ計3件)
01:24:58.061466 参加者が12人増えました
01:25:03.061013 大会「昭和武蔵小杉週間大会」を作成しました (類似のログ計1件)
01:25:08.061440 大会「家の音杯」を作成しました (類似のログ計2件)
01:25:08.061454 参加者が6人増えました
01:25:13.061177 大会「第7回 クライアント5期生」を作成しました (類似のログ計1件)
01:25:18.061452 大会「ボルダリング.php杯」を作成しました。参加者が増えます。 (類似のログ計3件)
01:25:18.061499 参加者が12人増えました
01:25:23.061142 大会「冷やしもやしパンチ」を作成しました (類似のログ計3件)
01:25:23.061158 参加者が7人増えました
01:25:28.061659 leaderboardの表示に1秒以上かかったため2人の参加者が離脱しました。
01:25:28.061659 大会「北川口イーツカップ」を作成しました (類似のログ計1件)
01:25:33.061834 大会「第3回 横浜乗り過ごし」を作成しました (類似のログ計2件)
01:25:33.061845 参加者が6人増えました
01:25:38.061594 leaderboardの表示に1秒以上かかったため1人の参加者が離脱しました。
01:25:38.061619 大会「古代ドラゴンフルーツ食堂 #7」を作成しました (類似のログ計2件)
01:25:38.061654 参加者が6人増えました
01:25:43.061106 大会「第5回 メロン.py」を作成しました (類似のログ計2件)
01:25:43.061129 leaderboardの表示に1秒以上かかったため2人の参加者が離脱しました。
01:25:43.061132 参加者が6人増えました
01:25:43.061186 負荷走行を終了します
01:25:44.062914 Error 0 (Critical:0)
01:25:44.062921 PASSED: true
01:25:44.062925 SCORE: 2704 (+2704 0(0%))
秘伝のタレを効かせる (一般)
といってもいきあたりばったりで前日に用意したものでalpだったりnetdataをインストールするコマンドくらいしか書いてないシェルスクリプトを動かすだけ。
TCP/IP over SSH でリモートの様子をローカルに配信 (お茶くみ)
netdataの様子やMySQLの様子をローカルでビジュアルで確認できるようにしました。
ssh -L 8001:localhost:19999 isucon@{ipアドレス} -i ~/.ssh/{鍵の名前}
MariaDBに拡張してあるときはこんな感じで接続できたんですが、今回はテーブルでの指定方法がわからんずくでした。(ISUCON11予選のもの)
ちなみに、MySQLではlocalhost
と127.0.0.1
が厳密に区別される、という話があり、リモートのMySQL側で127.0.0.1ポートの参照許可を与えて置かないとローカルから接続ができないみたいです。
得点の推移をスプレッドシートに吐くように (お茶くみ)
手動でログを入力すべくGoogle Form用意。
ちなみに得点の推移は以下。
初期のGoの実装が一番得点があるのはかなり精神的に来ました。
去年出たときはmy.cnfの max_connection
や key_buffer
だったりrecord_buffer
をいじるだけで得点が跳ねたんですが、このあたりも推測でイジると良くなさそうです。(あたりまえ体操)
nginxで静的アセットを配信する (リバースプロキシ)
何も考えずにnginxでcssやjsを配信するようにしました。
そもそもリクエスト自体を捌ききれてないので返ってスコアが悪化してしまいました。
スロークエリログを吐かせる (DB)
やるだけ。
スロークエリログを解析する (DB)
どうやらコイツらが悪さしている模様
Reading mysql slow query log from /var/log/mysql/mysql-slow.log
Count: 2 Time=2.46s (4s) Lock=0.00s (0s) Rows=0.0 (0), isucon[isucon]@localhost
DELETE FROM visit_history WHERE created_at >= 'S'
Count: 2262 Time=0.07s (165s) Lock=0.00s (0s) Rows=93.3 (210947), isucon[isucon]@localhost
SELECT player_id, MIN(created_at) AS min_created_at FROM visit_history WHERE tenant_id = 'S' AND competition_id = 'S' GROUP BY player_id
Count: 14 Time=0.01s (0s) Lock=0.00s (0s) Rows=0.0 (0), isucon[isucon]@localhost
INSERT INTO tenant (name, display_name, created_at, updated_at) VALUES ('S', 'S', 'S', 'S')
[略]
administrator command: Quit
たくさん読まれてるカラムにインデックスを貼る
visit_history
くんを見てみると、
+----------------+-----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-----------------+------+-----+---------+-------+
| player_id | varchar(255) | NO | | NULL | |
| tenant_id | bigint unsigned | NO | MUL | NULL | |
| competition_id | varchar(255) | NO | | NULL | |
| created_at | bigint | NO | | NULL | |
| updated_at | bigint | NO | | NULL | |
+----------------+-----------------+------+-----+---------+-------+
って感じで、player_id
にインデックス貼ってみたいんですが効果あったんですかね…?(推測するな計測せよ)
感想
最近SQLiteからMySQLへのお引越しをDjango環境で行ったんですが、ぜんぜん活かせてなかったのが悔しいです。
dump.jsonみたいなのを使ってぽちぽちお引越しできるものだと思っていたのですが、複雑な構造になるとそうはいかない…みたいですね。
今年度の題材はメタISUCON、という内容で、初心者には先日出版された書籍の内容を「やるだけ」とはいかない感じでした。
アプリケーションロジックの方を優先して、N+1っぽくなってるところを誘導に乗って捌けばよかったもののつまらないこだわり方をしたなと思いつつも、DBの解析はなかなか普段からやってないと時間を食うことを身を以て学べました。
ISUCON反省会(2022-07-28)
さて、鉄は熱いうちに打て、というわけで近所のハッカースペースを借りて反省会をします。
ハイブリッド配信の設備があって、とりあえずは「LT会」名目で申し込みましたが、多分誰も集まらないので一人でISUCON10予選の問題やったり参考実装をElixirで再現頑張ったりしてると思います。
https://connpass.com/event/253766/
ISUCON12予選の反省会やるよ〜〜ん
— 呼吸 (@ebiflyyyyyyyy) July 25, 2022
7/28 (木) 19:00~
オンライン参加者にはzoomリンク送るですhttps://t.co/19weu7NQj4
ほなまた。