21.4K Views
August 26, 23
スライド概要
ISUCON 夏祭り 2023 発表資料
ISUCON過去問との 向き合い方指南 ISUCON 夏祭り 2023 matsuu
自己紹介 matsuu / tmatsuu / matsuu.net ISUCON過去問を様々な環境で構築する手助けをしてる人 ISUCON1からISUCON12まで連続参戦、予選通過は 6勝4敗、最高順位は 3位(ISUCON1) インフラエンジニア 3人チームのプログラミング担当 ISUCON対策ツールを公開 ● ● アクセスログ集計ツール → kataribe pt-query-digestをgoで再実装 → go-mysql-query-digest 好きな過去問は ISUUMO(ISUCON10予選)
ISUCON で良い成績を 残すには
素振り
過去問を 解こう
ISUCON過去問を解く方法 ISUCONの過去問にチャレンジするためのシンプルな環境構築 https://isucon.net/archives/54946542.html 各種用意しています 諸事情によりいくつか上記URLで紹介していないものがある ISUCON公式でないもの(private-isuなど)も用意してます https://github.com/matsuu 配下にて「isucon」で検索
過去問環境を用意することになったきっかけ ISUCONの過去問はソースコードが用意されている https://github.com/isucon 構築自動化のためのAnsibleやItamaeが同梱されているが、本番で使われ たクラウド環境に依存していたり、SSL証明書期限切れなどがあり、環境再現 が難しい場合がある AWS用イメージ(AMI)も公開されていたが、AWS環境は少なからずお金がか かるしクレジットカードも必要となるので学生には厳しいのではないか ISUCON4終了後にISUCON過去問を手元で手軽に試せる環境を公開
手元のPC環境などでISUCON過去問を解く手段 Docker matsuu/docker-isucon Multipass matsuu/cloud-init-isucon Vagrant+VirtualBox matsuu/vagrant-isucon WSL2 matsuu/wsl-isucon Windows (x86-64) macOS macOS Linux (Intel) (Apple Silicon) (amd64) ◯ ◯ △ ◯ ◯ ◎ ◎ ◎ ◎ × x86エミュレーション ◎ ◯ △ ◯ Vagrant boxがない × × 備考 やや古い
クラウド環境でISUCON過去問を解く AWS AMIイメージとそれを構築するためのPacker → matsuu/aws-isucon Oracle Cloud 構築するためのTerrraform → matsuu/oci-arm-isucon cloud-init対応のクラウド(AWS、Azure、GCP、さくらのクラウド、他) 構築するためのcloud-config → matsuu/cloud-init-isucon cloud-init非対応のクラウド(今回クーポンが配られたさくらのVPSではコレ) 構築するためのAnsible → matsuu/ansible-isucon
過去問の解き方 1. 2. 3. 4. 5. 6. 7. READMEに従い構築を行う sshなどでサーバーにログインする isuconユーザーに切り替える ○ sudo -i -u isucon isuconユーザーのホームディレクトリ配下にあるベンチマーカーを実行する ○ 実行方法は毎回異なるのでREADMEを参照だが、コマンドラインで実行する ○ 実行すると最終的にスコアが表示される ベンチの計測結果(ログやプロファイラーなど)を解析する ベンチのスコアが上がるようプログラムなどをチューニングする ○ isuconユーザーのホームディレクトリ配下にプログラムがあると思います 4に戻る
過去問を解く時の ポイント・注意点 (インフラ寄り)
どの過去問を解くのがオススメ? できるだけ最近の過去問を解くのがオススメ 昔のISUCONは各言語実装の使用しているライブラリが古く、ライブラリを更新 しようとするだけで骨が折れる可能性がある ただしISUCON11予選の問題はブラウザでのログイン動作確認が難しいので ブラウザで動作確認をしたい場合には避けた方が良さそう
スペックは可能な限り本番に合わせる 次のような問題点に気づける可能性がある ● ● VSCodeのRemote Developmentを使うとメモリーが枯渇 Rustプログラムのbuildにめちゃくちゃ時間がかかる 少なくともメモリーは本番に合わせるとメモリー不足から発生する問題点を洗い 出せるのでGOOD
ベンチマーカーとその前後処理を自動化しよう ● ● ● 前処理 ○ webappのデプロイ ○ webappの再起動 ○ ログの初期化、統計情報の初期化 ○ プロファイラーの再起動 ベンチ ○ ベンチマーカー実行 後処理 ○ プロファイラーの停止 ○ ログの集計 繰り返し実行することになるので一連のコマンド実行を自動化するとよい シェルスクリプト、Makefile、CI/CDなどお好みの方法でどうぞ
本番ではベンチマーカーが同梱されていない 本番ではサーバー内にベンチマーカーが含まれておらず、別途用意された ポータルサイトからベンチを実行することになる 事前処理、ベンチ、事後処理の自動化を本番でやるのは難しい コマンドラインからベンチを叩けるようにするのは時間が惜しい 本番では事前処理、事後処理を独立して実行できるようにすると良い
改善を繰り返すとベンチの負荷が大きくなる ベンチマーカーもそれなりにCPUとメモリーを食う ベンチ側の負荷が原因で処理が滞るようであれば、サーバーをもう1台用意して ベンチマーカーを分離しよう
複数台構成への変更に慣れておく 今年も複数のサーバーが提供されるだろう(されなかったら🙏) 複数台構成への変更は意外と考慮すべき項目が多いので一度は自分の手を 動かして試しておくのが良い ● ● ● ● ● 待ち受けるアドレスの設定 接続先の変更 ネットワークレイテンシーによる性能劣化 コンテンツをどうやって同期するか サーバー再起動時の起動タイミングによる問題
どこまで改善すると良いのか? 「予選通過スコア」や「予選1位のスコア」は1つの指標だが、毎年レベルが上が ることを想定しておいた方が良い 思いつく改善点をすべてやって限界までチューニングするのがオススメ 改善点を思いつかなくなったら、解説記事や感想ブログなどを参照して手を動 かす やれることの引き出しを増やしておくのが大事 「これ進◯ゼミでやったところだ!」を増やす
「推測するな計測せよ」と言われるが… ベンチ実行中のサーバーの負荷状況やアクセスログ、スロークエリーログなど の集計、プロファイラーでの解析などを行った上で、計測結果を元にボトルネッ クを特定する しかし計測結果の読み解き方が案外難しく、計測結果から推測しがち 計測結果を正しく読み取る方法を身につけるべし ISUCON本のChapter1を読もう(繰り返し読もう)
ベンチ実行中の負荷確認 ベンチを走らせている間はマクロな視点で負荷状況を確認しよう ツールはなんでも良いが自分はtopとdstatをよく使う topでCPUとメモリーの使用率が高いプロセス、CPU負荷の偏りなどを確認 dstatで時間の経過とともにどのような負荷の変化があるかを確認 dstatのオススメオプション -tlamp
オススメのログ集計方法 ルーティング(エンドポイント)毎にまとめて応答時間などを集計すると良い 例 /user/1 や /user/42 などは /user/:id としてまとめて応答時間を積算する HTTPメソッド(GET, POSTなど)毎にも分けるべし SQLの場合はリテラルを?などに置き換えてまとめると良い 各種ログ集計ツールはそのような集計に対応している alpは-m/-qオプション、kataribeはbundle/replaceで実現可能 SQLはpt-query-digest、mysqldumpslow、performance_schema、 pg_stat_statementsなどで実現可能
ログを集計した結果の見方 エンドポイント毎にまとめた上で、以下をチェックしよう ● ● ● 合計値が大きいもの ○ 負荷のボトルネックになっていることが多い 平均値が大きいもの(回数が極端に少ない場合は除外できる場合がある) ○ ISUCONのベンチマーカーはシナリオベースなので詰まるところがあるとその 分全体が遅れる可能性がある 標準偏差が大きいもの(バラツキがあるもの) ○ 値によって遅いものがある、もしくはロックなどによる競合が発生している可能 性がある alp, kataribe, pt-query-digestは上記値はすべて取得可能です
Appendix kataribe https://github.com/matsuu/kataribe go-mysql-query-digest https://github.com/matsuu/go-mysql-query-digest ISUCONの過去問にチャレンジするためのシンプルな環境構築 https://isucon.net/archives/54946542.html ISUCON本 https://gihyo.jp/book/2022/978-4-297-12846-3 alpの使い方 https://zenn.dev/tkuchiki/articles/how-to-use-alp pt-query-digestの使い方 https://thinkit.co.jp/article/9617
終劇