江西206网络稳定性现场测试执行手册

版本:2026-08-22
执行状态:待现场确认和执行
目标:定位消费机、绑盘机、称重台到智慧餐厅服务端HTTP通信不稳定的具体故障区段

1. 最终要回答的问题

本次测试必须形成以下结论之一,不能只给出“网络不好”或“服务器正常”:

  1. 故障位于餐厅设备接入段、本地交换链路、跨地区链路、服务器接入段、HTTP服务端还是数据库。
  2. 问题是否只在就餐高峰出现,触发条件是吞吐、连接数、持续时间还是某个业务接口。
  3. 客户端秒级等待发生在请求到达服务器前、服务端处理期间,还是响应回程阶段。
  4. 更换或重启单个设备后,同负载、同脚本下指标是否可重复改善。

2. 人员分工

角色 人数 职责
现场工程师 1 放置测试电脑、确认线缆和端口、记录真实设备现象
网络工程师 1 提供VLAN/端口/链路信息,导出交换机、路由器或防火墙指标
应用工程师 1 准备测试数据、接口脚本、日志和trace_id对照
测试记录人 1 统一测试编号、时间轴、结果表和证据文件;可由应用工程师兼任

未经现场负责人、网络负责人和应用负责人共同确认,不进行主动负载测试。

3. 电脑、系统与放置点

3.1 标准配置

准备4台电脑:3台Linux测试电脑,1台Windows控制电脑。

编号 系统 放置位置 用途
A Ubuntu 22.04/24.04、麒麟或同类Linux 与问题消费机/绑盘机/称重台同一接入交换机、同VLAN 代表设备端发起网络和HTTP测试
B Linux 安防控制室机房或跨地区专网边界交换机侧 分离餐厅本地网络与跨地区传输
C Linux 应用服务器同一交换机、同VLAN 服务器侧探针及iperf3服务端
D Windows 10/11 安防控制室值守点 SSH远程控制A/B/C、收集文件和统一记录

最低配置为A、C两台Linux电脑加D控制电脑,但无法精确区分A到B与B到C两个区段。

3.2 每台Linux电脑要求

3.3 远程控制方式

  1. 给A/B/C配置现场允许的固定测试IP或DHCP保留地址。
  2. D电脑通过SSH登录三台Linux电脑。
  3. 每个长任务在tmux中运行,避免远程窗口断开导致任务停止。
  4. 使用scp从A/B/C收集证据到D电脑。
  5. 不使用远程工具修改生产网关、路由、VLAN、ACL或服务器网卡配置。

Windows控制端示例:

ssh tester@A_IP
ssh tester@B_IP
ssh tester@C_IP
scp -r tester@A_IP:/tmp/jx206-net-* D:\jx206-net-evidence\A\

4. 执行前填写的拓扑表

没有填完本表,不开始测试。

项目 现场值
应用服务IP/端口 192.168.0.11:8080,执行前再次确认
数据库IP/端口 待确认
A测试IP/网关/VLAN/交换机端口 待确认
B测试IP/网关/VLAN/交换机端口 待确认
C测试IP/网关/VLAN/交换机端口 待确认
问题设备IP/编号/交换机端口 待确认
路由器或防火墙管理地址/型号 待确认
餐厅侧跨地区出入口 待确认
服务端侧跨地区出入口 待确认
各段链路速率/双工/光口信息 待确认
真实业务是否经过被怀疑的路由器 待确认

5. 测试参数文件

在A/B/C分别建立相同的参数文件,仅填写实际地址,不写账号密码或业务请求体:

export TEST_ID=jx206-net-20260822
export SERVER_IP=192.168.0.11
export SERVER_PORT=8080
export GATEWAY_IP=待填写
export A_IP=待填写
export B_IP=待填写
export C_IP=待填写
export DEVICE_IP=待填写
export IFACE=待填写
export HEARTBEAT_PAYLOAD=/受控路径/heartbeat-test.json
export OUT=/tmp/$TEST_ID-$(hostname)-$(date +%Y%m%d-%H%M%S)
mkdir -p "$OUT"

heartbeat-test.json由应用工程师使用测试设备编号生成并受控保管,例如只包含接口必需的测试参数。不要把真实设备凭据写入本文档或公共仓库。

6. 执行顺序总览

顺序 操作 得到的结论
0 授权、拓扑、校时、接口与端口确认 确保后续证据可对齐、路径真实
1 服务端L0回环基线 判断应用和数据库在无网络路径下是否已慢
2 C到服务端L1测试 判断服务器NIC和直连接入是否正常
3 A/B/C分段网络测试 判断异常落在本地、跨地区还是服务器接入段
4 各点低频长时探测 找偶发丢包、时延尖峰和持续时间触发条件
5 闭餐时段吞吐测试 判断单向/双向吞吐、并发流和队列问题
6 同脚本HTTP接口测试 区分网络总耗时与服务端runtime
7 就餐高峰被动观察 还原真实故障窗口,不主动制造生产负载
8 异常现场采证 在重启前保留交换机、网关、服务器和抓包证据
9 单设备变更对照 验证重启/替换是否真正改变相同负载下的结果

