Skip to content

パフォーマンスガイド

Fluorite MCPにおけるパフォーマンスの最適化、監視、トラブルシューティングに関する包括的なガイドです。

概要

Fluorite MCPは、組み込みの監視、最適化機能、エンタープライズグレードのスケーラビリティを備えた高パフォーマンス操作向けに設計されています。このガイドでは、パフォーマンス特性、最適化戦略、本番デプロイのベストプラクティスをカバーします。

パフォーマンス特性

主要パフォーマンスメトリクス

メトリクス目標優秀良好要注意
応答時間<100ms<50ms<100ms>200ms
メモリ使用量<50MB<25MB<50MB>100MB
起動時間<2s<1s<2s>5s
スループット>1000 ops/min>2000 ops/min>1000 ops/min<500 ops/min
エラー率<0.1%<0.01%<0.1%>1%

フレームワーク特有のパフォーマンス

静的解析パフォーマンス

  • TypeScript解析: ファイルあたり約50ms
  • Reactコンポーネント解析: コンポーネントあたり約30ms
  • Next.jsルート解析: ルートあたり約20ms
  • Vueコンポーネント解析: コンポーネントあたり約40ms

カタログ操作パフォーマンス

  • 仕様検索: <10ms(キャッシュ済み)、<50ms(ディスク)
  • 仕様書き込み: 操作あたり約20ms
  • 一覧操作: 100未満の仕様で<30ms
  • 検索操作: 87以上の仕様全体で<100ms

組み込みパフォーマンス監視

パフォーマンスモニター

Fluorite MCPには包括的なパフォーマンス監視システムが含まれています:

typescript
// 自動操作タイミング
logger.time('operation-name', async () => {
  // あなたの操作をここに
});

// 手動パフォーマンス記録
performanceMonitor.recordOperation('custom-op', duration);

// パフォーマンスメトリクスの取得
const metrics = performanceMonitor.getMetrics();

リアルタイムメトリクス

server-metrics ツールを通じてリアルタイムパフォーマンスデータにアクセス:

bash
# CLI経由
fluorite-mcp --server-metrics

# MCPプロトコル経由
{
  "method": "tools/call",
  "params": {
    "name": "server-metrics"
  }
}

サンプル出力:

json
{
  "uptime": 3600000,
  "operationCount": 1250,
  "errorCount": 2,
  "errorRate": 0.0016,
  "memory": {
    "heapUsed": 45.2,
    "heapTotal": 67.8,
    "external": 12.3,
    "rss": 89.1
  },
  "performanceMetrics": {
    "avg": 45.2,
    "max": 180,
    "min": 12,
    "count": 1250
  }
}

パフォーマンステスト

包括的なパフォーマンステストの実行:

bash
# 組み込みパフォーマンステスト
fluorite-mcp --performance-test

# MCPプロトコル経由
{
  "method": "tools/call",
  "params": {
    "name": "performance-test"
  }
}

パフォーマンステストカバレッジ:

  • カタログ操作(読み取り/書き込み/一覧)
  • メモリリーク検出
  • 並行操作処理
  • エラー復旧パフォーマンス
  • 静的解析スループット

最適化戦略

1. メモリ最適化

メモリ使用量の監視

typescript
// 現在のメモリ使用量を取得
const metrics = logger.getMetrics();
console.log(`メモリ使用量: ${metrics.memory.heapUsed}MB`);

// パフォーマンス閾値監視
if (metrics.memory.heapUsed > 100) {
  logger.warn('高メモリ使用量を検出', { 
    usage: metrics.memory.heapUsed 
  });
}

メモリ最適化技術

  • 遅延読み込み: 仕様はオンデマンドで読み込み
  • ガベージコレクション: 未使用リソースの自動クリーンアップ
  • ストリーム処理: 大きなファイルをチャンクで処理
  • キャッシュ管理: 頻繁にアクセスされる仕様のLRUキャッシュ

