作者 | 汪翰林
本文作者网易数帆云网络数据面负责人汪翰林,在工作中从事服务网格的网络数据面性能优化,发掘其中的网络性能优化的原理拥有相通性。本文对通用的网络性能优化办法做出了总结,包含服务网格及网络性能优化分析、网络性能优化技术介绍、网络性能优化思路三个方面,并列举了实质案例进行进一步诠释,供大众在实质做性能优化时参考。 前段时间,团队始终在做服务网格的网络数据面性能优化,发掘其中的网络性能优化的原理是相通的,因此就想着总结有些通用的网络性能优化办法,供大众在实质做性能优化时参考。
服务网格及网络性能优化分析
业务微服务化之后,为了提高微服务的治理能力,一般会引入一个业务无侵入的 sidecar 代理来供给微服务的流控、熔断、升级等服务治理能力。sidecar 会转发所有微服务的出口和入口流量,但这般会引起网络路径增多两跳,全部路径拉长,相应地时延亦会增多。
引入的时延重点分为 sidecar 业务处理时延以及网络收发时延。广义上的网络性能优化应该是端到端的时延优化,既包含处理时延优化,亦包含网络收发时延优化。咱们这儿重点讨论狭义的网络性能优化,仅包含网络收发的时延优化。
倘若打开网络传输的链路,sidecar 额外引入了 Service 到 sidecar 以及 sidecar 到 sidecar 的链路,网络时延的增多重点是由于链路中多经过的四次内核态 TCP/IP 协议栈的开销。
咱们经过 perf 火焰图分析了 sidecar 应用 Envoy 的 CPU 占用,发掘内核态协议栈的 CPU 占比近 50%,而剩下的 50% CPU 重点消耗在 Envoy 本身处理规律上。可见,网络时延的优化的重点亦便是对内核态协议栈的优化。
网络性能优化技术
咱们先来看一下针对内核态协议栈的网络性能优化技术,重视这儿特指针对内核态协议栈的优化,由于网络性能优化的思路还有非常多,咱们会在后面章节说到。
针对内核态协议栈的优化重点思路是 kernel bypass,即让报文不经过内核态协议栈或不经过完整的内核态协议栈,经过缩短网络路径来达到性能优化的目的。日前重点用到的技术包含 eBPF、用户态协议栈以及 RDMA。
eBPF
eBPF(extended Berkeley Packet Filter)是一个内核技术,能够在不需要重新编译内核的状况下,经过一种安全的、可编程的方式扩展内核的功能。eBPF 的重点功能是在内核层面进行安全、有效的网络数据包过滤和处理,以及在运行时对系统进行监控和调试。eBPF 能够经过独立的用户空间程序来编写和加载,这些程序能够安全地与内核交互,而不会影响内核的稳定性和安全性。
简单来讲,日前的内核协议栈处理流程的代码中预留了非常多 hook 点,用户态编写的程序编译成 eBPF 字节码之后能够注册到这些 hook 点,之后内核处理报文到 hook 点时就会调用这些预编译好的字节码程序完成特定的功能。这般咱们就能够掌控内核针对报文的处理流程,结合 eBPF 的 redirect 能力能够将报文直接转发到对应的网络设备或 socket,从而做到 kernel bypass。
这儿不得不提两类 hook 点:XDP 和 socket。XDP hook 是网卡收到报文后最早的 hook 点,能够实此刻网络驱动程序中拦截和处理报文。而 socket hook 能够拦截连接创立、收发的报文,是应用层处理报文最早的 hook 点。
不外,eBPF 程序终究还是运行在内核态,应用层进行网络报文传输时还是避免不了内核态和用户态的上下文切换开销。针对能够完全运行在内核态的应用,如安全检测、负载平衡等场景则能够避免这个开销。
用户态协议栈
顾名思义,用户态协议栈是将协议栈的实现卸载到用户态来实现。卸载到用户态实现会带来几个好处:一是避免用户态和内核态的上下文切换;二是按照需要定制和精简协议栈的实现;三是调测和运维亦会更加方便。
报文卸载到用户态一般采用 DPDK 或 AF_XDP 的办法。DPDK 是 Intel 主导的开源项目,日前主流网卡都支持,成熟且性能高,不外针对虚拟口(如 veth 口)的支持不足好,在容器化场景受限。AF_XDP 是基于 eBPF 的报文卸载技术,能够实此刻网卡驱动层针对报文拦截并卸载到用户态,针对理学网口或虚拟口的兼容性好,性能相比于 DPDK 稍差。
用户态协议栈一般需要研发适配层来兼容 socket 接口,拦截 socket 调用并分发到用户态协议栈处理,这般应用层能够做到无需修改代码,完全无感知。
RDMA
RDMA (Remote Direct Memory Access) 是一种高性能、低延迟的网络通信技术,它能够让计算机之间直接拜访彼此内存中的数据,从而避免了传统网络通信中的数据拷贝和 CPU 参与的过程。因此,RDMA 是一项软硬结合的网络性能优化技术,将网络传输卸载到 RDMA 硬件网卡中实现,提高性能的同期能够将 CPU 节省出来给应用运用。
RDMA 的实现技术分为 InfiniBand、RoCE 和 iWARP。InfiniBand 是最早的实现方式,需要专门的硬件网卡和 InfiniBand 交换机协同组网,和以太网不兼容,成本高但性能最好。RoCE 基于以太网传输 RDMA 报文,运用 UDP 封装报文,一般需要组建基于 PFC/ECN 的无损网络,否则丢包会引起性能劣化严重,总体性能较好,RoCE 的重点表率是英伟达的 Mellanox 网卡。iWARP 基于 TCP,网络适应性好,但性能最差,表率是 Intel 网卡。
RDMA 对外供给 ibverbs 编程接口,和 socket 接口还是有很强区别,不外直接基于此进行应用代码改造理论上性能收益最大。Mellanox 网卡这里基本上封装了 UCX 接口,还是不可做到完全兼容 socket 接口。由 Intel 和阿里主导的 SMC-R 能够实现 socket 接口的完全兼容,因为封装后只能支持报文接收的中断模式而不支持 polling 模式,会引起性能有损失,底层只能适配 RoCE,没法兼容 iWARP。
网络性能优化思路
性能优化是一个端到端的系统性工程,遵循二八原则,即 80% 的性能损耗在 20% 的处理流程上。因此优化前还是需要分析下引起 80% 性能损耗的 20% 的处理流程到底在哪里,是应用本身的处理规律还是网络传输层面。一般咱们能够先运用性能分析工具(如 perf)做一下分析,确定瓶颈点。即使确定是网络传输的瓶颈,咱们亦能够先从硬件配置和组网层面进行分析:
网卡带宽是不是受限?如 10G 更换 25G 或 100G 网卡
是不是跨机房拜访?
是不是经过网关?网关是不是有瓶颈?
理学网络设备是不是有瓶颈?
是不是经过虚拟网络?虚拟网络是不是有瓶颈?
另一,咱们亦能够检测下内核参数配置,如网卡多队列配置,收发队列体积配置,连接跟踪配置等。
倘若以上检测后发掘还是满足不了需求,网络传输依旧是瓶颈,就能够思虑运用针对内核态协议栈的性能优化技术。那样 eBPF/ 用户态协议栈 /RDMA 技术咱们怎样来选取呢?
从性能上来讲,RDMA > 用户态协议栈 > eBPF。
RDMA 综合成本和性能,RoCE 用的最多,不外 RoCE 日前受限于无损网络,组网会有限制,一般限制在一个机房乃至一个 ToR 下。
用户态协议栈由于协议栈的定制实现,无内核态协议栈的功能全面,因此应用的兼容性需要 case by case 的去做验证测试,比较适合于针对服务端的已知应用(如 Redis/Nginx/Envoy 等)的性能加速,而不太适合于做为一个通用的协议栈供给给所有应用运用。
eBPF 类似于给内核打补丁,哪里性能欠好就能够打上一个补丁,适合于小的性能优化点的修修补补。
实质案例
服务网格
服务网格实质优化时结合了 eBPF Sockops 和用户态协议栈技术。
eBPF Sockops 注册了连接创立的 hook 点,将五元组信息保留到 sockmap 表中,后续报文发送能够直接查找 sockmap 表后 redirect 到对端 socket,这般就 bypass 了内核协议栈。eBPF Sockops 适用于 Service 和 sidecar 之间链路的加速,由于 Service 端应用的多样性不太适合运用用户态协议栈加速,而服务器内部进程间通信亦不太适合 RDMA 加速。
用户态协议栈用来加速 sidecar 和 sidecar 之间的通信链路,能够 bypass 掉 sidecar 之间通信的内核协议栈。由于 sidecar 之间通信的链路不必定能组建无损网络,RDMA 加速不太合适。
当前用户态协议栈咱们支持性能优先模式和兼容优先模式。性能优先模式中,底层经过 DPDK 进行报文卸载,适用于理学口或虚拟 VF 口的场景,容器化场景亦能够对接 SRIOV 的容器网络。兼容优先模式中,底层经过 AF_XDP 进行报文卸载,适用于虚拟 veth 口的场景,能够支持日前主流的容器网络场景。
另一,用户态协议栈在实质运用过程中可能会面临双栈的需要,即需要同期支持用户态协议栈和内核态协议栈。服务网格加速场景中 sidecar 和 Service 之间通信虽然经过 eBPF 进行了加速,但本质上还是走内核。因此用户态协议栈亦需要支持按照路由配置来确定报文走内核态还是用户态协议栈。
图中是兼容优先模式最后加速的效果。时延有 35-40% 的降低,其中用户态协议栈贡献 30% 上下,eBPF 贡献 8% 上下。
存储
Curve 存储是网易自研开源的分布式存储服务。在 Curve 块存储的研发及优化过程中,咱们发掘做为分布式系统,客户端需要经过网络和存储节点通信,存储节点之间亦需要网络通信来完成多副本之间的一致性协商过程。在传统的 TCP/IP 网络协议栈中,网络数据包需要在用户态 / 内核态之间进行拷贝、TCP/IP 协议的层层解析和处理,消耗了海量的 CPU 和内存带宽。因此咱们引入 RDMA 的 RoCE v2 技术来优化这部分的网络性能,存储组网相对可控,交换机进行 PFC/ECN 的无损网络配置,结合网卡的 DCQCN 拥塞掌控算法能够实现基于无损网络的 RDMA 组网。
在实质的适配过程中,运用 UCX 接口来加速客户端和存储节点以及存储节点之间的的 RPC 通信,这般能够降低整体的研发难度及对业务代码的侵入修改。为了保准靠谱且有效的 RDMA 报文传输,一方面,咱们与交换机厂商进行密切沟通,分析并摸索创立了一套适合于系统的 ECN+PFC 配置方式;另一方面咱们与网卡厂商一起分析网卡 DCQCN 拥塞掌控参数对 RDMA 流量传输的影响,最后得出最适宜的网卡参数配置。
加速的效果:
在单深度 4K 随机写场景下,平均延迟降低 35%;4K 随机读,平均延迟降低 57%;
与杭研云原生数据 BosonDB 完成对接测试和上线。在数据库比较关注的 16K 随机 / 次序写中,IOPS 提高最少 25%。
总 结
随着云计算,大数据和 AI 等技术的持续发展,海量的计算资源之间的交互越来越频繁,对网络的需求亦越来越高,臃肿的内核协议栈处理逐步作为网络传输的瓶颈所在。本文介绍几种内核协议栈的优化技术、关联的应用场景以及实质的优化案例,供大众参考。
作者简介: 汪翰林,网易数帆高级技术专家,云网络数据面负责人。近 20 年软件架构、设计和开发经验,曾就职于华三和华为,主持多个安全、视频监控、大数据和云计算等技术行业的制品设计和开发工作。日前在网易数帆专注于高性能网络技术预研和制品化落地,带领团队完成 VPC 网络 / 容器网络 / 服务网格 / 存储 /P4 网关等多个场景下的高性能网络套件在网易集团内部落地以及商场化输出工作。 今日好文举荐微软裁员内幕Angular 重磅回归安息吧,元宇宙
裁错了还是变相降薪?大厂粗暴裁员后又求员工回来,网友:拿什么再爱你?
|