# GS-USB Daemon 性能测试指南
## 概述
本指南介绍如何测试 daemon 性能指标。
## 测试前准备
### 1. 启动 Daemon
```bash
# 在终端 1 中启动 daemon
cargo run --bin gs_usb_daemon
```
确保 daemon 成功启动并连接到 GS-USB 设备。
### 2. 运行性能测试
```bash
# 在终端 2 中运行性能测试
cargo run --example daemon_latency_bench
```
## 测试场景
### 场景 1: 发送延迟测试
测试从客户端发送帧到 daemon 的延迟。
**预期结果**:
- P50 延迟: < 100μs
- P99 延迟: < 200μs
- P999 延迟: < 500μs
### 场景 2: 接收延迟测试
测试从 daemon 接收帧的延迟(需要外部数据源)。
**注意**: 如果没有外部 CAN 数据源,此测试会超时。
### 场景 3: 吞吐量测试
测试 daemon 的最大吞吐量(fps)。
**预期结果**:
- 吞吐量: > 1000 fps
### 场景 4: 客户端阻塞处理
测试故障客户端是否会被正确断开。
**手动测试步骤**:
1. 启动 daemon
2. 运行性能测试
3. 在另一个终端运行一个"卡死"客户端(连接但不读取数据)
4. 观察 daemon 日志,验证:
- 日志限频生效(不会洪水)
- 1 秒后客户端被断开
- 其他客户端不受影响
## 性能基准参考值
| P50 延迟 | < 100μs | 中位数延迟 |
| P99 延迟 | < 200μs | 99% 分位延迟(关键指标)|
| P999 延迟 | < 500μs | 99.9% 分位延迟 |
| 吞吐量 | > 1000 fps | 每秒帧数 |
| CPU 占用 | < 30% | 单核占用率 |
## 故障排查
### 问题 1: 无法连接到 daemon
**错误**: `无法连接到 daemon: ...`
**解决方案**:
1. 确认 daemon 已启动: `ps aux | grep gs_usb_daemon`
2. 检查 socket 文件: `ls -l /tmp/gs_usb_daemon.sock`
3. 确认 daemon 日志显示设备已连接
### 问题 2: 接收测试超时
**错误**: `超时:只收到 X 帧`
**解决方案**:
- 这是正常的,如果没有外部 CAN 数据源
- 可以跳过接收测试,只关注发送延迟和吞吐量
### 问题 3: 延迟超标
**现象**: P99 延迟 > 200μs
**可能原因**:
1. 系统负载过高
2. USB 设备问题
3. macOS 调度问题
**解决方案**:
1. 关闭其他应用
2. 检查 USB 连接
3. 使用 `sudo` 运行(macOS 可能需要)
## 高级测试
### Round-trip 延迟测试(需要 Loopback 模式)
如果需要测试完整的 round-trip 延迟,需要:
1. 配置设备为 Loopback 模式
2. 发送帧并接收回显
3. 测量完整延迟
### 多客户端并发测试
可以运行多个测试实例来测试并发性能:
```bash
# 终端 2
cargo run --example daemon_latency_bench
# 终端 3
cargo run --example daemon_latency_bench
# 终端 4
cargo run --example daemon_latency_bench
```
观察 daemon 日志,验证:
- 所有客户端正常工作
- 没有性能退化
- 故障客户端被正确隔离
## 结果分析
### 成功标准
✅ **所有测试通过**:
- P99 延迟 < 200μs
- 吞吐量 > 1000 fps
- 客户端阻塞被正确处理
### 性能改进对比
| 最坏延迟 | 200ms | 2ms | 100x |
| P99 延迟 | 250-800μs | 50-200μs | 5x |
| 客户端清理 | 5s | < 1ms | 5000x |
| RX/TX 竞争 | 存在 | 零竞争 | ∞ |
## 参考资料
- 架构分析报告: `docs/v0/gs_usb_daemon_architecture_analysis.md`
- 实施计划: `docs/v0/gs_usb_daemon_implementation_plan.md`