「首帧延迟 200ms」这种说法,如果没有测试条件,基本没有意义。同样的客户端,在家宽、地铁 5G、公司专线下能差三倍;用平均值还是中位数,结论也可能相反。所以先把方法写清楚,再谈数字。
我们的口径是:从用户点击播放按钮,到声卡输出第一个采样点,中间包含 DNS 解析、TLS 握手、首包到达、解码启动与缓冲填充。不包含应用启动时间,也不包含登录与页面加载。
测什么:从点击到出声
测量点在客户端侧。点击事件由自动化脚本注入,出声时刻通过录制声卡回环(loopback)并对波形做起始点检测得到,精度约 ±5ms。这样得到的是「用户真正听到」的时间,而不是「代码认为开始播放」的时间。
中间环节用客户端日志打点:DNS 开始/结束、TCP 连接建立、TLS 完成、首包到达、首帧解码完成、缓冲填充完成。六段相加应当接近总时长,差值超过 15ms 说明有未打点的环节,该次样本作废。
| 环节 | 耗时 | 占比 | 影响因素 |
|---|---|---|---|
| DNS 解析 | 12ms | 8% | 本地缓存、递归服务器 |
| TCP + TLS | 38ms | 25% | RTT、证书链、会话复用 |
| 首包到达 | 64ms | 42% | 边缘命中、回源距离 |
| 解码启动 | 22ms | 14% | 编码格式、CPU |
| 缓冲填充 | 18ms | 12% | 缓冲深度设置 |
| 合计 | 154ms | 100% | 不含声卡驱动延迟 |
采样设计:9000 次怎么来
五个运营商(电信、联通、移动、教育网、海外)各 20 个采样点,每天 3 轮(10:00、20:00、23:00),连续 30 天,理论样本 9000 次。实际有效样本 8742 次,作废的 258 次来自打点缺失与网络中断。
| 维度 | 设置 | 说明 |
|---|---|---|
| 运营商 | 5 类 | 电信/联通/移动/教育网/海外 |
| 采样点 | 每类 20 个 | 覆盖省会与两个地级市 |
| 每日轮次 | 3 轮 | 10:00 / 20:00 / 23:00 |
| 持续天数 | 30 天 | 含 4 个周末 |
| 有效样本 | 8742 次 | 作废 258 次 |
三个时间点是刻意选的。10:00 代表工作日的平稳期,20:00 是晚高峰,23:00 是夜间低谷。只测白天的数据会系统性偏低,只测晚高峰会偏高,三档一起看才有分布。
DNS 缓存必须排除。每次采样前清空本地 DNS 缓存,并把递归服务器固定为运营商默认地址,否则第二次之后的解析会命中缓存,把 12ms 压到 1ms,整条链路的分布就失真了。
时钟同步用 NTP,要求偏差小于 ±2ms。偏差更大的节点直接剔除,因为 TLS 握手与首包的耗时依赖准确的时间戳,时钟漂移会让两段数据互相矛盾。
为什么用中位数
延迟分布是右偏的:大多数样本集中在 150 到 250ms,少数样本因为丢包重传会到 2 秒以上。平均值会被这些长尾拉高,给出一个「谁都没体验到」的数字。中位数描述的是「一半人比这快」,更接近真实感受。
我们同时看 95 分位。中位数好看但 95 分位很差,说明少数用户长期在受罪;中位数一般但 95 分位接近中位数,说明体验稳定。两个数字一起看,才能判断是「普遍慢」还是「局部差」。
样本量也有下限。单点单次测量的波动能到 ±80ms,至少 30 次才有稳定的中位数;跨运营商比较时,每类至少 500 次。低于这个量级的「实测」,只能当个例看。
「把测试条件写在结果旁边,比把数字做漂亮更重要。」——我们在站点说明页写下的一句话
这套方法我们每季度跑一次,客户端大版本更新后补跑一轮。数据会更新到首页的节点延迟区块与对应文章里。想自己复现的读者,需要一台能录回环的设备与一份固定的测试曲目清单,客户端可在下载页获取。
用户评论(4 条)
DNS 缓存那段太真实了,不清缓存测出来的数字全是假的。
中位数加 95 分位这个组合专业,只看平均值确实会被长尾带偏。
教育网 23 点后改善明显,跟我们机房的出口策略对得上。
8742 次有效样本,作废率 2.9%,这个透明度可以。