2. I/O最適化

ファイルシステム操作

typescript
// バッチファイル操作
const batchSize = 10;
const files = await Promise.all(
  batch.map(file => readSpec(file, config))
);

// 非同期ファイル操作
const content = await fs.readFile(path, 'utf8');

キャッシュ戦略

  • インメモリキャッシュ: 頻繁にアクセスされる仕様
  • ディスクキャッシュ: 複雑な操作のパース済みコンテンツ
  • バージョン対応: コンテンツ変更時のキャッシュ無効化

3. 静的解析最適化

パフォーマンス設定

typescript
const analyzerConfig = {
  maxIssues: 100,           // 問題検出の制限
  enabledRules: ['critical'], // 重要なルールにフォーカス
  strictMode: false,        // 処理オーバーヘッドを削減
  targetFiles: ['src/**']   // 解析スコープを制限
};

フレームワーク特有の最適化

  • React: コンポーネントレベル解析キャッシュ
  • Next.js: ルートベース最適化
  • TypeScript: 増分型チェック
  • Vue: テンプレートコンパイルキャッシュ

4. 並行操作

接続プール管理

typescript
// 並行操作の設定
const config = {
  maxConcurrentOperations: 10,
  operationTimeout: 30000,
  retryAttempts: 3
};

負荷分散

  • 操作キューイング: 並行リクエストの管理
  • リソース配分: 動的リソース分散
  • グレースフル劣化: 負荷下でのフォールバック戦略

本番デプロイ

リソース要件

最小システム要件

  • Node.js: 18.0以上(20.0以上推奨)
  • メモリ: 512MB RAM最小、1GB推奨
  • CPU: 1コア最小、2コア以上推奨
  • ディスク: インストール用100MB、キャッシュ用500MB
  • ネットワーク: ライブラリ検索用の安定したインターネット

スケーリングガイドライン

デプロイサイズメモリCPU同時ユーザー仕様数
小規模1GB2コア<50<100
中規模2GB4コア<200<500
大規模4GB8コア<1000<1000
エンタープライズ8GB以上16コア以上>1000>1000

環境設定

パフォーマンス環境変数

bash
# ログ設定
FLUORITE_LOG_LEVEL=info           # ログ詳細度を削減
FLUORITE_LOG_FORMAT=json          # 構造化ログ
FLUORITE_LOG_DISABLE=false        # ログ有効化

# パフォーマンスチューニング
NODE_OPTIONS="--max-old-space-size=4096"  # メモリ制限
UV_THREADPOOL_SIZE=16              # I/Oスレッドプールサイズ

# キャッシュ設定
FLUORITE_CATALOG_DIR=/fast/storage # カタログ用SSD使用

本番最適化

bash
# 本番最適化を有効化
NODE_ENV=production

# デバッグ機能を無効化
DEBUG=

# プロセス管理設定
pm2 start fluorite-mcp --instances 4 --max-memory-restart 1G

負荷テスト

ベンチマークスクリプト

bash
#!/bin/bash
# performance-benchmark.sh

echo "🚀 Fluorite MCPパフォーマンスベンチマーク開始"

# ウォームアップ
for i in {1..10}; do
  fluorite-mcp list-specs >/dev/null 2>&1
done

# スループットテスト
start_time=$(date +%s%N)
for i in {1..100}; do
  fluorite-mcp list-specs >/dev/null 2>&1 &
done
wait
end_time=$(date +%s%N)

duration=$((($end_time - $start_time) / 1000000))
throughput=$((100 * 1000 / $duration))

echo "✅ 100操作を${duration}msで完了"
echo "📊 スループット: ${throughput} ops/秒"

ストレステスト

typescript
// stress-test.ts
import { performance } from 'perf_hooks';

