github编辑

Netflix Open Connect

概述

Netflix(纳斯达克股票代码:NFLX)是全球领先的流媒体娱乐服务,拥有超过 1.83 亿付费会员,覆盖 190 多个国家,会员可以观看各种类型和语言的电视系列、纪录片和电影。会员可以随时随地在一切连接互联网的屏幕上观看自己想看的内容,播放、暂停并继续观看,所有这些都没有广告或任何承诺。www.netflix.com

Open Connect 是负责将 Netflix 电视节目和电影全球传送到会员的全球网络。此类网络通常被称为内容分发网络(CDN),因为其工作是通过将人们观看的内容靠近他们观看的地方,来高效地传递基于互联网的内容(通过 HTTP/HTTPS)。Open Connect 设备运行的是经过轻微定制的 FreeBSD 版本。<https://openconnect.netflix.com/ Open-Connect-Overview.pdf>

Netflix 拥有几位 FreeBSD 提交者,Open Connect 团队的其他成员也为上游贡献了代码。

Open Connect 达到超过 100 Tb/s 的峰值流量

我们中那些记得互联网泡沫和电信繁荣的人,可能会记得 1999 年 Quest Communications 的标志性广告——一个疲惫的旅客在偏远地区的酒店办理入住。前台工作人员承诺提供平凡的早餐,但娱乐?

他们有的是娱乐。“每部电影,任何语言,任何时间,白天和晚上。”

客人惊讶地大声问:“这怎么可能?”怎么可能!(继续阅读)。二十年后的今天,酒店电视可能是最后一个提供“每部电影”的设备。技术似乎并不缺乏讽刺意味。

在讨论流媒体娱乐和使其成为可能的技术的最新趋势时,Netflix 绝对是绕不开的话题。截至 2019 年 4 月,Netflix 美国目录中包含了 47,000 部电视节目和 4,000 部电影。Netflix 报告称,全球的 Open Connect 网络在峰值时推送超过 100 Tb/s 的流量。根据 Sandvine 的数据,这代表了 2019 年全球总互联网流量的约 15%。

Open Connect:一个网络与一个计划

Netflix 于 2011 年启动了 Open Connect 项目,以应对 Netflix 流媒体服务规模的不断扩大。该项目的主要动机有两个:

  1. 随着 Netflix 成为消费者互联网服务提供商(ISP)网络流量的一个重要部分,与这些 ISP 直接合作变得至关重要。

  2. 为 Netflix 创建一个定制的内容分发解决方案,使他们的工程师能够设计一个主动的、定向缓存解决方案,这比标准的需求驱动型 CDN 更加高效。定向缓存架构通过几个数量级减少了对上游网络带宽的总体需求。

Netflix 播放过程

网络

大多数 CDN(内容分发网络)是按需驱动的。这意味着网络缓存的内容及其位置是根据某个地区的请求而定的。对于那些无法预测用户需求的通用 CDN,这种方式效果很好。

由于 Netflix 控制最终用户的应用程序,并且拥有详细的观看趋势数据,它们能够通过转向定向 CDN 获得显著的效率提升。在 Netflix 的定向 CDN 模式中,它们的 Open Connect Appliances(OCA)群体,在观看量非常低的 Fill 窗口期间,每天接收目录更新。

计划

Netflix 有一个开放对等互联政策,这意味着它们会与任何同意计划条款的 ISP(互联网服务提供商)进行对等互联。开放对等互联通过本地化流量来改善互联网用户体验。它还具有降低传输成本的优势,对 Netflix、ISP 以及整个互联网都有益。

除了在 Netflix 数据中心和互联网交换点(IXP)安装 OCAs,Netflix 还免费提供 OCA 给符合条件的 ISP,让其直接在 ISP 的网络中安装。这进一步提高了本地化程度,并减少了上游流量¹。有趣的是,这些 OCA 虽然由 Netflix 拥有,但由 ISP 使用,这引发了一些许可方面的考量,最初促使 Open Connect 工程师选择 FreeBSD,因为其宽松的许可证²。

1 详情请见 https://openconnect.netflix.com/Open-Connect-Overview.pdfarrow-up-right。 2 https://www.nginx.com/blog/why-netflix-chose-nginx-as-the-heart-of-its-cdn/arrow-up-right

