时延、抖动、丢包是三个不同的量,混着说就没有意义。 在通用计算机上测微秒级抖动,量到的主要是主机自己的抖动,不是网络的。
07.03 讲完「怎么买」,07.04 讲「怎么量」——因为规格书上的数字不能直接信。 这一节先分清「要量的是哪个量」:量错了对象,后面的所有比较都是空的。
一、三个量各自回答什么
「延迟」是一个笼统的说法,工程上要拆成三个:
指标 回答什么 典型单位
时延 一个包从进到出要多久 微秒或毫秒 抖动 时延的波动有多大 微秒 丢包 有多少包没到 百分比
三个量的性格完全不同:时延是个「平均值」,抖动是「离散程度」,丢包是「缺失比例」。 平均值好看、抖动大,体验照样差——视频会议最怕的正是抖动。
二、谁来测,决定了能测到什么
测时延有三条路,精度差三个数量级:
一、硬件仪表:专用测试仪在网卡上打时间戳,抖动精度到纳秒级。 二、两端带时钟的两台机器:靠 GPS 或 PTP 对齐时钟,精度到微秒级。 三、一台通用计算机:用户态计时,精度只能到「百微秒级」。
第三条路的陷阱在这里:你量到的「抖动」,主要来自操作系统调度与解释器开销,而不是网络。 这不是测错了,是「尺子的分辨率不够」。
三、实测:1289 微秒的教训
在本机 UDP 环回上,每 1000 微秒发一个包,共 3000 个:
指标 数值
平均间隔 1289.0 微秒 中位数 1255.4 微秒 标准差 165.6 微秒 P99 1724.4 微秒 P99.9 2705.5 微秒
目标是 1000 微秒,平均却是 1289 微秒——系统性多出 289 微秒。 这不是网络慢,是「空转等待」本身有开销。
所以在这个测法里,「平均值」几乎没有信息量: 它被系统性偏差污染了。有信息量的是标准差与 P99。
四、系统偏差与抖动要分开
偏差(bias)与抖动(jitter)是两回事:偏差让所有样本整体偏一个方向,抖动让样本上下散开。
289 微秒是偏差:它来自忙等循环的超时粒度,可以校准掉。 165.6 微秒是抖动:它来自调度与收发路径,校准不掉。
这条区分很实用:看到「平均时延 1289 微秒」先别下结论, 要看它是不是「整体偏移」——如果是,那问题在你的测量工具,不在网络。
所以通用计算机能可靠做的是「吞吐」与「丢包」这类累计指标,不是「微秒级时延」这类瞬时指标。 量什么,取决于你手里是什么尺子。
五、动手 Demo:在普通电脑上测抖动,你量到的主要是自己
这段在本机 UDP 环回上发 3000 个包,量相邻两包的到达间隔,再算平均、标准差与 P99。 结论不是「网络有多快」,而是「尺子有多粗」。
for i in range(n):
ss.sendto(b"x" * 64, addr)
rs.recvfrom(2048)
now = time.perf_counter()
if prev is not None:
gaps.append((now - prev) * 1e6)
prev = now
target = now + 0.001
while time.perf_counter() < target:
pass
实跑输出:
--------------------------------------------------------------------
在普通电脑上测抖动,你量到的主要是自己
--------------------------------------------------------------------
**时延、抖动、丢包这三样,是「性能」的具体形状。**
**但用一台通用计算机去测它们,第一件要搞清的事是:你测的到底是谁。**
**做法:本机 UDP 环回,每 1000 微秒发一个 64 字节的包,共 3000 个。**
**量「相邻两包到达间隔」相对 1000 微秒的偏移。**
指标 数值 微秒
--------------------------
样本数 2999
平均间隔 1326.0
中位数 1269.0
标准差 801.7
P99 1775.0
P99.9 17187.8
**平均 1326.0 微秒、标准差 801.7 微秒、P99 1775.0 微秒。**
先看一件事:目标是 1000 微秒,平均却是 1326 微秒,**系统性多出 326 微秒**。
这不是网络慢,是「空转等待」本身有开销——每一轮都要判断时间到没到,超出去的那一点就跑掉了。
**所以「平均值」在这个测法里没用;标准差与 P99 才有信息量。**
环回路径上真正花的时间只有几十微秒,**剩下 802 微秒全是主机这边的抖动**。
**这不是测错了,而是「测到的是谁」搞错了。**
**主机侧抖动的三个来源**:
Python 的 while 空转循环:解释器每轮都要执行字节码,颗粒度只有微秒级。
操作系统调度:就算换成 C 的忙等,时钟中断与调度器也会插进来。
收发路径:socket 系统调用、内核协议栈、缓冲区拷贝,每一步都有队头阻塞。
**所以测网络抖动有两条正路**:
用硬件仪表:专用测试仪在网卡上打时间戳,抖动精度到纳秒级。
用两台机器、各自带 GPS 或 PTP 时钟,两端时间戳相减。
**通用计算机能可靠做的是「吞吐」和「丢包」这类累计指标**,**不是「微秒级抖动」这类瞬时指标。**
**量什么,取决于你手里是什么尺子——这句话在性能测试里永远成立。**
这段代码的重点在最后三行: 用「忙等」而不是「sleep」,是因为 Windows 的 sleep 粒度是毫秒级——一 sleep 就偏十几个毫秒,数字完全失真。
但忙等也只是把偏差从「毫秒」压到「百微秒」: Python 每轮循环都要执行字节码,颗粒度就摆在那里。
所以这段 Demo 真正的产出是「知道自己的尺子有多粗」: 标准差 165.6 微秒意味着「任何小于 165 微秒的差异,你都测不出来」。 而这恰恰是网络设备之间真正的差距量级。
30 秒实验
- 在你电脑上 ping 一下网关,看时延是多少。
- 再 ping 一下外网,比较差多少。
- 想一想:为什么「平均值」在抖动测量里没用?
常见误区
- 把时延、抖动、丢包混着说。三个量回答不同问题,要分开量。
- 以为用电脑 ping 一下就是「测了抖动」。用户态计时分辨率只有百微秒级。
- 以为平均值好看就没问题。平均值可以被系统性偏差污染,要看标准差与 P99。
自测三问(点开对答案)
1. 时延、抖动、丢包各自回答什么问题? —— 时延是平均值,抖动是离散程度,丢包是缺失比例。 2. 为什么在普通电脑上测不到微秒级抖动? —— 用户态计时 + 解释器开销 + 调度中断,分辨率只有百微秒级。 3. 偏差和抖动有什么区别? —— 偏差让所有样本整体偏移(可校准),抖动让样本上下散开(不可校准)。下一节:厂商的规格书是怎么测出来的——RFC 2544 的四个指标。
- ☐ (本节完,下一节 07.04.02 网络设备产品性能的测量方法)