summaryrefslogtreecommitdiff
path: root/scripts/python/README.md
blob: aaab4dcdd10158f5d8923df10cb48b63bc75a9d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# 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、8KiB、32KiB、1MiB content サイズ別
2. **P1 startup/rebuild** — 各payloadを20件保存し、再起動時のindex構築とrebuildを計測
3. **write_message (with tags)** — `metadata_json` 文字列に tags / `memory_tier` を含む書き込み
4. **read_messages** — 100 件のメッセージを読み出し、件数を検証
5. **search_messages** — 同じデータ・同じ query で global / session-scoped を比較
6. **delete_message** — `message_id` 指定削除
7. **rebuild_index** — compaction + snapshot 再生成(5 回反復)
8. **get_system_health** — ストレージ健全性取得
9. **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 レポート

Releaseビルドにはdomain index構築だけを測る`tiny-convmem-search-benchmark.exe`も含まれます。
`benchmark.py`は同じpayload matrixでこれを実行し、E2E時間と切り分けた構築時間および
peak working setをJSON/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` は既定100件・最大1000件で、`nextCursor`を追跡して全履歴を取得

未対応・確認していない項目:

- `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
```

## P2大規模履歴ベンチマーク

```powershell
.venv\Scripts\python.exe p2_benchmark.py --server ..\..\build\windows-vs2026\src\Release\tiny-convmem-mcp.exe --messages 10000 --sessions 1 --output p2_benchmark_10000x1.json
.venv\Scripts\python.exe p2_benchmark.py --server ..\..\build\windows-vs2026\src\Release\tiny-convmem-mcp.exe --messages 50000 --sessions 100 --output p2_benchmark_50000x100.json
```

raw stdioで全ページを検証し、restart、rebuild、peak working set、最大応答byte数を記録します。

従来の約254リクエストでの切断は、Windowsの符号なし`SOCKET`でstdio sentinelを
ネットワーク接続と誤判定し、connection poolを消費していたことが原因でした。