ISUCON の計測では、SQL は pt-query-digest、アクセスログは alp、CPU は top と pprof、設定は目視というようにツールが分散しがちです。
isutools は、これらを 1つのダッシュボードに集約する Go 製 OSS(MIT ライセンス) です。組み込みは実質1行で、ベンチマークごとにスナップショットが自動で保存され、実行間の diff まで比較できます。
isutools ダッシュボードの実行履歴一覧。ベンチごとのスコアとgitリビジョンが時系列で並ぶ
このツールを使って private-isu を1日でスコア 0 → 541,650 まで改善した実戦記録は別記事にまとめています。この記事では isutools 自体の導入方法と主な機能を説明します。
クイックスタート
go get github.com/ekusiadadus/isutoolsアプリケーション側の変更は次の1行だけです。
// before
db, err := sqlx.Open("mysql", dsn)
// after — SQL計測 + 管理サーバが有効になります
db, err := sqlx.Open(isutools.SQLDriverName("mysql"), dsn)これで http://localhost:19191/ に管理ダッシュボードが立ち上がります。HTTP のパス別計測も追加する場合は、ミドルウェアを1行挟みます。
http.ListenAndServe(":8080", isutools.HTTP(r))ベンチマーク実行スクリプトには2つの POST リクエストを追加します。
curl -XPOST localhost:19191/reset # 計測をゼロクリア
./run-benchmark
curl -XPOST "localhost:19191/save?score=123456" # スコア付きで保存保存された実行履歴はホーム画面に日時 ID で一覧表示され、クリックするとその時点の全計測データが開きます。スコアと git リビジョンが常に一緒に記録されるため、どのコミットで何点だったかを後から確実に追跡できます。
1回のベンチマークで収集される指標
- SQL: 正規化クエリ別の合計時間・実行回数・p95(
WHERE id = 999とWHERE id = 1を同一クエリとして集計) - HTTP: パス別のレイテンシ集計(
ISUTOOLS_PATH_RULESの正規表現で/@user1/@user2を/@*に正規化可能) - nginx アクセスログ:
alp相当の集計(LTSV / JSON 両対応) - プロセス + マシン全体の CPU: プロセス別の CPU 使用率に加え、busy / idle の内訳を表示
- DB スキーマ: ベンチ開始時点のテーブル・インデックス一覧を自動記録
- pprof:
/resetに連動して CPU プロファイルを自動採取 - カウンタ API:
isutools.Count("user_cache_hit")で任意の値を計測し、キャッシュヒット率などを確認可能 - User Flow: セッション単位のページ遷移上位を集計
advisor — 未設定の定石を自動検出
MySQL・nginx・OS・Go の設定を読み取り、ISUCON の定石で未設定の項目を自動でリストアップします。
isutools の Advisor セクション。MySQL・nginx・OS・Go の未設定の定石を自動検出して表示
private-isu の初回実行では、「interpolateParams なし(プリペアドステートメントで2往復)」「nginx gzip なし」「innodb_buffer_pool_size がデータ量の9分の1」の3件を検出し、適用だけでスコアが +16% 伸びました。設定を反映するとステータスが ok に変わるため、初期チェックリストとしてそのまま使えます。
diff — 実行間のクエリ・エンドポイント比較
チューニングでは、改善したつもりでボトルネックが別の場所へ移動したケースや、変更によって他のクエリが退行したケースを見分ける必要があります。isutools は任意の2つの実行結果の diff をクエリ別・パス別に出力します。
isutools の diff ビュー。2つのベンチ実行間でクエリ毎の合計時間の増減を緑(改善)と赤(悪化)で表示
private-isu では「インデックスを1本追加した直後にタイムラインの JOIN クエリが260倍遅くなった」実行計画の退行を、この diff ビューから数分で特定できました。
計測オーバーヘッドとセキュリティ設計
計測ツール自体がスコアを下げないよう、ABBA 計測(off → on → on → off の4回ベンチ)でオーバーヘッドを検証しており、結果は -0.58%(誤差範囲内) でした。検証スクリプトは examples/abba.sh として同梱しています。
また、競技サーバーで計測したスナップショットファイルを手元の PC にダウンロードして閲覧する運用に対応しています。データは ISUTOOLS_DATA_DIR 配下のファイルだけで完結し、外部通信は一切行いません。管理サーバはデフォルトで 127.0.0.1 のみにバインドされ、リモート公開時はトークン認証を必須とする fail-closed 設計にしています。
よくある質問(FAQ)
- Q.
sqlx以外でも使えますか?: 標準のdatabase/sqlのドライバプロキシとして動作するため、sql.Openや各種 ORM でもドライバ名を渡せる構成であれば利用できます。 - Q. 通常の Go 製 Web アプリの性能調査にも使えますか?: 設計は ISUCON 向けですが、Go アプリケーションの負荷試験やボトルネック調査にもそのまま利用できます。