Files
im_server/loadtest/im-pressure/MACHINE-B.md
T

178 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 机器 B 压测执行手册
## 给机器 B 上 AI 的指令
你当前操作的是 **机器 B**,代码与机器 A 完全相同。你的职责只有:核验运行文件、启动 `agent -machine b`、观察运行状态、把结果留给机器 A。不要执行 `prepare`、`coordinator` 或 `merge`,不要修改账号分片。
机器 B 固定模拟 `ltb0001` 至 `ltb1000` 共 1000 个用户。测试场景和统一开始时间由机器 A 的 coordinator 下发。
## 当前 allrich 测试批次
以下参数适用于 2026-09-27 正在执行的第一轮单聊压测:
| 参数 | 值 |
|---|---|
| Git 分支 | `dev` |
| 最低提交 | `6d17154` |
| 企业码 | `allrich` |
| HTTP | `https://api.118im.com` |
| WebSocket | `wss://api.118im.com/v0/channels` |
| 机器 A 内网地址 | `192.168.1.135` |
| Coordinator | `http://192.168.1.135:8090` |
| Run ID | `p2p-20260927-01` |
| 场景 | `p2p` |
| 机器 A 状态 | `1000/1000 READY`,等待机器 B |
机器 A 已生成安全运行包:
```text
/tmp/allrich-machine-b-runtime-p2p-20260927-01.tar.gz
SHA-256: ed22883856862e0ef8183cf14c4306d4569904400867cb2a236c3498e5c6f574
```
运行包内只有三个运行时文件:`.env.test`、`config.json`、`manifest.json`。其中包含 API Key、测试账号密码、固定测试验证码和账号 Token,不进入 Git,必须通过受控内网传输。测试环境验证码为 `123456`,正式环境禁止使用固定验证码。
本轮 A/B 都通过同一个公共 WebSocket LB 接入。它能覆盖负载均衡后的多 Pod 投递,但不能保证 A、B 被固定分配到不同 Pod;需要强制跨指定 Pod 时,应另行提供两个定向 WS 入口并更新 `config.json`。
## 运行前向机器 A 获取
开始前必须拿到以下信息:
- `MACHINE_A_IP`:机器 A 的内网 IP。
- `RUN_ID`:本轮唯一标识,例如 `p2p-20260927-01`。
- `config.json`:两台机器使用同一份配置。
- `manifest.json`:由机器 A 执行 `prepare` 生成,包含账号 Token 和 Topic。
- `IM_API_KEY`、`IM_LOAD_PASSWORD`:通过安全方式提供,不写进代码或结果文件。
- 机器 A 已启动 coordinator 的确认。
同一份代码不代表运行时 manifest 会自动同步。如果本机没有最新的 `manifest.json`,必须让机器 A 传过来;机器 B 不得自行执行 `prepare`。
## 第一步:进入仓库并构建
把 `/absolute/path/to/im_server` 换成本机仓库绝对路径:
```bash
cd /absolute/path/to/im_server
git rev-parse HEAD
go build -o loadtest/im-pressure/im-pressure ./loadtest/im-pressure
ulimit -n 100000
```
将 `git rev-parse HEAD` 的结果发给机器 A,确认两边代码版本一致。
## 第二步:放置运行文件
机器 A 应把文件放到:
```text
loadtest/im-pressure/config.json
loadtest/im-pressure/manifest.json
```
检查并保护 manifest:
```bash
test -s loadtest/im-pressure/config.json
test -s loadtest/im-pressure/manifest.json
chmod 600 loadtest/im-pressure/manifest.json
```
## 第三步:设置环境变量并核验
```bash
export IM_API_KEY='由机器A提供'
export IM_LOAD_PASSWORD='由机器A提供'
export MACHINE_A_IP='机器A内网IP'
export RUN_ID='由机器A提供的本轮run-id'
./loadtest/im-pressure/im-pressure verify \
-config loadtest/im-pressure/config.json \
-manifest loadtest/im-pressure/manifest.json
```
`verify` 必须成功后才能继续。它只读核验 2000 个账号、P2P Topic 和 2000 人群,不会开始压测。
## 第四步:检查机器 A 协调器
```bash
curl -fsS "http://${MACHINE_A_IP}:8090/v1/status"
```
如果连接失败,停止操作并让机器 A 检查 coordinator、内网 IP、防火墙和 `8090` 端口。不要改为本机启动 coordinator。
## 第五步:启动机器 B agent
```bash
mkdir -p "loadtest/im-pressure/results/${RUN_ID}"
./loadtest/im-pressure/im-pressure agent \
-config loadtest/im-pressure/config.json \
-manifest loadtest/im-pressure/manifest.json \
-machine b \
-coordinator "http://${MACHINE_A_IP}:8090" \
-metrics-listen :9105 \
-output "loadtest/im-pressure/results/${RUN_ID}/agent-b-summary.json"
```
启动后会依次发生:
1. 机器 B 建立 1000 条 WebSocket 连接并订阅对应 P2P Topic 和群 Topic。
2. agent 向机器 A coordinator 报告 READY。
3. 如果机器 A 尚未 READY,当前命令会等待,这是正常现象。
4. coordinator 下发 `run_id`、场景和统一 UTC 开始时间。
5. agent 完成发送、WS 到达统计、drain 和历史持久化回查。
6. agent 写出 summary、上报 coordinator,然后正常退出。
机器 B 不需要传场景参数。`p2p`、`group` 或 `mixed` 由机器 A coordinator 决定。
## 第六步:检查并回传结果
```bash
test -s "loadtest/im-pressure/results/${RUN_ID}/agent-b-summary.json"
```
将以下文件路径和运行是否成功告知机器 A:
```text
loadtest/im-pressure/results/<RUN_ID>/agent-b-summary.json
```
如果机器 A 无法直接读取机器 B 文件,由机器 A 使用 `scp` 拉取,或从机器 B 推送:
```bash
scp "loadtest/im-pressure/results/${RUN_ID}/agent-b-summary.json" \
user@机器A内网IP:/absolute/path/to/im_server/loadtest/im-pressure/results/${RUN_ID}/
```
## 运行中观察
另开一个终端可以查看本机 agent 指标:
```bash
curl -fsS http://127.0.0.1:9105/metrics | \
grep -E 'im_load_agent_(ready_connections|publish|received|duplicates|out_of_order|disconnects)'
```
关键判断:
- `im_load_agent_ready_connections` 应到达 `1000`。
- `disconnects_total`、`duplicates_total`、`out_of_order_total` 期望为 `0`。
- agent 进程退出前不要关闭终端或停止网络。
## 常见问题
- `coordinator connection refused`:机器 A coordinator 未启动、IP 错误或 `8090` 被拦截。
- 一直等待开始:通常是另一台 agent 尚未达到 1000 个 READY,查看机器 A coordinator 状态。
- 登录返回 `401`:确认本机设置了正确的 `IM_LOAD_PASSWORD`,并让机器 A 重新同步最新 manifest。
- `listen :9105 address already in use`:换成空闲端口,例如 `-metrics-listen :9106`,并通知机器 A 修改采集地址。
- `ready connections` 不足 1000:不要继续压测,检查 WS 地址、文件描述符限制、Ingress 和网络连接限制。
- `verify` 失败:停止,不要绕过;让机器 A 核对数据准备结果和本机运行文件版本。
## 机器 B 禁止事项
- 禁止运行 `prepare`,避免重复创建或改变测试数据。
- 禁止运行 `coordinator`,全场只能使用机器 A 的 coordinator。
- 禁止把参数改成 `-machine a`。
- 禁止自行改变 `RUN_ID`、config 或 manifest。
- 禁止提交或传播包含 Token 的 manifest。