isuconで使うツール群をdockerで使えるようにまとめたtemplate
- 本テンプレートを使ってリポジトリを作成します
make buildを実行します- ツールを実行するためのdocker imageがビルドされます
- 本番環境への接続情報(ホスト名|IPアドレス、
SSHのポート番号)を./hosts/hosts.txtに記述します- 本リポジトリ内のスクリプトはこのファイル内の接続情報を用いて通信します
- 本番環境からwebアプリのコード、初期化用SQLファイルなどを取得し、
./webapp内に追加します- コマンド例
scp -rv ${user}@${host}:/etc/nginx/* ./configs/nginx/${hosts.txtの*_DIR_NAME}scp -rv ${user}@${host}:/etc/mysql/* ./configs/mysql/${hosts.txtの*_DIR_NAME}scp -rv ${user}@${host}:/home/isucon/webapp/* ./webapp
- コマンド例
./ping-scripts.shを使用し、疎通確認を行います- 初回のssh接続の場合、
rsyncによる転送がうまくいかないことがあります
- 初回のssh接続の場合、
- 各スクリプトのデプロイ先のパスなどを修正します
deploy/deloy.sh- restartするservice名も変更
- Golangのprofileファイルを保存する設定を追加
- GoのVSC Extensionがエラーになる場合は,下記コマンドを実行
go work initgo work use "$GO_WEBAPP_PATH"
sudoをsshから実行するための設定を導入- SSHユーザーをログディレクトリにアクセスできるグループに追加
sudo usermod -aG adm "$USERNAME"sudo usermod -aG mysql "$USERNAME"
- ファイルのバックアップ
- アプリケーション
- 設定ファイル
tar cvfp mysql.tar /etc/mysqltar xvfp mysql.tar -C /
- ベンチ用設定導入
dockerを用いて実行されるため、インストール不要で使用可能です。よく使う形式をmakeコマンド内でまとめていますが、直接docker compose run...で実行することで任意のオプションを使用できます。
- alp
- https://github.com/tkuchiki/alp
- nginxなどのwebサーバーのログから実行時間を解析
- 実行時間を占めているエンドポイントの発見などに使用可能
- nginxログでのメトリクス
- request_time
- clientからの最初の1Byteを受け取ってからリクエストを処理するのにかかった時間
- upstream_response_time
- proxy先のサーバーからレスポンスを受信するまでにかかった時間
- いつから記録するのかは不明
- request_time
- mysqlslowdump
- MySQLのスローログを解析
- 実行時間が長いクエリを発見できる
- DBがボトルネックになっているケースで有効
- indexが効いていない、テーブルの結合が遅いなど
- DBの種類(mariaDBなど)によっては上手く実行できない場合があるので適宜
./docker-compose.yaml内のslowqueryサービスのイメージを差し替えてください
- pprof(fgprof)
- Golang用のパフォーマンス分析ツール
- 公式のpprofと異なり、File I/OやNetwork I/O,Mutexによるロックの待ちでのスタックトレースも記録される
net/http/pprofと同様の手順でプロファイルできるが、チーム全員と共有することを考えファイルに保存する形式を取っているsample-webapp/cmd/main.goにサンプルあり
- web view用のコマンド使用時は
graphvizをローカルにインストールしてください
実行環境によって詳細なパス、管理したいファイルなどは異なると思うので、調整していただければと思います
bench/before-bench.sh- ベンチ実行前に行う処理をまとめたスクリプト
- 本番環境内のログのバックアップ、初期化
- 前ベンチのログの混入を防ぐため
- 本番環境内のログのバックアップ、初期化
- ベンチ実行前に行う処理をまとめたスクリプト
bench/after-bench.sh- ベンチ完了後の処理をまとめたスクリプト
- nginxの
access.log, MySQLのスロークエリログ、pprofの出力ファイルの取得
- nginxの
- ベンチ完了後の処理をまとめたスクリプト
deploy/deloy.sh- 本番環境へのデプロイ用スクリプト
- ビルドしたwebアプリケーションの実行ファイル+データベースの初期化用SQLファイルのデプロイ
- 近年のisuconではベンチ開始時に
/initializeエンドポイントにアクセス、データベースの再作成+データ投入+indexの作成が行われ、参加者はこの初期化用SQLファイルにインデックスの定義を記述するケースが多いため、同時にデプロイする形式にしています
- 近年のisuconではベンチ開始時に
deploy/sync-settings.sh- 各種設定ファイルをリモートに送信
- nginxの
nginx.conf、MySQLのmy.cnf
- nginxの
rootでのsshを避けるため,/tmpに転送する実装にしています- sshしてコピーしてください
- 大会形式によっては環境変数管理用の
.envなども管理する必要がありそうなので良い感じに調整してください
- 各種設定ファイルをリモートに送信
docker-compose.yaml内のdeploy-testコンテナにはnginx,mysqlがインストールされており、SSH経由でアクセス可能になっています。デプロイなどに用いるスクリプトのテストに使用してくださいdeploy-test/id_rsa/内に秘密鍵、公開鍵を作成することで公開鍵認証でアクセス可能です- ファイル名を
id_rsa,id_rsa.pubとすることでgitignoreされます
- ファイル名を
- pprof-webviewをcontainer上から使えるようにする
- Prometheusを使えるようにする
- Ansible playbookの作成