Open Connect Appliances

Open Connect CDN 的主力是 Open Connect Appliances,简称 OCA。这些设备有三种主要配置,运行的是轻度定制的 FreeBSD head(开发)分支。这样的一个庞大且关键的网络使用快速变化的开发分支,乍一看似乎有些冒险。在 2019 年的 FOSDEM 大会上,Netflix 工程经理 Jonathan Looney 解释了使用 FreeBSD head 分支的理由。

首先,Jonathan 和他的团队认为 FreeBSD 的代码通常非常稳定且高质量。其次,他们更倾向于迅速找到并修复那些相对较少且大多数影响较小的 bug。否则,Jonathan 解释说,等待长期(稳定)分支的开发团队可能会陷入他所称之为恶性循环的境地——即合并不频繁,冲突/回归问题多,最终导致功能开发进度变慢。

跟踪 head 分支帮助 Netflix 更快地添加新功能。他们还发现,跟踪 head 分支使得与开发社区中的其他人合作变得更加容易。

  • 40Gb/s OCA 存储设备,具有 248TB 存储(2RU 机架形式)

    • FreeBSD

    • NGINX

    • BIRD 互联网路由守护进程

吞吐量效率

这些 OCA 有多高效?通过使用 FreeBSD 和商用零件,Netflix 在 1RU 机架中实现了 90 Gb/s 的吞吐量,支持 TLS 加密连接,CPU 使用率约为 55%,配备 Intel 6122 CPU、96GB RAM 和 16TB NVMe 闪存。

因为他们的目标是尽可能多地将代码提交给上游,所以所有 FreeBSD 用户都能受益于帮助 Netflix 实现这种性能的许多增强功能。其中一些贡献包括 NUMA 增强、异步 sendfile、内核 TLS、Pbuf 分配增强、“未映射”mbufs、I/O 调度、TCP 算法和 TCP 日志基础设施。

为了以具有成本效益的方式实现这种性能,Netflix 工程师意识到,他们需要尽可能减少内核与用户空间之间的上下文切换。异步 sendfile 就是帮助实现这一目标的关键技术之一。

新的 sendfile(2) 系统调用实现是对旧版本的替代,它加速了 TCP 数据传输,因为它避免了将文件数据复制到缓冲区再发送。新的 sendfile 通过支持异步 I/O 进一步加速并简化了大数据传输。

新的 sendfile 是 NGINX 和 Netflix 之间开发合作的成果,并在 2016 年 Netflix 服务扩展到近 200 个国家时发布。

Async 服务器

提高效率和隐私保护 — 内核 TLS

为了保护最终用户的隐私,Netflix 在 2016 年加入了传输层安全性(TLS)。Jan Ozer 在他的《Streaming Media》文章中很好地总结了这一举措:

Netflix 长期以来部署了数字版权管理(DRM)来防止盗版,并通过 HTTPS 保护客户数据在帐户登录和管理过程中的安全。然而,实际的视频数据传输并没有受到保护,因此服务器和客户端之间通信中的任何信息都可能被黑客、网络管理员或 ISP 访问。这些信息可以用来确定观众正在观看哪些内容,甚至其他细节。

添加 TLS 加密效率地要求对 OCA 软件堆栈进行额外的性能增强。这是因为现有的 TLS 技术依赖于 Web 服务器 —— Netflix 的流媒体标准总监 Mark Watson 在 2014 年报告称,这种方法会降低“30-53%”的容量。

解决方案是内核端 TLS,简称 kTLS,它将 TLS 与新的 sendfile 模型结合。这个混合 TLS 方案(由 John Baldwin 在 vBSDCon 2019 会议上描述)将会话管理保留在应用程序空间,并将大规模加密插入到内核中的 sendfile 数据管道。TLS 会话协商和密钥交换消息从 Nginx 传递到 TLS 库,会话状态存储在库的应用程序空间中。一旦 TLS 会话建立,并与客户端交换生成适当的密钥,这些密钥将与客户端的通信套接字关联,并共享到内核中。

传统 TLS Web 服务

内核内 TLS Web 服务

