Skip to content

レスポンス遅延の原因調査 #4

@yonaka15

Description

@yonaka15

レスポンスが異常に遅い件について、原因を調査中です。

ユーザーからの追加情報 (2025/06/10):

  • どのようなリクエストでも時間がかかる。
  • 常に発生する。
  • 10数秒程度の遅延が発生する。
  • Redmine以外のMCPサーバーでも同様の遅延が発生するため、DockerもしくはRust側の問題である可能性が高い。

ログ分析結果 (2025/06/11):

提供いただいたログを分析した結果、以下の点が明らかになりました。

  1. MCPサーバーリクエストのタイムアウト:
    [1749558410005] [ERROR] [MCP_PROCESS] Query #43 timed out after 30.003534472s
    MCPサーバー(Node.jsやPython等で実装された実際の処理部分)へのリクエストが30秒のタイムアウト設定を超過しています。

  2. プロセスロック取得の遅延:
    [1749558410005] [DEBUG] [HTTP_HANDLER] Acquired process lock in 8.374173754s
    HTTPリクエストハンドラがMCPサーバープロセスへのアクセス権(ロック)を取得するのに約8.37秒かかっています。これがレスポンス遅延の主な原因と考えられます。

  3. MCPサーバー自体の応答速度:
    タイムアウトが発生した後、次のリクエスト(Query #44)はMCPサーバープロセス自体は非常に高速に応答しています(約11.7ms)。
    このことから、MCPサーバー(Node.jsやPythonで記述されたエージェントなど)自体の処理は遅くないと考えられます。

  4. HTTPハンドラ全体の処理時間:
    正常に完了したリクエスト(Query #44)でも、HTTPハンドラ全体としては約8.38秒かかっており、これはプロセスロック取得の遅延時間とほぼ一致します。

結論:

レスポンスが10数秒かかる主な原因は、Rust側のHTTPハンドラがMCPサーバープロセスへのアクセスロックを取得するのに非常に時間がかかっていることである可能性が極めて高いです。
これは、前のリクエストがタイムアウトした際に、ロックが適切に解放されない、あるいはプロセスが不安定な状態になり、後続のリクエストがロックを取得できるまで長時間待たされる、といったシナリオが考えられます。

開発者への依頼:

Rust側のロック管理機構、特にリクエストタイムアウト発生時のロック解放処理やプロセスの状態管理に問題がないか、コードレビューをお願いします。

ユーザーへの追加確認事項:

  1. 環境変数 RESPONSE_TIMEOUT_SECSPROCESS_INIT_WAIT_SECS の現在の設定値を改めて教えてください。
  2. もし可能であれば、RESPONSE_TIMEOUT_SECS の値を一時的に変更(例: 10秒や60秒)した場合、ロック取得の遅延時間や全体のレスポンス時間に変化が見られるか確認していただけると助かります。

引き続き、上記について情報提供をお願いします。

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions