Tailscale 是一家连接平台,可把设备链接到称为 tailnet 的私有网络中;该公司正着手改进系统中负责传输或准备流量的部分。该公司在 9 月 22 日发布的一篇文章中表示,相关工作涵盖 Linux 和 Android 的数据包处理、子网路由器的多队列处理、应用连接器与出口节点,以及通过缓存 netmap 实现的更广泛启动优化。

第一项改进针对小型数据包。Tailscale 表示,大多数网络数据包约为 1 KiB,但 Linux 的通用接收卸载(GRO)是一种提升吞吐量的功能,用于处理更大的流量批次,它需要能够容纳 64 KiB 的缓冲区。旧路径会把每个小型数据包复制到一个单独的大缓冲区中。在 Linux 和 Android 上,Tailscale 现在会让数据包保留在更大的读取缓冲区中,并记录每个数据包的起止位置,因此许多小型数据包可以共享一次内存分配。该公司报告称,仅此一项就在许多网络配置中带来了约 5% 的提速。

比较独立数据包缓冲区与共享优化缓冲区的示意图
Tailscale 的数据包缓冲区优化让多个小型数据包共享一次内存分配。来源:Tailscale。tailscale.com

位于 Linux 和 Android 数据包处理说明之后;该处数据包保留在更大的读取缓冲区中,而不再被复制到独立的 64 KiB 缓冲区。

多队列工作针对为大量连接转发流量的节点。子网路由器是 tailnet 与物理子网之间的网关,让无法运行 Tailscale 的设备也能加入网络;出口节点则通过另一台设备路由出站互联网流量。Tailscale 表示,这些角色此前在一个有序的单线程流水线中处理相互独立的数据流,部分原因是接收应用程序不能看到自己的数据包乱序到达。新设计会将每条数据流分配到一个通道,并让各通道跨 CPU 核心并行运行;通道数量根据机器配置进行扩展,而不是根据对等节点数量扩展。文章称,应用连接器也会受益,但仅将其定义为向许多用户提供短时连接的 Tailscale 节点。

比较单个处理流水线与并行多队列通道的示意图
多队列处理将数据包流分配到并行的读取、加密和写入流水线中。来源:Tailscale。tailscale.com

位于有关子网路由器、出口节点和应用连接器从单一有序流水线转向跨 CPU 核心并行通道的讨论之后。

启动速度是另一个主要目标。设备通常会联系 Tailscale 的控制平面,完成身份验证,并接收一张描述其能够访问哪些设备以及如何访问的网络映射,即 netmap。在典型网络上,这一过程大约需要 100 毫秒,但飞机上的 Wi-Fi 信号不佳、酒店网络受到过滤,或其他连接质量较差的情况,都可能造成延迟或阻断。借助 netmap 缓存,曾经连接过的设备会在持久化磁盘中保存一份副本,并能在联系控制平面之前开始建立设备到设备的直接连接。Tailscale 表示,在控制平面可达性较差的 tailnet 中,使用暖缓存启动比冷启动快一到两个数量级。

相关的取舍很具体。缓存需要先成功连接过,并占用磁盘空间;非常大的 tailnet 可能产生大量缓存更新流量,而速度较慢或对写入损耗敏感的存储介质(例如 SD 卡)可能并不适合。可用时间也分阶段推进:Linux 和 Android 的缓冲区改动预计出现在 v1.104 中,多队列支持计划在 v1.104 之后推出,而 netmap 缓存在经过测试并默认启用之前目前仍受功能开关控制。因此,将重点放在 Linux/Android 上是一个明确声明的部署边界,并不证明其他平台无法采用相同技术。