应用容器化后为什么性能下降这么多?

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

c595688993b3a776cf86cbc3d1de7172.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:

  • Boot 地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 地址:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

来源:juejin.cn/post/
7268663683881828413


背景

随着越来越多的公司拥抱云原生,从原先的单体应用演变为微服务,应用的部署方式也从虚机变为容器化,容器编排组件k8s也成为大多数公司的标配。然而在容器化以后,我们发现应用的性能比原先在虚拟机上表现更差,这是为什么呢?

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

压测结果

容器化之前的表现

应用部署在虚拟机下,我们使用wrk工具进行压测,压测结果如下:

07df8345d6819ecff7af8915d7d7d2eb.jpeg
压测结果

从压测结果看,平均RT为1.68ms,qps为716/s,我们再来看下机器的资源使用情况,cpu 基本已经被打满。

d96eb8389d17958fe30f8d55d16f9a63.jpeg
cpu 基本已经被打满

容器化后的表现

使用wrk工具进行压测,结果如下:

11d075622e6b1970107b520d89c53bcd.jpeg
压测结果

从压测结果看,平均RT为2.11ms,qps为554/s,我们再来看下机器的资源使用情况,cpu基本已经被打满。

92014ef92e1dfecaef5c6f1f66cb0a75.jpeg
cpu基本已经被打满

性能对比结果

性能对比虚拟机容器
RT1.68ms2.11ms
QPS716/s554/s

「总体性能下降:RT(25%)、QPS(29%)」

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

原因分析

架构差异

由于应用在容器化后整体架构的不同、访问路径的不同,将可能导致应用容器化后性能的下降,于是我们先来分析下两者架构的区别。我们使用k8s作为容器编排基础设施,网络插件使用calico的ipip模式,整体架构如下所示。

8223770b8bd39f945f263be2cb10f7b2.jpeg
架构差异

这里需要说明,虽然使用calico的ipip模式,由于pod的访问为service的nodePort模式,所以不会走tunl0网卡,而是从eth0经过iptables后,通过路由到calico的calixxx接口,最后到pod。

性能分析

在上面压测结果的图中,我们容器化后,cpu的软中断si使用率明显高于原先虚拟机的si使用率,所以我们使用perf继续分析下热点函数。

bde47a38ff78b5ca9fc307772d7776a2.jpeg
性能分析

为了进一步验证是否是软中断的影响,我们使用perf进一步统计软中断的次数。

1ba1c406f032e8c4359efbce707ff1fc.jpeg
软中断的次数

「我们发现容器化后比原先软中断多了14%,到这里,我们能基本得出结论,应用容器化以后,需要更多的软中断的网络通信导致了性能的下降。」

软中断原因

由于容器化后,容器和宿主机在不同的网络namespace,数据需要在容器的namespace和host namespace之间相互通信,使得不同namespace的两个虚拟设备相互通信的一对设备为veth pair,可以使用ip link命令创建,对应上面架构图中红色框内的两个设备,也就是calico创建的calixxx和容器内的eth0。我们再来看下veth设备发送数据的过程

static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
{
...
    if (likely(veth_forward_skb(rcv, skb, rq, rcv_xdp)
...
}

static int veth_forward_skb(struct net_device *dev, struct sk_buff *skb,
       struct veth_rq *rq, bool xdp)
{
 return __dev_forward_skb(dev, skb) ?: xdp ?
  veth_xdp_rx(rq, skb) :
  netif_rx(skb);//中断处理
}


/* Called with irq disabled */
static inline void ____napi_schedule(struct softnet_data *sd,
         struct napi_struct *napi)
{
 list_add_tail(&napi->poll_list, &sd->poll_list);
  //发起软中断
 __raise_softirq_irqoff(NET_RX_SOFTIRQ);
}

通过虚拟的 veth 发送数据和真实的物理接口没有区别,都需要完整的走一遍内核协议栈,从代码分析调用链路为 veth_xmit -> veth_forward_skb -> netif_rx -> __raise_softirq_irqoff,「veth的数据发送接收最后会使用软中断的方式,这也刚好解释了容器化以后为什么会有更多的软中断,也找到了性能下降的原因。」

优化策略

原来我们使用calico的ipip模式,它是一种overlay的网络方案,容器和宿主机之间通过veth pair进行通信存在性能损耗,虽然calico可以通过BGP,在三层通过路由的方式实现underlay的网络通信,但还是不能避免veth pari带来的性能损耗,针对性能敏感的应用,那么有没有其他underly的网络方案来保障网络性能呢?那就是macvlan/ipvlan模式,我们以ipvlan为例稍微展开讲讲。

ipvlan L2 模式

IPvlan和传统Linux网桥隔离的技术方案有些区别,它直接使用linux以太网的接口或子接口相关联,这样使得整个发送路径变短,并且没有软中断的影响,从而性能更优。如下图所示:

99f85271a69e8ae3ce3d38a183727788.jpeg
ipvlan L2 模式

上图是ipvlan L2模式的通信模型,可以看出container直接使用host eth0发送数据,可以有效减小发送路径,提升发送性能。

ipvlan L3 模式

ipvlan L3模式,宿主机充当路由器的角色,实现容器跨网段的访问,如下图所示:

547adfeba99748f626b55b3ce176baf9.jpeg
ipvlan L3 模式

Cilium

除了使用macvlan/ipvlan提升网络性能外,我们还可以使用Cilium来提升性能,Cilium为云原生提供了网络、可观测性、网络安全等解决方案,同时它是一个高性能的网络CNI插件,高性能的原因是优化了数据发送的路径,减少了iptables开销,如下图所示:

5eebfe19abd493263be4971210ad5185.png
Cilium

虽然calico也支持ebpf,但是通过benchmark的对比,Cilium性能更好,高性能名副其实,接下来我们来看看官网公布的一些benchmark的数据,我们只取其中一部分来分析,如下图:

069d6277ed6a88a8817f014c2c5cad1a.jpeg

benchmark数据

1e4e748642f2d9c483825b7f05dde376.jpeg

benchmark

无论从 QPS 和 CPU 使用率上 Cilium 都拥有更强的性能。

总结

容器化带来了敏捷、效率、资源利用率的提升、环境的一致性等等优点的同时,也使得整体的系统复杂度提升一个等级,特别是网络问题,容器化使得整个数据发送路径变长,排查难度增大。不过现在很多网络插件也提供了很多可观测性的能力,帮助我们定位问题。

我们还是需要从实际业务场景出发,针对容器化后性能、安全、问题排查难度增大等问题,通过优化架构,增强基础设施建设才能让我们在云原生的路上越走越远。

最后,感谢大家观看,也希望和我讨论云原生过程中遇到的问题。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

b7a5d647bb03a9d601f68bb166ba36d6.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

3cd572a5689806da2f669c5d692f0c77.png

70222d8b438b24c3cb7144968f7c0ddb.pngceca783af75f6d90ad92d110e0f3922b.pngf0fa55f3e9a86dbb60d1e59e015f0792.png655b415b065f3947643b5a8f2c064dd5.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值