台式电脑

怎么样优化电脑的网络(从服务网格看,如何做好通用的网络性能优化?)

作者|汪翰林

策划|褚杏娟

怎么样优化电脑的网络(从服务网格看,如何做好通用的网络性能优化?)

本文作者网易数帆云网络数据面负责人汪翰林,在工作中从事服务网格的网络数据面性能优化,发现其中的网络性能优化的原理具有相通性。本文对通用的网络性能优化方法做出了总结,包括服务网格及网络性能优化分析、网络性能优化技术介绍、网络性能优化思路三个方面,并列举了实际案例进行进一步诠释,供大家在实际做性能优化时参考。

前段时间,团队一直在做服务网格的网络数据面性能优化,发现其中的网络性能优化的原理是相通的,所以就想着总结一些通用的网络性能优化方法,供大家在实际做性能优化时参考。

服务网格及网络性能优化分析

业务微服务化之后,为了提升微服务的治理能力,通常会引入一个业务无侵入的sidecar代理来提供微服务的流控、熔断、升级等服务治理能力。sidecar会转发所有微服务的出口和入口流量,但这样会导致网络路径增加两跳,整个路径拉长,相应地时延也会增加。

从服务网格看,如何做好通用的网络性能优化?

引入的时延主要分为sidecar业务处理时延以及网络收发时延。广义上的网络性能优化应该是端到端的时延优化,既包括处理时延优化,也包括网络收发时延优化。我们这里主要讨论狭义的网络性能优化,仅包括网络收发的时延优化。

从服务网格看,如何做好通用的网络性能优化?

如果打开网络传输的链路,sidecar额外引入了Service到sidecar以及sidecar到sidecar的链路,网络时延的增加主要是因为链路中多经过的四次内核态TCP/IP协议栈的开销。

从服务网格看,如何做好通用的网络性能优化?

我们通过perf火焰图分析了sidecar应用Envoy的CPU占用,发现内核态协议栈的CPU占比近50%,而剩下的50%CPU主要消耗在Envoy本身处理逻辑上。可见,网络时延的优化的重点也就是对内核态协议栈的优化。

网络性能优化技术

我们先来看一下针对内核态协议栈的网络性能优化技术,注意这里特指针对内核态协议栈的优化,因为网络性能优化的思路还有很多,我们会在后面章节提到。

针对内核态协议栈的优化主要思路是kernelbypass,即让报文不经过内核态协议栈或者不经过完整的内核态协议栈,通过缩短网络路径来达到性能优化的目的。目前主要用到的技术包括eBPF、用户态协议栈以及RDMA。

eBPF

eBPF(extendedBerkeleyPacketFilter)是一个内核技术,可以在不需要重新编译内核的情况下,通过一种安全的、可编程的方式扩展内核的功能。eBPF的主要功能是在内核层面进行安全、高效的网络数据包过滤和处理,以及在运行时对系统进行监控和调试。eBPF可以通过独立的用户空间程序来编写和加载,这些程序可以安全地与内核交互,而不会影响内核的稳定性和安全性。

简单来说,目前的内核协议栈处理流程的代码中预留了很多hook点,用户态编写的程序编译成eBPF字节码之后可以注册到这些hook点,之后内核处理报文到hook点时就会调用这些预编译好的字节码程序完成特定的功能。这样我们就可以控制内核针对报文的处理流程,结合eBPF的redirect能力可以将报文直接转发到对应的网络设备或者socket,从而做到kernelbypass。

这里不得不提两类hook点:XDP和socket。XDPhook是网卡收到报文后最早的hook点,可以实现在网络驱动程序中拦截和处理报文。而sockethook可以拦截连接建立、收发的报文,是应用层处理报文最早的hook点。

不过,eBPF程序终究还是运行在内核态,应用层进行网络报文传输时还是避免不了内核态和用户态的上下文切换开销。对于可以完全运行在内核态的应用,如安全检测、负载均衡等场景则可以避免这个开销。

用户态协议栈

顾名思义,用户态协议栈是将协议栈的实现卸载到用户态来实现。卸载到用户态实现会带来几个好处:一是避免用户态和内核态的上下文切换;二是根据需要定制和精简协议栈的实现;三是调测和运维也会更加方便。