7. 第0步:预检

7.1 三台Linux电脑执行

date; timedatectl status | sed -n '1,12p'; chronyc tracking 2>/dev/null || true
ip -br addr; ip route; ip route get "$SERVER_IP"
ethtool "$IFACE" 2>/dev/null | grep -E 'Speed|Duplex|Link detected'
ss -s

要求:

7.2 端口可达性

timeout 5 bash -c "</dev/tcp/$SERVER_IP/$SERVER_PORT" && echo TCP_OK || echo TCP_FAIL
curl -sS -o /dev/null --connect-timeout 3 -w 'code=%{http_code} connect=%{time_connect} start=%{time_starttransfer} total=%{time_total}\n' "http://$SERVER_IP:$SERVER_PORT/"

TCP失败时先排查路由、ACL、防火墙、监听和端口,不进入业务压测。

8. 第1步:服务端L0回环基线

在应用服务器执行,接口选择只读或测试接口:

for i in $(seq 1 100); do date '+%F %T.%3N'; curl -sS -o /dev/null --connect-timeout 2 --max-time 5 -w 'code=%{http_code} connect=%{time_connect} start=%{time_starttransfer} total=%{time_total}\n' -X POST "http://127.0.0.1:$SERVER_PORT/p/api/heartbeat" -H 'Content-Type: application/json' --data-binary @"$HEARTBEAT_PAYLOAD"; sleep 0.2; done | tee "$OUT/l0-heartbeat.log"

同步采集服务器:

sar -u -r -n DEV,EDEV,TCP,ETCP 1 600 > "$OUT/server-sar.log" &
vmstat 1 600 > "$OUT/server-vmstat.log" &
iostat -xz 1 600 > "$OUT/server-iostat.log" &
ss -s > "$OUT/server-ss-before.log"

判定:L0已经慢或失败,优先查应用、PHP-FPM、数据库和本机依赖,暂不下网络容量结论。

9. 第2步:C到服务端L1基线

在C执行:

ping -D -i 0.2 -c 300 "$SERVER_IP" | tee "$OUT/c-to-server-ping.log"
mtr -n -rwzc 300 "$SERVER_IP" | tee "$OUT/c-to-server-mtr.log"
mtr -n -T -P "$SERVER_PORT" -rwzc 300 "$SERVER_IP" | tee "$OUT/c-to-server-mtr-tcp.log"

判定:L0正常但L1异常,优先检查C本机网卡、服务器NIC、双方交换机端口及直连交换机。

10. 第3步:A/B/C分段网络测试

依次执行并保存结果:

ping -D -i 0.2 -c 600 "$GATEWAY_IP" | tee "$OUT/to-gateway-ping.log"
ping -D -i 0.2 -c 600 "$SERVER_IP" | tee "$OUT/to-server-ping.log"
mtr -n -rwzc 600 "$SERVER_IP" | tee "$OUT/to-server-mtr.log"
mtr -n -T -P "$SERVER_PORT" -rwzc 600 "$SERVER_IP" | tee "$OUT/to-server-mtr-tcp.log"

再分别测试A到B、B到C、A到C。根据结果判断:

注意:mtr中间节点不回复ICMP不等于该节点丢包,只有后续节点和目标端也同步丢包才可作为路径证据。

11. 第4步:长时间稳定性探测

在A/B/C的tmux中同步运行30至60分钟;需要观察偶发故障时可延长到24小时:

tmux new -s jx206-net
ping -D -i 0.2 "$SERVER_IP" | tee "$OUT/long-ping-server.log"

另开窗口低频测试HTTP:

while true; do date '+%F %T.%3N'; curl -sS -o /dev/null --connect-timeout 2 --max-time 5 -w 'code=%{http_code} connect=%{time_connect} start=%{time_starttransfer} total=%{time_total}\n' -X POST "http://$SERVER_IP:$SERVER_PORT/p/api/heartbeat" -H 'Content-Type: application/json' --data-binary @"$HEARTBEAT_PAYLOAD"; sleep 5; done | tee "$OUT/long-http-heartbeat.log"

该步骤用于寻找时延尖峰、连续丢包和HTTP连接异常,不代表业务接口性能。

12. 第5步:闭餐时段iperf3吞吐测试

先确认C到服务器侧允许临时监听5201端口。若不能在服务器启动,可在C启动,A/B作为客户端。

C执行:

iperf3 -s -p 5201

A和B依次执行:

