Skip to content

Instantly share code, notes, and snippets.

@nuitsjp
Created March 12, 2025 09:41
Show Gist options
  • Save nuitsjp/750e0f8fc7b2a4e4e321440a62d528aa to your computer and use it in GitHub Desktop.
Save nuitsjp/750e0f8fc7b2a4e4e321440a62d528aa to your computer and use it in GitHub Desktop.
ASP.NET Webアプリケーション高CPU問題調査ツール比較

ASP.NET Webアプリケーション高CPU問題調査ツール比較

1. PerfView

1.1 概要

PerfView は Microsoft が提供する無料の高性能 ETW(Event Tracing for Windows)ベースのパフォーマンス分析ツールで、.NET アプリケーションの深刻なパフォーマンス問題を診断するために特に設計されています。

1.2 入手方法

URL: https://github.com/microsoft/perfview/releases インストール: ダウンロード後、ZIPを展開するだけで実行可能

1.3 基本的な使用手順

データ収集

  1. 管理者権限で PerfView.exe を実行
  2. [Collect] → [Collect] をクリック
  3. 以下の設定を行う:
    • Circular MB: 500
    • Thread Time にチェック
    • .NET SampleProfile にチェック
    • Additional Providers: Microsoft-Windows-IIS
  4. [Start Collection] をクリック
  5. CPU使用率が高い状態を30秒~2分程度記録
  6. [Stop Collection] をクリック → ETLファイルが生成される

CPU使用率分析

  1. 生成されたETLファイルをダブルクリック
  2. [CPU Stacks] をクリック
  3. フィルター設定:
    • GroupPats: System;mscorlib;! (システムコードを除外)
    • IncPats: w3wp (IISプロセスに限定)
  4. 表示されたスタックツリーでCPU使用の多いパスを分析

スレッド状態分析

  1. [Thread Time Stacks] をクリック
  2. 対象のw3wpプロセスを選択
  3. スレッドの状態(RUNNING/BLOCKED)と待機理由を確認
  4. ブロッキングポイントを特定

GC分析

  1. [GCStats] をクリック
  2. GCの頻度、時間、割合を確認
  3. Gen2コレクションが多い場合はメモリリークの可能性

1.4 メリット

  • 無料で使用可能
  • 軽量で強力な分析能力
  • ETWベースで低オーバーヘッド
  • コマンドラインからの自動化も可能
  • メモリとCPUの両方の問題を分析可能

1.5 デメリット

  • 学習曲線が急(UIが直感的でない)
  • 結果の解釈に専門知識が必要
  • リモートサーバーでの使用には追加設定が必要

2. dotTrace/dotMemory (JetBrains)

2.1 概要

JetBrainsが提供する商用.NETプロファイリングツール。dotTraceはCPUプロファイリング、dotMemoryはメモリプロファイリング専用です。

2.2 入手方法

URL: https://www.jetbrains.com/profiler/ ライセンス: 商用(30日間の無料評価版あり)

2.3 基本的な使用手順

dotTrace でのプロファイリング

  1. dotTrace を起動
  2. [Profile Local Process] を選択
  3. リストから w3wp.exe を選択
  4. プロファイリングタイプを選択:
    • Sampling: 低オーバーヘッドで概要把握(推奨)
    • Tracing: 詳細な実行情報(より高負荷)
  5. [Run] をクリック
  6. CPU使用率が高い状態で [Get Snapshot] をクリック
  7. スナップショット取得後 [Stop] をクリック

dotTrace での結果分析

  1. スナップショットが自動的に開かれる
  2. [Hot Spots] ビューでCPU使用率の高いメソッドを確認
  3. [Call Tree] で呼び出し階層を分析
  4. [Thread States] で各スレッドの状態を確認
  5. 右クリック→[Navigate to Source] でコードに直接ジャンプ可能

dotMemory でのメモリ分析

  1. dotMemory を起動
  2. [Local] → w3wp.exe プロセスを選択
  3. [Get Snapshot] をクリック
  4. 数分後に再度 [Get Snapshot] をクリック
  5. 2つのスナップショットを比較して、オブジェクト増加を確認
  6. [Retention Path] で大きなオブジェクトの参照元を追跡

2.4 メリット

  • 直感的なUI、使いやすいインターフェース
  • 詳細なフィルタリングと視覚化機能
  • ソースコードへの直接ナビゲーション
  • リモートプロファイリングが容易
  • 専門知識が少なくても分析可能

2.5 デメリット

  • 有料のライセンスが必要
  • プロファイリング中のオーバーヘッドがPerfViewより大きい
  • 本番環境での使用は慎重に検討が必要

3. 高CPU問題調査のベストプラクティス

3.1 調査の流れ

  1. 再現環境の準備
  2. PerfView または dotTrace で初期データ収集
  3. ホットスポットの特定
  4. スレッド状態と待機理由の分析
  5. アプリケーションコードの問題箇所特定
  6. 必要に応じてメモリ分析も実施
  7. 改善策の検討と実装

3.2 よくある高CPU原因と検出方法

問題パターン 検出方法 ツールの活用ポイント
無限ループ 同一メソッドが上位に表示 PerfView: CPU Stacksで繰り返しパターン確認
dotTrace: Hot Spotsで集中箇所確認
非効率なDB処理 DB関連メソッドの高CPU PerfView: データアクセス部分のスタック分析
dotTrace: SQLクエリ時間の詳細表示
ロック競合 スレッドの待機状態が多い PerfView: Thread Time Stacksでロック待ち確認
dotTrace: Thread Statesでブロッキング分析
過剰なGC GC関連スタックが多い PerfView: GCStatsでGC頻度確認
dotMemory: メモリ消費と解放パターン分析
JSON/XML処理オーバーヘッド シリアル化関連が上位 両ツール: シリアライザー関連のメソッド確認
スレッドプール枯渇 ThreadPool関連スタックが多い PerfView: ThreadTimeで待機スレッド分析
dotTrace: Thread Countでスレッド数推移確認

3.3 調査レポート作成のポイント

  1. 問題の現象と発生条件の整理
  2. ツールで検出した高CPU原因の特定
  3. スタックトレースやホットパスのスクリーンショット
  4. 問題コードと改善推奨事項
  5. 短期対応と長期対応の提案

4. ツール選択の判断基準

判断基準 PerfView dotTrace/dotMemory
コスト 無料 商用ライセンス必要
学習曲線 高い(複雑なUI) 中程度(直感的UI)
分析精度 非常に高い 高い
システム負荷 低い 中~高
リモート分析 複雑な設定が必要 比較的容易
自動化 コマンドラインで可能 限定的
レポート機能 基本的 高度でグラフィカル
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment