summaryrefslogtreecommitdiff
path: root/scripts/python/README.md
blob: 8d8ed53691d780a9560fe5b07c34e97335fd46bc (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
# 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` は現状フル履歴を返し、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を消費していたことが原因でした。