报文卸载到用户态通常采用DPDK或者AF_XDP的方法。DPDK是Intel主导的开源项目,目前主流网卡都支持,成熟且性能高,不过对于虚拟口(如veth口)的支持不够好,在容器化场景受限。AF_XDP是基于eBPF的报文卸载技术,可以实现在网卡驱动层针对报文拦截并卸载到用户态,对于物理网口或者虚拟口的兼容性好,性能相比于DPDK稍差。

用户态协议栈通常需要开发适配层来兼容socket接口,拦截socket调用并分发到用户态协议栈处理,这样应用层可以做到无需修改代码,完全无感知。

RDMA

RDMA(RemoteDirectMemoryAccess)是一种高性能、低延迟的网络通信技术,它能够让计算机之间直接访问彼此内存中的数据,从而避免了传统网络通信中的数据拷贝和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)做一下分析,确定瓶颈点。即使确定是网络传输的瓶颈,我们也可以先从硬件配置和组网层面进行分析:

1.网卡带宽是否受限?如10G更换25G或者100G网卡

2.是否跨机房访问?

3.是否经过网关?网关是否有瓶颈?

4.物理网络设备是否有瓶颈?

5.是否经过虚拟网络?虚拟网络是否有瓶颈?

另外,我们也可以检查下内核参数配置,如网卡多队列配置,收发队列大小配置,连接跟踪配置等。

如果以上检查后发现还是满足不了要求,网络传输依旧是瓶颈,就可以考虑使用针对内核态协议栈的性能优化技术。那么eBPF/用户态协议栈/RDMA技术我们如何来选择呢?

从性能上来说,RDMA>用户态协议栈>eBPF。

RDMA综合成本和性能,RoCE用的最多,不过RoCE目前受限于无损网络,组网会有限制,通常限制在一个机房甚至一个ToR下。

用户态协议栈因为协议栈的定制实现,没有内核态协议栈的功能全面,所以应用的兼容性需要casebycase的去做验证测试,比较适合于针对服务端的已知应用(如Redis/Nginx/Envoy等)的性能加速,而不太适合于作为一个通用的协议栈提供给所有应用使用。

eBPF类似于给内核打补丁,哪里性能不好就可以打上一个补丁,适合于小的性能优化点的修修补补。

实际案例服务网格

从服务网格看,如何做好通用的网络性能优化?

服务网格实际优化时结合了eBPFSockops和用户态协议栈技术。

eBPFSockops注册了连接建立的hook点,将五元组信息保存到sockmap表中,后续报文发送可以直接查询sockmap表后redirect到对端socket,这样就bypass了内核协议栈。eBPFSockops适用于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的RoCEv2技术来优化这部分的网络性能,存储组网相对可控,交换机进行PFC/ECN的无损网络配置,结合网卡的DCQCN拥塞控制算法可以实现基于无损网络的RDMA组网。

在实际的适配过程中,使用UCX接口来加速客户端和存储节点以及存储节点之间的的RPC通信,这样可以降低整体的开发难度及对业务代码的侵入修改。为了保证可靠且高效的RDMA报文传输,一方面,我们与交换机厂商进行密切沟通,分析并摸索建立了一套适合于系统的ECN+PFC配置方式;另一方面我们与网卡厂商共同分析网卡DCQCN拥塞控制参数对RDMA流量传输的影响,最终得出最适宜的网卡参数配置。

加速的效果:

1.在单深度4K随机写场景下,平均延迟降低35%;4K随机读,平均延迟降低57%;

2.与杭研云原生数据BosonDB完成对接测试和上线。在数据库比较关注的16K随机/顺序写中,IOPS提升至少25%。

总结

随着云计算,大数据和AI等技术的不断发展,大量的计算资源之间的交互越来越频繁,对网络的要求也越来越高,臃肿的内核协议栈处理逐渐成为网络传输的瓶颈所在。本文介绍几种内核协议栈的优化技术、相关的应用场景以及实际的优化案例,供大家参考。

作者简介:

汪翰林,网易数帆高级技术专家,云网络数据面负责人。近20年软件架构、设计和研发经验,曾就职于华三和华为,主持多个安全、视频监控、大数据和云计算等技术领域的产品设计和研发工作。目前在网易数帆专注于高性能网络技术预研和产品化落地,带领团队完成VPC网络/容器网络/服务网格/存储/P4网关等多个场景下的高性能网络套件在网易集团内部落地以及商业化输出工作。

本文转载来源:

https://www.infoq.cn/article/MtxlsvGu8pDCFZhQEjhB

相关新闻

返回顶部