/isucon-tools

isuconで使うツール群をdockerで使えるようにまとめたtemplate

Primary LanguageShell

isucon-tools

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
  • 各スクリプトのデプロイ先のパスなどを修正します
    • deploy/deloy.sh
      • restartするservice名も変更
    • Golangのprofileファイルを保存する設定を追加
  • GoのVSC Extensionがエラーになる場合は,下記コマンドを実行
    • go work init
    • go work use "$GO_WEBAPP_PATH"
  • sudosshから実行するための設定を導入
  • SSHユーザーをログディレクトリにアクセスできるグループに追加
    • sudo usermod -aG adm "$USERNAME"
    • sudo usermod -aG mysql "$USERNAME"
  • ファイルのバックアップ
    • アプリケーション
    • 設定ファイル
    • tar cvfp mysql.tar /etc/mysql
    • tar 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先のサーバーからレスポンスを受信するまでにかかった時間
        • いつから記録するのかは不明
  • 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の出力ファイルの取得
  • deploy/deloy.sh
    • 本番環境へのデプロイ用スクリプト
    • ビルドしたwebアプリケーションの実行ファイル+データベースの初期化用SQLファイルのデプロイ
      • 近年のisuconではベンチ開始時に/initializeエンドポイントにアクセス、データベースの再作成+データ投入+indexの作成が行われ、参加者はこの初期化用SQLファイルにインデックスの定義を記述するケースが多いため、同時にデプロイする形式にしています
  • deploy/sync-settings.sh
    • 各種設定ファイルをリモートに送信
      • nginxのnginx.conf、MySQLのmy.cnf
    • rootでのsshを避けるため,/tmpに転送する実装にしています
      • sshしてコピーしてください
    • 大会形式によっては環境変数管理用の.envなども管理する必要がありそうなので良い感じに調整してください

スクリプトのテストについて

  • docker-compose.yaml内のdeploy-testコンテナにはnginx, mysqlがインストールされており、SSH経由でアクセス可能になっています。デプロイなどに用いるスクリプトのテストに使用してください
  • deploy-test/id_rsa/内に秘密鍵、公開鍵を作成することで公開鍵認証でアクセス可能です
    • ファイル名をid_rsa,id_rsa.pubとすることでgitignoreされます

ToDo

  • pprof-webviewをcontainer上から使えるようにする
  • Prometheusを使えるようにする
    • Ansible playbookの作成

参考にさせていただいたサイト