async function stressTest() {
  const operations = 1000;
  const concurrency = 50;
  
  const start = performance.now();
  
  // 並行操作の実行
  const promises = Array.from({ length: operations }, (_, i) => 
    runOperation(i % concurrency)
  );
  
  const results = await Promise.allSettled(promises);
  const end = performance.now();
  
  const successful = results.filter(r => r.status === 'fulfilled').length;
  const failed = results.filter(r => r.status === 'rejected').length;
  
  console.log({
    operations,
    duration: end - start,
    successful,
    failed,
    throughput: operations / ((end - start) / 1000)
  });
}

監視とオブザーバビリティ

構造化ログ

ログレベルとパフォーマンス影響

レベル影響使用ケースパフォーマンスコスト
trace最小開発デバッグ
debug開発/ステージング
info最小本番監視
warnなし本番アラートなし
errorなしエラートラッキングなし

パフォーマンス重視ログ

typescript
// 効率的なログパターン
logger.info('操作完了', {
  operation: 'read-spec',
  duration: 45,
  packageName: pkg,
  performanceMetrics: {
    memoryUsage: process.memoryUsage(),
    responseTime: duration
  }
});

ヘルスチェック

組み込みヘルス監視

bash
# クイックヘルスチェック
fluorite-mcp --self-test

# 包括的監視
fluorite-mcp --server-metrics

カスタムヘルスチェック

typescript
// health-check.ts
export async function healthCheck() {
  const start = performance.now();
  
  try {
    // 基本操作のテスト
    await listSpecs();
    const testResult = await runSelfTest();
    const metrics = await getServerMetrics();
    
    const duration = performance.now() - start;
    
    return {
      status: 'healthy',
      duration,
      metrics,
      timestamp: new Date().toISOString()
    };
  } catch (error) {
    return {
      status: 'unhealthy',
      error: error.message,
      timestamp: new Date().toISOString()
    };
  }
}

アラート

パフォーマンスアラート

yaml
# alerts.yml
alerts:
  - name: "高メモリ使用量"
    condition: "memory.heapUsed > 100"
    severity: "warning"
    action: "restart"
  
  - name: "高エラー率"
    condition: "errorRate > 0.05"
    severity: "critical"
    action: "investigate"
  
  - name: "低速応答時間"
    condition: "avg_response_time > 200"
    severity: "warning"
    action: "optimize"

パフォーマンス問題のトラブルシューティング

一般的なパフォーマンス問題

1. 高メモリ使用量

症状:

  • メモリ使用量>100MB
  • 時間の経過とともにメモリが徐々に増加
  • OutOfMemoryエラー

診断:

bash
# メモリ使用量チェック
fluorite-mcp --server-metrics | grep memory

# 時間経過での監視
watch -n 5 'fluorite-mcp --server-metrics'

解決策:

  • サービスの定期再起動
  • 並行操作の削減
  • キャッシュの定期クリア
  • メモリ割り当ての増加

2. 低速応答時間

症状:

  • 応答時間>200ms
  • クライアントタイムアウト
  • スループット低下

診断:

bash
# パフォーマンステスト
fluorite-mcp --performance-test

# 特定操作のチェック
time fluorite-mcp list-specs

解決策:

  • キャッシュの有効化
  • ファイルI/Oの最適化
  • 解析スコープの削減
  • SSDストレージの使用

3. 高エラー率

症状:

  • エラー率>1%
  • 頻繁な操作失敗
  • 不安定な動作

診断:

bash
# エラーパターンのチェック
grep -i error /var/log/fluorite-mcp.log

# 診断実行
fluorite-mcp --self-test

解決策:

  • ファイル権限の修正
  • ディスク容量の確保
  • 依存関係の更新
  • サービスの再起動

パフォーマンスデバッグ

デバッグログの有効化

bash
# 詳細なパフォーマンスログを有効化
FLUORITE_LOG_LEVEL=debug fluorite-mcp
DEBUG=fluorite-mcp* fluorite-mcp