在他们的 2019 年 EuroBSD 演讲中,Drew Gallatin 和 Slava Shwartsman 展示了 kTLS 如何将带宽性能提升 50 Gb/s,同时减少 CPU 占用率。TLS 性能提升的下一个前沿是所谓的 NIC TLS,其中加密操作由硬件完成。如下面的图表所示,这有望显著减少 CPU 利用率。

内核 TLS 性能 90Gb/s,68% CPU(软件),35% CPU(T6 NIC kTLS)

原始(~2016)Netflix 100G NVME 闪存设备

Netflix 使用 TLS 视频服务

达到 200 Gb/s 的 NUMA 优化

随着成员对更多节目和更高分辨率的需求不断增长,Netflix 一直在寻找提高 OCA 吞吐量的方法。随着高核心数系统的发展,团队自 2014 年以来一直在开发和测试非一致性内存架构(NUMA)支持,现在已经开始取得成效。在典型系统中,只有一个 CPU、磁盘和内存,而 NUMA 系统则可以有更多的 CPU、内存和磁盘。与 sendfile 和 TLS 类似,NUMA 也可能会带来吞吐量瓶颈,Netflix 工程师一直在努力将其降到最低。

NUMA 使得 CPU 访问本地资源(例如内存)变得更加便宜,而访问连接到其他节点的资源则变得更加昂贵。因此,内存和 I/O 本地化会影响性能。为了充分利用 NUMA 提供的更高计算密度,Netflix 必须找到一种方法,将尽可能多的磁盘到 CPU 到网络的流量保持在本地节点,并最小化会影响性能的 NUMA 总线传输。为此,Netflix 进行了多项增强,目前这些增强正在逐步合并到上游,包括:

  • 为通过 sendfile(9) 发送的文件分配 NUMA 本地内存

  • 为内核 TLS 加密缓冲区分配 NUMA 本地内存

  • 将连接引导到绑定到本地域的 TCP Pacers 和 kTLS 工作线程

  • 通过对监听套接字 SO_REUSEPORT_LB 的修改,将传入连接引导到绑定到本地域的 Nginx 工作线程

在测试中,这些增强将 Xeon 性能从 105Gb/s 提高到 191Gb/s,同时将 NUMA 布局利用率从 40% 降低到 13%。对于 AMD EPYC,性能从 68Gb/s 增加到 194Gb/s。

四节点配置在 AMD EPYC 上很常见

FreeBSD 为 NETFLIX 提供三种效率:吞吐量、开发和运营

对于常见问题“为什么选择 FreeBSD?”Jonathan 说他们最初是因为许可证选择 FreeBSD,但最终留了下来是因为效率——Netflix 衡量效率有三种方式:

  1. 吞吐量或性能效率,如前一部分所述

  2. 开发效率

  3. 运营效率

从开发角度来看,与 FreeBSD 社区合作的便利性帮助 Netflix 将其改进向社区上游提交,以便社区进行持续维护。他们还喜欢与其他在相同领域工作的社区成员合作。与这些社区成员共享代码可以改善各方正在开发的代码。

最后,庞大的 OCA 集群需要复杂的监控和操作工具。一些他们所需的工具已经存在,其余的他们自己编写。对于后者,Jonathan 发现 FreeBSD 能很好地提供所需的挂钩,如果没有,团队也能够自己实现。

Open Connect 智囊团的下一步

除了 NUMA 和持续探索 NIC TLS,团队还在努力将一些改进提交到 kTLS 和 UFS 改进中。

最后,Open Connect 的巨大规模加上团队对效率的关注以及他们对开源的承诺,意味着每个有类似使用案例的 FreeBSD 用户都能获得相同的性能收益。开启 kTLS 并利用异步 Sendfile 的能力,使得任何通过 HTTPS 提供静态内容的用户都能延长硬件寿命、减少密度并更高效地提供卓越的用户体验。


GREG WALLACE 是一位自由职业的技术营销人员,自 2005 年以来一直与开源软件和社区合作。除了目前在 FreeBSD 基金会的工作外,Greg 还涉及 Kubernetes、安全性、DevOps 和路由等领域。此前,他曾领导 Node.js、ODPi 和 Hyperledger 的营销工作。

最后更新于

这有帮助吗?