使用Yardstick进行MCP性能测试
此存储库再现了本文中描述的性能测试设置 “在Kubernetes中测试MCP服务器的性能:传输选择是扩展MCP的成败决定”.
概述
使用 StacklokLabs/标尺 MCP服务器对不同MCP传输协议的性能进行基准测试:
- 标准:标准输入/输出(性能差,约4%的成功率)
- SSE(服务器发送事件):HTTP流媒体(良好但已弃用)
- 流式HTTP:最佳性能(约300 RPS,带会话池)
参考文件
https://dev.to/stacklok/performance-testing-mcp-servers-in-kubernetes-transport-choice-is-the-make-or-break-decision-for-1ffb
包含内容
mcp-perf-test-setup.sh-Kind+Kubernetes的自动设置脚本Dockerfile.yardstick-用于衡量MCP服务器的Docker容器yardstick-deployment.yaml-用于StreamableHTTP传输的Kubernetes部署yardstick-sse-deployment.yaml-用于SSE传输的Kubernetes部署mcp-load-test-example.py-Python负载测试脚本yardstick,yardstick-client-来自~/scale/build的预构建二进制文件
先决条件
✅ 已安装在您的系统上:
- 码头工人
- kubectl 的
- kind(Docker中的Kubernetes)
快速开始
1.设置环境
cd ~/mcp-perf-testing
# Run the setup script
./mcp-perf-test-setup.sh这将:
- 创建一个Kubernetes集群
- 构建并加载Docker镜像
- 使用StreamableHTTP和SSE传输部署MCP服务器
- 等待部署就绪
2.设置端口转发
在单独的终端窗口中:
# For StreamableHTTP (port 8080)
kubectl port-forward service/yardstick-mcp-service 8080:8080
# For SSE (port 8081)
kubectl port-forward service/yardstick-mcp-sse-service 8081:80813.测试连接性
# Test StreamableHTTP
./yardstick-client -transport streamable-http -port 8080 -action info
# Test SSE
./yardstick-client -transport sse -port 8081 -action info
# Test echo functionality
./yardstick-client -transport streamable-http -port 8080 -action call-tool -tool echo -args '{"text":"Hello World"}'4.运行性能测试
# Install Python dependencies
pip install aiohttp
# Run the load tests
python3 mcp-load-test-example.py预期结果
根据原始文章的发现:
| 传输 | RPS | 成功率 | 会话管理 |
|---|---|---|---|
| 流式HTTP | ~300 | 100% | 共享会话 |
| 上海证券交易所 | ~30 | 100% | 不适用(已弃用) |
| 标准 | 非常低 | ~4% | 直接容器连接 |
文章的主要发现:
- 会话管理至关重要:共享会话与唯一会话之间的性能差异为10倍
- 流式HTTP占主导地位 所有性能指标
- stdio不合适 用于生产用途
- SSE已弃用 但仍能正常工作
手动测试
测试单个运输工具:
# Start yardstick server locally for testing
./yardstick -transport streamable-http -port 9090 &
# Test with client
./yardstick-client -transport streamable-http -port 9090 -action list-tools
./yardstick-client -transport streamable-http -port 9090 -action call-tool -tool echo -args '{"text":"test"}'Kubernetes检查:
# Check deployments
kubectl get deployments
kubectl get pods
kubectl get services
# Check logs
kubectl logs -l app=yardstick-mcp
kubectl logs -l app=yardstick-mcp-sse
# Scale for load testing
kubectl scale deployment yardstick-mcp --replicas=5定制测试
您可以在中修改测试场景 mcp-load-test-example.py:
test_scenarios = [
{"concurrent": 20, "duration": 5, "rps": 10, "name": "Basic Test"},
{"concurrent": 50, "duration": 60, "rps": 100, "name": "High Load"},
{"concurrent": 200, "duration": 60, "rps": 500, "name": "Very High Load"},
]建筑
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Load Tester │───▶│ Port Forward │───▶│ Kind Cluster │
│ (Python) │ │ 8080/8081 │ │ │
└─────────────────┘ └──────────────────┘ │ ┌─────────────┐ │
│ │ yardstick │ │
│ │ MCP Server │ │
│ │ Pods (3x) │ │
│ └─────────────┘ │
└─────────────────┘清理
# Stop port forwarding (Ctrl+C in terminal windows)
# Delete the kind cluster
kind delete cluster --name mcp-perf-test
# Remove Docker image
docker rmi yardstick-mcp:local故障排除
端口转发问题:
# Kill existing port forwards
pkill -f "kubectl port-forward"
# Then restart port forwardingPod未就绪:
# Check pod status
kubectl describe pods -l app=yardstick-mcp
# Check logs
kubectl logs -l app=yardstick-mcp --tail=50负载测试失败:
# Verify connectivity first
curl -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2024-11-05"},"id":"test"}'文章参考
此设置基于中描述的性能测试: “在Kubernetes中测试MCP服务器的性能:传输选择是扩展MCP的成败决定”
关键要点:
- 交通选择是建筑性的,而不仅仅是技术性的
- 带有会话池的StreamableHTTP是前进的道路
- 会话管理可以提供10倍的性能改进