# パフォーマンス専用デバッグ
DEBUG=fluorite-mcp:performance fluorite-mcp

プロファイリングツール

bash
# Node.jsプロファイリング
node --prof dist/mcp-server.js

# メモリプロファイリング
node --inspect dist/mcp-server.js

# CPUプロファイリング
node --cpu-prof dist/mcp-server.js

パフォーマンス最適化チェックリスト

デプロイ前

  • [ ] パフォーマンステストの実行
  • [ ] 適切なメモリ制限の設定
  • [ ] 監視とアラートのセットアップ
  • [ ] 環境変数の最適化
  • [ ] 負荷下でのテスト

ランタイム監視

  • [ ] メモリ使用量トレンドの監視
  • [ ] 応答時間パーセンタイルの追跡
  • [ ] エラー率の監視
  • [ ] ディスク使用量のチェック
  • [ ] ログローテーションの確認

定期メンテナンス

  • [ ] 週次パフォーマンスメトリクスレビュー
  • [ ] 古いキャッシュファイルのクリーンアップ
  • [ ] 最新バージョンへの更新
  • [ ] 高メモリ使用時のサービス再起動
  • [ ] 静的解析ルールのレビューと最適化

高度なパフォーマンス機能

インテリジェントキャッシュ

マルチレベルキャッシュ戦略

typescript
// L1: インメモリキャッシュ(ホットデータ)
const memoryCache = new Map<string, CacheEntry>();

// L2: ディスクキャッシュ(ウォームデータ)
const diskCache = path.join(config.baseDir, '.cache');

// L3: ネットワークキャッシュ(コールドデータ)
const networkCache = '/api/cache'; // ローカルキャッシュエンドポイント

キャッシュ設定

typescript
const cacheConfig = {
  maxMemoryEntries: 1000,
  maxDiskSize: '100MB',
  ttl: 3600, // 1時間
  compressionLevel: 6
};

バッチ処理

最適化されたバッチ操作

typescript
// 複数の仕様を効率的に処理
async function batchProcessSpecs(packages: string[]) {
  const batchSize = 10;
  const results = [];
  
  for (let i = 0; i < packages.length; i += batchSize) {
    const batch = packages.slice(i, i + batchSize);
    const batchResults = await Promise.all(
      batch.map(pkg => processSpec(pkg))
    );
    results.push(...batchResults);
    
    // イベントループに制御を譲る
    await new Promise(resolve => setImmediate(resolve));
  }
  
  return results;
}

リソースプール管理

接続プーリング

typescript
class ResourcePool {
  private resources: Resource[] = [];
  private maxSize = 10;
  private currentSize = 0;
  
  async acquire(): Promise<Resource> {
    if (this.resources.length > 0) {
      return this.resources.pop()!;
    }
    
    if (this.currentSize < this.maxSize) {
      this.currentSize++;
      return this.createResource();
    }
    
    // リソースが利用可能になるまで待機
    return this.waitForResource();
  }
  
  release(resource: Resource): void {
    this.resources.push(resource);
  }
}

ベストプラクティス要約

開発

  • 初日からパフォーマンス監視を使用
  • 開発中は定期的にプロファイリング
  • 現実的なデータサイズでテスト
  • 段階的なパフォーマンス改善の実装

デプロイ

  • 適切なリソース制限の設定
  • 包括的な監視のセットアップ
  • 本番グレードのログ使用
  • 自動ヘルスチェックの実装

メンテナンス

  • 現在の値だけでなくトレンドの監視
  • パフォーマンス劣化のアラート設定
  • 定期的なパフォーマンスレビュー
  • 使用パターンに基づく積極的な最適化

スケーリング

  • 現在の負荷の3倍を計画
  • 高スループットには水平スケーリングを使用
  • グレースフル劣化の実装
  • ボトルネックの継続的な監視と最適化

詳細情報については以下を参照:

Released under the MIT License.