为什么VPN的性能损失在蜂窝网络上看起来比以太网更严重
两种接入网络与两种隧道状态产生四个数字。填满矩阵,保留两个比值,让规律选择下一次测量。
同一台笔记本电脑、同一台服务器和同一条隧道,在以太网上可能损失五分之一的吞吐量,在蜂窝网络上可能损失四分之三,而这两个数字都不意味着VPN坏了。每种接入网络提供的路径不同,隧道又在其上叠加了第二条路径。把一个带隧道的数字与一个不带隧道的数字相比,回答不了任何问题,因为这两个数字描述的是不同的分母。四个格子和每行一个保持比例,会告诉你下一个该问的问题。
四个格子,而不是一个惩罚值
在每种接入网络上测量直接基线和经隧道的结果,并把它们保存为矩阵,而不是一个单一结论。基线是在该网络上不经过隧道完成的同一项任务;经隧道的结果是带着隧道完成的同一项任务。
| Access network | Direct baseline | Same task through the tunnel |
|---|---|---|
| Ethernet | E0 | E1 |
| Cellular | C0 | C1 |
直接测试要使用经授权的工作负载,并保留环境要求的隐私控制。违反策略的测试会产生一个你无法发布、也不应重复的数字。
让变量保持不动
在四个格子中固定设备、应用、目标、传输方向和VPN端点。如果某个服务在多次运行之间悄悄更换了测试服务器,就记下这个变化,并把这一对当作不受控处理,而不是用平均值把差异抹平。
在两个方向上重复矩阵,并在一天中可比的时间段进行。蜂窝无线链路的状态和所在小区的负载会在几分钟内变化,因此一条异常好的基线可能夸大表面上的损失。把结果的离散程度记录在一个代表性数值旁边,并注明带隧道的运行是与基线交错进行,还是整块执行。
交错比多数人预想的更重要。午饭前测的基线和午饭后测的带隧道运行,是两个顶着同一名字的不同网络。
让分母保持可见
既要报告保持比例,也要报告绝对速率:E1除以E0,以及C1除以C0。一条保留了小部分吞吐量的快链路和一条保留了大部分吞吐量的慢链路是不同的发现,而只有比值才显示这个差别。
绝对吞吐量仍然决定用户能做什么。比值决定该往哪里看。当以太网保留了基线的大部分而蜂窝网络保留得少得多时,真正有趣的变量在蜂窝路径上,而不在加密内部。
两个数字都属于报告,因为任何单独一个都会支撑一个数据并不支持的结论。
先读规律,再动手改动
两种网络上相似的隧道上限指向某个共享的部分:端点、它的CPU、某个速率限制,或者某一跳拥塞。只出现在蜂窝网络上的下降,指向该网络的路由、丢包、时延和有效包大小。
这些是线索,不是诊断,写工单时这个区别很重要。共享的上限不会因为你更换蜂窝调制解调器而改善,只发生在蜂窝网络上的下降也不会因为你调整端点规格而改善。在提出改动之前,先说明你看到的是两种规律中的哪一种。这样改动就带着一个预测,下一次测量可以证实它,也可以推翻它。
OpenVPN自己的性能指南也按同样的思路区分带宽、CPU、传输和包大小的限制,这提醒我们隧道很少只是一个变量。
当包大小成为嫌疑
封装会占用包空间,因此蜂窝路径上的有效大小可能小于接口所宣称的值。为你要比较的路径保留包大小的证据,而不是根据接入技术的名称去假定一个值。
Datagram packetization-layer path MTU discovery描述的是发现有效大小,而不是把它写死。使用实现所支持的观测,不要以防万一给每个客户端强加一个任意偏低的MTU,因为那会在本来正常的路径上用一个更糟的问题替换原来的问题。
关于大小的假设需要自己的证据:同样的传输在两种大小下进行,并记录丢包规律。
一次只加一个变量
只有在基线矩阵保存之后,才去比较另一种传输方式。这样只让一个刻意的变量起作用,也能让你把变化归因,而不是去猜。
把TCP载荷的大小调整与UDP数据报的行为分开对待,因为两者对丢包和路径大小的反应不同。来自传输方式改变的性能提升,是关于那种传输方式的证据,而不是加密或覆盖范围原本就是原因的证据。
工作顺序:填满四个格子,算出两个比值,交错运行,然后选一个假设,用一次改动去检验它。除此之外,都是对两个未知量的比较。