硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

服务网格数据面性能深度调优

汪翰林 、陈启钧

  • 2022-03-14
  • 本文字数:2411 字

    阅读完需:约 8 分钟

服务网格数据面性能深度调优

来源 | 经授权转载自 网易杭州研究院 公众号


服务网格作为云原生的重要技术,提升了微服务的流控、熔断、升级等服务治理能力,但同时 sidecar 的引入也导致了时延的增加。网易数帆通过对时延引入的具体分析,尝试利用 eBPF 和用户态协议栈技术,来对时延进行优化,并最大限度地考虑兼容性,做到对容器网络、sidecar 应用的无侵入加速。

时延分析



服务网格中 sidecar 的引入在整个网络路径上增加了两个网络处理单元,从而不可避免地会引入时延。针对 sidecar 本身逻辑的优化来优化时延是社区的一个方向,比如 envoy 社区针对 mixer 的优化。另外一个方向是针对链路底层做优化。



如果打开整个链路来看,sidecar 会多引入 Service 到 sidecar 的链路以及 sidecar 到 sidecar 的链路,客户端和服务端总共多经过了四次内核态协议栈。我们通过了火焰图分析了 sidecar 应用 envoy 的 CPU 占用,发现内核态协议栈的 CPU 占比近 50%,所以针对内核态协议栈的优化效果理论上应该非常可观。


另外也可以针对容器网络做优化,比如使用 SRIOV 容器网络方案,不过会涉及对已有的容器网络方案的改造,有侵入性。

eBPF Sockops 优化 Service 和 sidecar 通信



Service 和 sidecar 之间属于同一个节点的两个容器间的通信,可以采用 Sockops 组件进行加速。


Sockops 原本是开源 Cillium 中的一个组件,利用 sockmap 和 sk redirect 技术直接绕过 TCP/IP 协议栈将报文直接发给对端 socket,从而来加速同节点 socket 之间的通信。我们借用相关实现并作了增强开发,来适配 sidecar 的场景。


Sockops 加速在《eBPF 在网易轻舟云原生的应用实践》中有详细说明。


从最终测试结果来看,使用 Sockops 加速 Service 和 sidecar 的通信,可以降低时延 10% 左右。

用户态协议栈优化 sidecar 和 sidecar 通信



sidecar 和 sidecar 之间的通信会涉及跨节点,无法使用 Sockops 进行加速,这里我们使用用户态协议栈替换内核态协议栈实现。用户态协议栈相较内核态协议栈可以在两个方面带来性能的提升:


  • 消除内核态和用户态切换的开销;

  • 将协议栈的实现代码放到独立的用户态进程中实现,去除 sidecar 中协议栈实现的 CPU 开销;


下面来具体说明相关实现。

VPP+VCL 分离式部署节省 CPU 资源


为了兼顾到性能和资源占用,我们选择 VPP 作为用户态协议栈。VPP 作为独立进程实现用户态协议栈,并提供轻量级的 VCL 动态库供 sidecar 集成以实现 socket 接口的劫持,VPP 和 VCL 之间通过共享内存进行通信。



其中:


VCL - 实现 Socket 类接口劫持并和后端 VPP 完成交互


FIFO - 是基于共享内存封装的消息队列,用于 VCL 和 VPP 之间通信


Session - 维持传输层和上层应用会话之间的对应


TCP/IP - 对应内核的 TCP/IP 协议栈实现


AF_XDP - 实现将网卡的报文收发卸载到用户态


可见,VPP+VCL 分离式的部署模式将协议栈从应用端剥离,VPP 作为实现协议栈的独立进程可以服务于节点上的所有 sidecar,从而将 sidecar 和协议栈的 1:1 绑定部署关系,变为 N:1 的独立部署关系,节省了总体的 CPU 资源占用。同时,sidecar 也将更多的 CPU 资源用于自身业务逻辑的处理,提高了 CPU 资源的利用率,从而降低了 sidecar 节点的处理时延。

无侵入设计提升易用性


无侵入设计体现在南北两个方向,南向对接容器网络,而北向对接 sidecar。


北向对接 sidecar 时,会通过 VCL 动态库供 sidecar 集成。VCL 动态库中会自动劫持 socket 接口,这样就无需 sidecar 修改代码。而且 VCL 动态库支持 LD_PRELOAD 加载方式,仅需要 sidecar 应用启动时指定此环境变量来配置 VCL 动态库的路径即可。


南向对接容器网络会麻烦一些。容器网络种类繁多,但是最终都会插入一个网口给 POD 使用,此网口以 veth 口居多,也有可能是 VF 口。由于并不是所有的流量都需要走 sidecar,比如 Service 和宿主机通信就只需要走内核态,那么如何在保留现有内核通信通道的情况下进行用户态协议栈的加速呢?



我们借助 AF_XDP 来做流量的分流。即先使用 XDP 针对于特定报文进行过滤,满足条件则送入 VPP,否则继续走内核。


报文分流到 VPP,再上送 sidecar 后,sidecar 还需要将报文发送给 Service,这条路径只能走内核,可以通过 Sockops 进行加速。

双栈支持


双栈支持其实包括两个方面。


一个是基于 eth0 口基于 AF_XDP 的双栈分流,这个在上节中已经做了说明。


另一个是 sidecar 的双栈支持,因为 sidecar 也需要通过内核态和 Service 进行通信。


