容器实战高手课
李程远
eBay 总监级工程师,云平台架构师
24647 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
容器实战高手课
15
15
1.0x
00:00/00:00
登录|注册

加餐01 | 案例分析:怎么解决海量IPVS规则带来的网络延时抖动问题?

长期解决方案是将IPVS规则的状态统计从TIMER softirq中转移到kernel thread中处理
暂时替换estimation_timer()为一个空函数
大量IPVS规则导致estimation_timer()耗时
发现问题出在大量IPVS规则导致estimation_timer()耗时
使用ftrace确认estimation_timer()执行时间过长
发现TIMER softirq中调用estimation_timer()的占比较高
使用perf查找CPU32上的热点函数
发现CPU32上的softirq CPU使用率时不时超过20%
使用ebpf调用kprobe或tracepoint接口记录数据包处理过程
给每个数据包在内核协议栈关键函数上打上时间戳
解决方案
问题的根本原因
ftrace锁定长延时函数
perf定位热点
ebpf的破冰
难以复现和排查问题
出错率增加,主要是网络超时导致
用户应用从虚拟机迁移到Kubernetes平台
问题小结
调试过程
问题的背景
怎么解决海量IPVS规则带来的网络延时抖动问题

该思维导图由 AI 生成,仅供参考

你好,我是程远。
今天,我们进入到了加餐专题部分。我在结束语的彩蛋里就和你说过,在这个加餐案例中,我们会用到 perf、ftrace、bcc/ebpf 这几个 Linux 调试工具,了解它们的原理,熟悉它们在调试问题的不同阶段所发挥的作用。
加餐内容我是这样安排的,专题的第 1 讲我先完整交代这个案例的背景,带你回顾我们当时整个的调试过程和思路,然后用 5 讲内容,对这个案例中用到的调试工具依次进行详细讲解。
好了,话不多说。这一讲,我们先来整体看一下这个容器网络延时的案例。

问题的背景

在 2020 年初的时候,我们的一个用户把他们的应用从虚拟机迁移到了 Kubernetes 平台上。迁移之后,用户发现他们的应用在容器中的出错率很高,相比在之前虚拟机上的出错率要高出一个数量级。
那为什么会有这么大的差别呢?我们首先分析了应用程序的出错日志,发现在 Kubernetes 平台上,几乎所有的出错都是因为网络超时导致的。
经过网络环境排查和比对测试,我们排除了网络设备上的问题,那么这个超时就只能是容器和宿主机上的问题了。
这里要先和你说明的是,尽管应用程序的出错率在容器中比在虚拟机里高出一个数量级,不过这个出错比例仍然是非常低的,在虚拟机中的出错率是 0.001%,而在容器中的出错率是 0.01%~0.04%。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入分析了在将应用从虚拟机迁移到Kubernetes平台后,出现的网络延时抖动问题,并提供了解决方案。作者首先描述了问题的背景和调试过程,包括使用ebpf进行内核数据包处理过程的时间戳记录和分析,以及通过perf工具定位CPU上的热点函数,最终锁定网络延时问题的过程。文章涉及到Linux内核处理数据包的关键函数、ebpf工具的使用、CPU热点函数的定位等技术细节,为读者提供了解决类似网络延时问题的思路和方法。通过分析,最终发现问题出在IPVS的estimation_timer()函数,由于存在大量的IPVS规则,导致网络超时现象。为了快速解决生产环境上的问题,作者使用内核函数替换成了一个空函数,暂时规避了影响其他softirq的问题。长期的解决方案是将IPVS规则的状态统计从TIMER softirq中转移到kernel thread中处理。整体而言,本文通过深入的案例分析和技术细节,为读者提供了解决类似网络延时问题的宝贵经验和方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《容器实战高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • closer
    看了老师的文章涨见识了。深深的知道了自己的不足了,请问一下老师,作为一个运维工程师,怎么学习这种底层的内核开发细节?谢谢老师指导

    作者回复: @closer, 可以从Linux内核源代码的编译安装开始,然后读一本Linux内核书籍。

    2021-01-29
    3
    9
  • 我来也
    大集群就容易遇到IPVS规则过多的问题吧。 有点好奇 1. 集群中的其他节点应该也会存在类似的问题吧。 2.每次都是固定在这一个核上做这个事情么?

    作者回复: @我来也 > 集群中的其他节点应该也会存在类似的问题吧。 是的,在kubernetes cluster里,每个节点都会有同样的问题。ipvs rules是为每个service的in cluster vip设置的,在所有节点上的配置都是一样的。 > 每次都是固定在这一个核上做这个事情么? 是的,对于timer函数,在哪个cpu核上注册,后面就一直在那个核上执行了。

    2021-02-06
    2
    8
  • 莫名
    很赞的排查思路。 softirq 通常是节点内网络延迟的重要线索。不借助 eBPF 工具时,可以先采用传统工具 top、mpstat 重点观测下 softirq CPU 使用率是否存在波动或者持续走高的情况。如果存在,进一步使用 perf 进行热点函数分析。 不过使用现有的 eBPF softirq 相关工具更方便。

    作者回复: @莫名, 这里的问题就是一开始如何就认为是softirq这里出问题。在节点有80核的情况下,简单看一下top里的si, 它的usage是不多的。

    2021-01-29
    2
    5
  • Joe Black
    “把 IPVS 规则的状态统计从 TIMER softirq 中转移到 kernel thread 中处理”,这个事情是通过什么配置就可以实现的吗?总不能改内核模块吧?

    作者回复: 不能通过配置来实现,需要改内核。

    2021-02-04
    4
  • 那时刻
    请问老师,IPVS过多是由于service导致的么?还是旧service遗留导致的呢? 另外,不知可否分享下您实现的ebpf工具呢?

    作者回复: @那时刻, 对的IPVS是由于cluster中有大量的service, 不是残留。 我们的ebpf工具和这个有些类似吧。 https://github.com/yadutaf/tracepkt 我们增加了更多的tracepoint点和kprobe点,多了一些event的信息

    2021-01-29
    4
  • Geek_c92584
    干货满满,赞

    作者回复: 谢谢。

    2021-07-14
  • lyonger
    整体排查思路: 查看系统整体负载情况 -> 缩小问题的请求链路和排查范围 -> 采用ebpf给请求链路上的内核关键函数加上时间戳,分析时间差较长的环节,定位到cpu si高 -> perf针对高cpu使用率进行热点函数分析,找出调用次数最频繁的函数 -> 是调用次数频繁导致 or 本身执行一次该热点函数执行时间长导致? -> 使用ftrace分析热点参数在每个CPU上的执行时间 -> 根据内核源码,分析该热点函数的执行逻辑 -> 操作系统原理 -> 破案。
    2021-09-18
    4
  • yell
    采样10秒,怎么抓到0.01概率的超时的。
    2023-07-28归属地:浙江
  • Geek_9234b0
    给跪了
    2021-10-23
  • 从远方过来
    老师,分享下下分析脚本吧
    2021-06-30
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部