iperf3 -c "$C_IP" -p 5201 -t 120 -i 1 -P 1 | tee "$OUT/iperf-p1-forward.log"
iperf3 -c "$C_IP" -p 5201 -t 120 -i 1 -P 1 -R | tee "$OUT/iperf-p1-reverse.log"
iperf3 -c "$C_IP" -p 5201 -t 120 -i 1 -P 4 | tee "$OUT/iperf-p4-forward.log"
iperf3 -c "$C_IP" -p 5201 -t 120 -i 1 -P 4 -R | tee "$OUT/iperf-p4-reverse.log"
iperf3 -c "$C_IP" -p 5201 -u -b 10M -t 120 -i 1 | tee "$OUT/iperf-udp-10m.log"

先执行单流,再执行4流;UDP从10 Mbit/s开始,只有网络负责人确认后才提高。生产高峰禁止执行满带宽和高并发iperf3

判定:

13. 第6步:同脚本HTTP业务测试

13.1 安全要求

13.2 接口顺序

  1. /p/api/heartbeat
  2. /api/weigh/pushWeight
  3. /p/api/bindPlateInfo
  4. /p/api/zhctPushMeal
  5. /api/consume/orderPay,最后执行且必须使用可回滚测试账户

通用curl计时模板:

curl -sS --connect-timeout 2 --max-time 10 -o "$OUT/response-$(date +%s%N).json" -w 'code=%{http_code} connect=%{time_connect} start=%{time_starttransfer} total=%{time_total}\n' -X POST "http://$SERVER_IP:$SERVER_PORT/接口路径" -H 'Content-Type: application/json' --data-binary @/受控路径/test-payload.json

每个trace_id在服务端查找对应日志,记录:

测试ID 客户端开始 客户端总耗时 trace_id 服务端runtime 差值 HTTP状态 结果
待填写

若客户端耗时13秒、服务端runtime仅0.1秒,说明这13秒不能算作后端执行时间,应继续定位请求到达前、回包、客户端队列或重试。

14. 第7步:就餐高峰被动观察

高峰期间只运行以下低风险任务:

不得在高峰运行大流量iperf3、固定大并发接口压测或批量真实订单。

15. 第8步:异常出现后的10分钟动作

先采证,后重启。按以下顺序执行:

  1. 记录统一时间、设备编号、接口、用户动作和现象。
  2. A/B/C截取故障前后ping、HTTP和路由结果。
  3. 服务端保存资源、TCP重传、连接数、Nginx/PHP-FPM及应用日志。
  4. 网络工程师保存相关端口和网关的CPU、会话、drop、CRC、STP、MAC move和flap计数。
  5. 经批准后进行10分钟受控抓包。

抓包示例:

timeout 600 tcpdump -i any -nn -s 256 "host $DEVICE_IP and tcp port $SERVER_PORT" -w "$OUT/device-$DEVICE_IP-8080.pcap"

抓包文件可能含业务数据,按受限证据保管,不上传公共文档。

16. 第9步:单设备变更对照

证据采集完成后,只允许一次改变一个对象:

  1. 保持同一测试点、同一脚本、同一负载。
  2. 只重启或替换一个交换机、路由器或服务进程。
  3. 重复相同测试并记录前后指标。
  4. 若多个设备同时重启,结果只能说明“全链路重置后恢复”,不能归因到某一台设备。

17. 停止条件

出现以下任一情况立即停止主动测试:

停止后终止测试进程,不修改生产网络配置:

pkill -f 'iperf3 -c' || true
pkill -f 'ping -D' || true
pkill -f 'curl.*heartbeat' || true

18. 现场记录表

18.1 测试运行记录

测试ID 日期时间 点位/路径 脚本版本 目标RPS 持续时间 p95/p99 错误率 丢包/重传 交换机计数增量 证据路径

18.2 异常记录

异常时间 设备编号/IP 业务动作 客户端现象 trace_id 服务端runtime A/B/C网络表现 网络设备指标 变更动作 恢复时间

18.3 交换机端口前后对照

设备/端口 测试前速率/双工 测试前CRC/drop 测试后CRC/drop STP/MAC/flap变化 结论

19. 最终报告模板

测试结束必须输出以下内容:

  1. 已确认拓扑和实际业务路径。
  2. 每个测试ID的脚本、负载、时间和证据路径。
  3. L0至L4对比结果。
  4. 客户端总耗时与服务端runtime对照。
  5. 故障区段、证据、置信度和仍未排除的方向。
  6. 单设备变更前后对照。
  7. 后续整改、复测和业务验收计划。

结论示例应写为:“在测试ID X中,A到B出现2.1%丢包且交换机端口output drop增加,B到C及C到服务器正常;更换A侧上联后同负载复测无丢包。因此故障优先定位于A至B接入链路。”不能只写“网络问题”或“重启后正常”。