sidecar 的双栈支持需要 VCL 中针对报文做区分,需要走内核态的报文则重新调用原生的 socket 接口让报文走内核态协议栈。

优化效果



针对不同的 RPS 测试 Both Sidecar 时延的情况,ua 表示启用了用户态协议栈优化。可以看出,用户态协议栈时延降低 30% 左右,Sockops 时延降低 10% 左右,两者结合后时延降低 35% 左右。

写在最后


AF_XDP+ 用户态协议栈 +Sockops 针对服务网格 sidecar 场景,优化了内核协议栈的 CPU 资源占用,降低了 sidecar 所引入的端到端时延,且对当前的容器网络以及 sidecar 应用无修改,做到无侵入加速。用户态协议栈和 Sockops 的管控基于 Kubernetes Operator 进行开发,部署和运维也非常简单,根据需要可以单独进行部署,也可以合并使用。后续我们也会考虑将针对服务网格的这些加速套件进行开源。


另外,通过加速组件的灵活组合,除了 sidecar 加速,我们也上线了针对 API 网关的加速,单独的用户态协议栈加速组件我们也在拓展到 Redis、Nginx 等加速场景。


作者简介:


汪翰林,网易数帆系统开发专家,17 年软件开发老兵。曾就职于华三和华为,从事安全、视频监控、大数据和网络虚拟化等技术产品研发,目前在网易数帆轻舟云原生团队负责高性能网络技术预研和产品落地工作。


陈启钧,网易数帆资深工程师,十年以上开发经验,曾就职于华为,主要从事存储网络管理、容器以及网络虚拟化相关工作,专注于发现并解决问题。目前在网易数帆主要负责 VPC 网络、轻舟容器网络、轻舟服务网格等方面的性能调优工作,主要关注 Kubernetes、eBPF/XDP、用户态协议栈相关技术。

2022-03-14 15:094619

评论

发布
暂无评论
发现更多内容

​对 Jenkins 和 CloudBees CI 的 UI 改进

龙智—DevSecOps解决方案

CloudBees

小插件大功能!轻量化森BIM插件手把手教学

ThingJS数字孪生引擎

插件 数字孪生 BIM

关于electron-builder打包遇到的一点点问题

空城机

Electron Node 5月月更

融云一图看懂 | 居家办公的正确姿势

融云 RongCloud

突破疫情限制,WorkPlus助力企业打开远程高效办公新模式

BeeWorks

密钥管理系统-为你的天翼云资产上把“锁

天翼云开发者社区

数据 数据安全 密码管理

游戏美术和设计师的福音,Helix DAM 测试版来了!

龙智—DevSecOps解决方案

perforce Helix DAM

自助洗车怎么洗?来看看洗车教程

共享电单车厂家

自助洗车加盟 自助洗车怎么洗 自助洗车机使用

自助洗车机投放在哪里比较好?

共享电单车厂家

自助洗车加盟 车白兔自助洗车 自助洗车机投放 自助洗车场地

初识DevOps

天翼云开发者社区

DevOps 运维 前端开发

Chrome Devtools调试小技巧

百度Geek说

后端

2022 开源之夏 | Curve 邀你与中国存储软件共成长,赢万元奖金

网易数帆

分布式 云原生 存储 Ceph curve

技术干货| MongoDB时间序列集合

MongoDB中文社区

mongodb

架构实战营作业五

热猫

架构训练 模块五

小马

「架构实战营」

Authing 宣布推出云原生「多租户」身份解决方案

Authing

身份云 数字化转型 SaaS 多租户

Klocwork 2022.1推出Kotlin分析引擎

龙智—DevSecOps解决方案

klocwork perforce

关于数据一致性解决方案

穿过生命散发芬芳

数据一致性 5月月更

自助洗车机投放应该注意哪些问题?

共享电单车厂家

自助洗车加盟 自助洗车机投放 自助洗车场地

在nginx中使用proxy protocol协议

程序那些事

Java nginx 网络协议 程序那些事 5月月更

钉钉宜搭发布大学生低代码实践计划,一起为公益发光发热!

一只大光圈

低代码 公益 钉钉宜搭

案例成果展 | 一朵“航空云”为国航APP核心业务保驾护航

York

云原生 敏捷实践 应用现代化

客户体验和客户服务的区别

龙国富

客户服务 客户体验管理

6元自助洗车怎么加盟?有啥门槛

共享电单车厂家

自助洗车怎么加盟 6元自助洗车 自助洗车加盟门槛

实战攻略:企业如何一步步建立自己的数字孪生

BeeWorks

Nebula Graph|信息图谱在携程酒店的应用

NebulaGraph

图数据库 知识图谱 NebulaGraph

自助洗车机如何使用?其实很简单

共享电单车厂家

自助洗车加盟 自助洗车机使用

前车之鉴:聊聊钉钉 Flutter 落地桌面端踩过的“坑” | Dutter

阿里巴巴终端技术

flutter 钉钉 移动端 跨端框架 桌面端

最佳实践 | 用腾讯云AI文字识别从0到1实现通信行程卡识别

牵着蜗牛去散步

腾讯 文字识别 技术实践 腾讯云AI 疫情防控

“微博评论”的高性能高可用计算架构

Dean.Zhang

服务网格数据面性能深度调优_语言 & 开发_InfoQ精选文章