summaryrefslogtreecommitdiff
path: root/scripts/python/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/python/README.md')
-rw-r--r--scripts/python/README.md121
1 files changed, 121 insertions, 0 deletions
diff --git a/scripts/python/README.md b/scripts/python/README.md
new file mode 100644
index 0000000..7018313
--- /dev/null
+++ b/scripts/python/README.md
@@ -0,0 +1,121 @@
+# tiny-convmem-mcp ユーザ視点負荷テスト
+
+このディレクトリには、[Model Context Protocol (MCP) Python SDK](https://github.com/modelcontextprotocol/python-sdk) を使った、Windows 版 `tiny-convmem-mcp` サーバのエンドツーエンド負荷テスト&ベンチマークスクリプトがあります。
+
+## 環境
+
+`scripts/python/.venv` は uv で構築済みで、以下が含まれています。
+
+- Python 3.12.9
+- `mcp` 1.28.1 (Python SDK)
+
+必要に応じて追加インストールする場合:
+
+```powershell
+uv pip install --python .venv\Scripts\python.exe mcp
+```
+
+## 実行方法
+
+最新の Release ビルドを自動検出して実行します。
+
+```powershell
+cd scripts\python
+..\.venv\Scripts\python.exe benchmark.py
+```
+
+オプション:
+
+| オプション | 説明 |
+|---|---|
+| `--server <path>` | `tiny-convmem-mcp.exe` のパスを明示 |
+| `--iterations N` | 各シナリオの反復回数(デフォルト 100、rebuild/recovery は最大 5) |
+| `--warmup N` | 未使用(後方互換) |
+| `--output <path>` | 出力 JSON(デフォルト `benchmark_results.json`) |
+
+例:
+
+```powershell
+.venv\Scripts\python.exe benchmark.py --server ..\..\build\windows-vs2026\src\Release\tiny-convmem-mcp.exe --iterations 100 --output mybench.json
+```
+
+## 測定内容
+
+すべての操作は stdio MCP プロトコル経由で実際のサーバプロセスに対して行います。
+
+1. **write_message** — 小 (~20B)、中 (1KiB)、大 (32KiB) content サイズ別
+2. **write_message (with tags)** — `metadata_json` 文字列に tags / `memory_tier` を含む書き込み
+3. **read_messages** — 100 件のメッセージを読み出し、件数を検証
+4. **search_messages** — 同じデータ・同じ query で global / session-scoped を比較
+5. **delete_message** — `message_id` 指定削除
+6. **rebuild_index** — compaction + snapshot 再生成(5 回反復)
+7. **get_system_health** — ストレージ健全性取得
+8. **recovery** — プロセス再起動後の復旧を 3 段階で計測
+ - restart + count check(1 回)
+ - restart + small read(5 回)
+ - restart + full read 100 msgs(5 回)
+
+各シナリオは独立した temp data directory で実行され、シナリオ間の状態累積を排除しています。
+
+## 出力
+
+- コンソール: p50/p95/p99/mean レイテンシと ops/sec のサマリ表
+- `<output>.json`: 詳細な計測結果(全サンプル含む)
+- `<output>.md`: Markdown レポート
+
+## 結果の見方
+
+```text
+=== tiny-convmem-mcp 負荷テスト結果 ===
+server : C:\...\Release\tiny-convmem-mcp.exe
+exe_mtime : 2026-06-30 01:46:57
+iterations : 100
+
+scenario succ fail p50[ms] p95[ms] p99[ms] mean[ms] ops/s
+----------------------------------------------------------------------------------------------------------------
+write_message (small ~20B) 100 0 0.399 1.009 1.718 0.505 1981.27
+...
+```
+
+## 注意
+
+- `tiny-convmem-mcp` は単一stdio・単一スレッドサーバのため、リクエストは逐次送信されます。並行負荷テストは対象外です。
+- 計測値には子プロセス起動、JSON シリアライズ、OS I/O、同期耐久性フラッシュ(fsync/FlushFileBuffers)が含まれます。
+- 各シナリオ内の反復は同一プロセス・同一セッションで実行します。したがって `write_message` の大サイズ計測など、前の反復がストレージ状態を変化させる可能性があります。
+
+## 参考: MCP 準拠状況
+
+本テストで確認できる MCP 機能:
+
+- `initialize` / `notifications/initialized`
+- `tools/list`(schema 取得)
+- `tools/call`(明示登録された6ツール)
+- TextContent 内 JSON 応答
+- `isError=true` によるアプリケーションレベルエラー
+
+確認済みのP0契約:
+
+- `write_message.metadata_json` は任意のJSON文字列で、省略時は `{}`
+- `search_messages.session_id` は任意で、省略時はglobal検索
+- `search_messages.limit` は任意で、既定20、整数1~100
+- `delete_message.session_id` は任意
+- `inputSchema.required` とruntimeの必須条件が一致
+- 成功・エラーの全応答がJSON-RPC 2.0形式で、Python MCP SDKから解釈可能
+- `read_messages` は現状フル履歴を返し、paginationは未実装
+
+未対応・確認していない項目:
+
+- `structuredContent` / 出力 schema
+- `resources/*`, `prompts/*`, `sampling/*`, `roots/*`
+- 並行リクエスト / 複数クライアント
+
+## P0回帰テスト
+
+Python MCP SDKでglobal/session-scoped検索を同一接続上で1000回交互に実行できます。
+
+```powershell
+.venv\Scripts\python.exe p0_regression.py --server ..\..\build\windows-vs2026\src\Release\tiny-convmem-mcp.exe
+```
+
+従来の約254リクエストでの切断は、Windowsの符号なし`SOCKET`でstdio sentinelを
+ネットワーク接続と誤判定し、connection poolを消費していたことが原因でした。