干货 | 携程容器偶发性超时问题案例分析(二)

【性能调优】NUMA全方面介绍 NUMA简介与优化策略 NUMA(非统一内存访问)是一种多处理器内存架构,通过将系统划分为多个节点(CPU+本地内存)来解决传统SMP架构的总线瓶颈问题。在NUMA系统中,CPU访问本地内存(约100ns)比远程内存(150-300ns)更快。优化策略包括:1)CPU亲和性绑定;2)内存分配策略(本地/交错/首选节点);3)编程层面的NUMA感知设计(如numa_alloc_onnode)。常用工具包括numactl、numastat和perf等,可查看NUMA拓扑、监控性能并调优。合理配置NUMA能显著提 阅读详情

作者简介

李剑,携程系统研发部技术专家,负责Redis和Mongodb的容器化和服务化工作,喜欢深入分析系统疑难杂症。

周昕毅,携程系统研发部云平台高级研发经理。现负责携程容器云平台运维,Cloud Storage及Cloud Network基础设施研发及运维。

本文为容器偶发性超时问题案例分析的第二篇,第一篇点这里。

前言

随着内核升级到4.14.67,看上去延迟的问题彻底解决了,然而并没有,只是出现的更加缓慢。几周后,超时报障又找了过来,我们用perf来分析,发现了一些异常。

如图1所示是一个空负载的宿主机升级内核后8天的perf的数据,明显可以看到kworker的max delay已经100ms+,而这次有规律的是,延迟比较大的都是最后四个核,对于12核的节点就是8-11,并且都是同一D厂的宿主机。而上篇中使用新内核后用来验证解决问题的却不是D厂的宿主机,也就是说除了内核,还有其他的因素导致了延迟。

图1


NUMA和CPU亲和性绑定

NUMA全称Non-Uniform Memory Access,NUMA服务器一般有多个节点,每个节点由多个CPU组成,并且具有独立的本地内存,节点内部使用共有的内存控制器,节点之间是通过内部互联(如QPI)进行通信。

然而,访问本地内存的速度远远高于访问其他节点的远地内存的速度,通常有几十倍的性能差异,这也正是NUMA 名称的由来。因为NUMA的这个特性,为了更好地发挥系统性能,应用程序应该尽量减少不同节点CPU之间的信息交互。

无意中发现,D厂的机型与其他机型的NUMA配置不一样。假设12核的机型,D厂的机型NUMA节点分配如下图2所示:

图2

而其他厂家的机型NUMA节点分配如下图3所示:

图3

为什么会出现delay都是最后四个核上的进程呢?

经过深入排查才发现,原来相关同事之前为了让k8s的相关进程和普通的用户的进程相隔离,设置了CPU的亲和性,让k8s的相关进程绑定到宿主机的最后四个核上,用户的进程绑定到其他的核上,但后面这一步并没有生效。

还是拿12核的例子来说,上面的k8s是绑定到8-11核,但用户的进程还是工作在0-11核上,更重要的是,最后4个核在遇到D厂家的这种机型时,实际上是跨NUMA绑定,导致了延迟越来越高,而用户进程运行在相关的核上就会导致超时等各种故障。

确定问题后,解决起来就简单了。将所有宿主机的绑核去掉,延迟就消失了,以下图4是D厂的机型去掉绑核后开机26天perf的调度延迟,从数据上看一切都恢复正常。

图4


新的问题

       

大约过了几个月,又有新的超时问题找到我们。有了之前的排查经验,我们觉得这次肯定能很轻易的定位到问题,然而现实无情地给予了我们当头一棒,4.14.67内核的宿主机,还是有大量无规律超时。


深入分析

perf看调度延迟,如图5所示,调度延迟比较大但并没有集中在最后四个核上,完全无规律,同样turbostat依然观察到TSC的频率在跳动。

图5

       

在各种猜想和验证都被一一证否后,我们开始挨个排除来做测试:

1、我们将某台A宿主机实例迁移走,perf看上去恢复了正常,而将实例迁移回来,延迟又出现了。

2、另外一台B宿主机上,我们发现即使将所有的实例都清空,perf依然能录得比较高的延迟。

3、而与B相连编号同一机型的C宿主机迁移完实例后重启,perf恢复正常。这时候看B的TOP,只有一个kubelet在消耗CPU,将这台宿主机上的kubelet停掉,perf正常,开启kubelet后,问题又依旧。

       

这样我们基本可以确定kubelet的某些行为导致了宿主机卡顿和实例超时,对比正常/非正常的宿主机kubelet日志,每秒钟都在获取所有实例的监控信息,在非正常的宿主机上,会打印以下的日志。如图6所示:

图6

而在正常的宿主机上没有该日志或者该时间比较短,如图7所示:

图7

到这里,我们怀疑这些LOG的行为可能指向了问题的根源。查看k8s代码,可以知道在获取时间超过指定值longHousekeeping (100ms)后,k8s会记录这一行为,而updateStats即获取本地的一些监控数据,如图8代码所示:

图8

在网上搜索相关issue,问题指向cadvisor的消耗CPU过高,

https://github.com/kubernetes/kubernetes/issues/15644

https://github.com/google/cadvisor/issues/1498

而在某个issue中指出

(https://github.com/google/cadvisor/issues/1774),

echo2 > /proc/sys/vm/drop_caches

可以暂时解决这种问题。我们尝试在有问题的机器上执行清除缓存的指令,超时问题就消失了,如图9所示。而从根本上解决这个问题,还是要减少取metrics的频率,比较耗时的metrics干脆不取或者完全隔离k8s的进程和用户进程才可以。

图9


硬件故障

       

在排查cadvisor导致的延迟的过程中,还发现一部分用户报障的超时,并不是cadvisor导致的,主要表现在没有Housekeeping的日志,并且perf结果看上去完全正常,说明没有调度方面的延迟,但从TSC的获取上还是能观察到异常。

由此我们怀疑这是另一种全新的故障,最重要的是我们将某台宿主机所有业务完全迁移掉,并关闭所有可以关闭的进程,只保留内核的进程后,TSC依然不正常并伴随肉眼可见的卡顿,而这种现象跟之前DBA那台物理机卡顿的问题很相似,这告诉我们很有可能是硬件方面的问题。

从以往的排障经验来看,TSC抖动程度对于我们排查宿主机是否稳定有重要的参考作用。这时我们决定将TSC的检测程序做成一个系统服务,每100ms去取一次系统的TSC值,将TSC的差值大于指定值打印到日志中,并采集单位时间的异常条目数和最大TSC差值,放在监控系统上,来观察异常的规律。如图10所示。

图10

这样采集有几个好处:

1、程序消耗比较小,仅仅消耗几个CPU cycles的时间,完全可以忽略不计;

2、对于正常的宿主机,该日志始终为空;

3、对于有异常的宿主机,因为采集力度足够小,可以很清晰地定位到异常的时间点,这样对于宿主机偶尔抖动情况也能采集到;

恰好TSC检测的服务上线不久,一次明显的故障说明了它检测宿主机是否稳定的有效性。如图11,在某日8点多时,一台宿主机TSC突然升高,与应用的告警邮件和用户报障同一时刻到来。如图12所示:

图11

图12

将采集的日志这样展示后,我们一眼就发现问题都集中在某几批次的同一厂商的宿主机上,并且我们找到之前DBA卡顿的物理机,也是这几批次中的一台。我们收集了几台宿主机的日志详情,反馈给厂商后,确认是硬件故障,无规律并且随时可能触发,需升级BIOS,如图13厂商技术人员答复的邮件所示,至此问题得到最终解决。

图13


总结

本系列的两篇文章基本上描述了我们遇到的容器偶发性超时问题分析的大部分过程,但排障过程远比写出来要艰难。

总的原则还是大胆假设,小心求证,设法找到无规律中的规律性,保持细致耐心的钻研精神,相信这些疑难杂症终会被一一解决。

【推荐阅读】

关注“携程技术中心”公众号

了解携程技术一手动态

numa节点_一个故事看懂NUMA技术 内存访问瓶颈我是CPU一号车间的阿Q,前一阵子我们厂里发生了一件大喜事,老板拉到了一笔投资,准备扩大生产规模。不过老板挺抠门的,拉到了投资也不给我们涨点工资,就知道让我们拼命干活,压榨我们的劳动力。老板说了,投资的钱要用来添置设备,招聘新员工,咱们原来就有八个车间了,这一下直接double,变成了十六个!我们的工资要是也能double就好了···现在我们变成了一个16核的CPU啦!原以为我们生产效... 阅读详情

相关推荐

生产环境k8s偶发超时问题排查及解决

前言: 凡是有明确报错的问题,都是能很快解决的,真正难以解决和排查的,是偶发且笼统报错的问题。 这里记录整个解决的过程,期间有走过弯路,有思维局限,但庆幸最终找到了原因,正常把我们系统上线到 k8s 平台了。 问题表现: 生产某套应用访问时,偶尔会报 timed out 。相同的配置在 开发、测试、预生产都能正常运行。 排查思路: 1、 首先,因为这个问题是偶发性的...

Jerry_Pan1990的博客 1万+

numa节点_NUMA在nova中cpu相关应用介绍

本文“云开源”,略有改动。本文介绍了OpenStack Nova在基于Numa架构图的服务器上的应用和配种。NUMA简单介绍NUMA:(Non Uniform Memory Access)即非一致内存访问架构。NUMA具有多个节点(Node),每个节点可以拥有多个CPU(每个CPU可以具有多个核或线程),节点内使用共有的内存控制器,因此节点的所有内存对于本节点的所有CPU都是等同的,而对于其它节点...

weixin_39853892的博客 1193

完美获取 CPU 的 NUMA节点数、CPU插槽个数 、 核心数 、 逻辑处理器数(线程数)、名字、制造商、指令集、主频、等等

完美获取 CPU 的 NUMA节点数、CPU插槽个数 、 核心数 、 逻辑处理器数(线程数)、名字、制造商、指令集、主频、等等

NUMA、NODE、SOCKET、CPU关系深度探索

假如系统有 A、B、C、D 四个numa,进程运行在A numa 所属core 上, 那你是否知道A numa core 上的进程访问B、C、D哪个numa 的内存性能会更高?或者浅一层的问题,你认为 NUMA 和 SOCKET是一对一的关系吗?

犀牛卫士 5433

Mixly/Arduino实战:WS2812点阵动态显示自定义图案与汉字

本文手把手教你使用Mixly和Arduino驱动WS2812点阵屏,实现自定义图案与汉字的动态显示。内容涵盖硬件连接、取模软件设置、高效数据处理技巧(巧用Excel)、Mixly图形化编程及Arduino代码解析,并深入探讨动态显示与滚动汉字原理,最后提供常见问题排查与性能优化心得,助你从零开始轻松玩转智能硬件。

weixin_29185199的博客 454

RV1126 ISP开发实战:从Tuner调试到IQ文件解析

本文详细介绍了RV1126 ISP开发的完整流程,从Tuner调试到IQ文件解析,涵盖了环境搭建、工具使用、参数配置及性能优化等关键环节。通过实战案例和避坑指南,帮助开发者快速掌握Rockchip芯片的ISP开发技巧,提升图像处理质量。

weixin_29195615的博客 571

numa节点_【海云捷迅云课堂】高性能虚拟机NUMA

云课堂专题海云捷迅云课堂专题,旨在秉承开源理念,为大家提供OpenStack技术原理与实践经验,该专题文章均由海云捷迅工程师理论与实践相结合总结而成,如大家有其他想要了解的信息,可留言给我们,我们会根据问题酌情回复。NUMA 全称 Non-Uniform Memory Access,译为“非一致性内存访问”。该构架最大优势是可以把几十个CPU(甚至上百个CPU)组合在一个服务器内。方便更好的发挥系...

weixin_39809793的博客 735

【Unity】ABB CRB 15000 外部引导运动实战:从配置到实时控制

本文详细介绍了ABB CRB 15000协作机器人的外部引导运动(EGM)功能在Unity环境中的实战应用。从RobotStudio配置到Unity实时通信架构,再到EGM运动控制技巧和问题排查,全面解析如何实现机器人的高精度实时控制。通过实际案例展示EGM技术在精密装配等场景中的显著效果,帮助开发者快速掌握这一先进技术。

weixin_29057695的博客 445

numa节点_浅解NUMA机制

导读本文适合知道NUMA这个词但想进一步了解的新手。以下的文章内容包括:NUMA的产生背景,NUMA的架构细节和几个上机演示的例子。NUMA的诞生背景在NUMA出现之前,CPU朝着高频率的方向发展遇到了天花板,转而向着多核心的方向发展。在一开始,内存控制器还在北桥中,所有CPU对内存的访问都要通过北桥来完成。此时所有CPU访问内存都是“一致的”,如下图所示:UMA这样的架构称为UMA(Unifor...

weixin_39974409的博客 4483

rk3576 适配以太网(百兆)

百兆以太网,也常被称为快速以太网,是一种在1990年代中期推出的计算机网络技术标准。它相当于把当时主流的10兆以太网速度提升了10倍,最高能提供 100 Mbps 的传输速率,让文件共享、视频传输等网络应用变得流畅许多。它在数据链路层面完全保留了传统以太网的帧格式和MAC机制,这意味着现有的网络软件可以无缝对接,用户从10兆网络升级到百兆网络时,通常只需要更换网卡和集线器/交换机即可,非常方便。 在rk3576平台上,原生以太网接口支持百兆、千兆,还有pcie转换的2.5G。

weixin_35723192的博客 203

VSCode PlantUML 插件超详细教程:从安装配置到实战绘图全流程

VSCode PlantUML 插件超详细教程:从安装配置到实战绘图全流程

weixin_69237381的博客 909

干货 | 携程容器偶发性超时问题案例分析(一)

作者简介李剑,携程系统研发部技术专家,负责Redis和Mongodb的容器化和服务化工作,喜欢深入分析系统疑难杂症。前言随着携程的应用大规模在生产上用容器部署,各种上规模的问题都慢慢浮现,其中比较难定位和解决的就是偶发性超时问题,下面将分析目前为止我们遇到的几种偶发性超时问题以及排查定位过程和解决方法,希望能给遇到同样问题的小伙伴们以启发。问题描述某一天接到用户报障说,Redis集群有超时现象发生...

携程技术 1592

【AI智能体】Hermes Agent 从部署到项目实战操作详解

Hermes Agent 桌面版从安装到实战操作详解

congge 5130

100篇你值得收藏的K8s干货文章

K8s已经成为一线大厂分布式平台的标配技术。你是不是还在惆怅怎么掌握它?来这里,大型互联网公司一线工程师亲授,不来虚的,直接上手实战,3天时间带你搭建K8s平台,快速学会K8s,点击下方...

Docker的专栏 4533

Sigrity System Explorer ViaWizard模式进行过孔建模和仿真分析操作指导

点击TVac_lower tdvac_lower,自动跳转到2D时域曲线,查看最小低电平穿过VIL(ac)max电压的延时,结果如下。点击TVac_high tdvac_high,自动跳转到2D时域曲线,查看最小高电平穿过VIH(ac)min电压的延时,结果如下。点击max Vix_Rise,自动跳转到2D时域曲线,查看上升边PN交叉点与参考电压VREF(dc)的偏差,结果如下。Threshold:阈值,软件自带3个模板,default,Tr01,Tr02,本例选择Default。

weixin_54787054的博客 571

飞牛NAS打造成童年经典游戏机

这篇文章介绍如何使用飞牛NAS搭建经典游戏模拟器。首先需开启Docker并下载RetroArch-web镜像,随后创建容器并设置端口映射。启动后上传游戏ROM文件(如NES格式),在模拟器中加载即可游玩。文章以修改版坦克大战为例,详细说明按键配置方法。同时还提到公网访问需配置DDNS或使用ZeroTier内网穿透。通过这套方案,用户可以在NAS上重温红白机等经典游戏体验。

dgnankai的专栏 884

干货 | 计算密集型服务的负载均衡策略

作者简介罗茂林,携程国际机票后台研发总监,主要负责国际机票引擎的研发工作。致力于系统性能优化和研发效率提升。一般情况下,在计算密集型服务中,即使处理单个请求也需要使用到服务器的所有CP...

携程技术 1182

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【linux】NUMA节点

NUMA(Non-Uniform Memory Access,非一致性内存访问)是一种用于多处理器计算机系统的内存设计。在NUMA架构中,系统中的物理内存被划分成多个节点(NUMA节点),每个节点与一个或多个处理器紧密关联。它允许处理器访问其本地内存的速度要比访问非本地内存(内存位于另一个处理器或者共享I/O控制器上)更快。

qq_45698138的博客 525

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NUMA架构入门

页面是操作系统管理内存的最小单位。当进程分配内存时,操作系统以“页面”为单位进行管理。通常页面大小约为4KB(4096字节)。本文主要介绍Linux中的NUMA管理方法,但Windows也在微软学习中心和各种书籍中提供了NUMA概念和API。一般来说,Windows和Linux在NUMA上的区别如下:操作系统LinuxWindowsNUMA策略应用numactl内核设置默认内存策略NODE LOCAL(默认) INTERLEAVE(内核)NODE LOCAL。

2404_84768005的博客 3195

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【性能】什么是NUMA(Non-Uniform Memory Access)|什么是SMP

什么是NUMA(Non-Uniform Memory Access) NUMA VS. UMA NUMA(Non-Uniform Memory Access)非均匀内存访问架构是指多处理器系统中,内存的访问时间是依赖于处理器和内存之间的相对位置的。 这种设计里存在和处理器相对近的内存,通常被称作本地内存;还有和处理器相对远的内存, 通常被称为非本地内存。 UMA(Uniform Memory Access)均匀内存访问架构则是与NUMA相反,所以处理器对共享内存的访问距离和时间是相同的。由此可知,不论

我的笔记本 2万+

NUMA 节点:定义、原理、作用及对 RDMA/GPU 集群的影响

NUMA(非统一内存访问)架构是多CPU服务器的核心设计,将CPU核心、本地内存和PCIe设备打包为独立节点。本地访问速度快,跨节点访问延迟高。在AI/超算场景中,NUMA拓扑直接影响RDMA和GPU性能:设备与内存同节点时效率最高,跨节点时性能显著下降。优化方法包括:使用numactl绑定CPU核心与节点、合理分配PCIe设备、关闭NUMA平衡等。科研中需注意程序调度与节点匹配,避免跨节点访问导致的性能损失。

qq_41914036的博客 1415

杂记十:numa详解

1.NUMA的几个概念(Node,socket,core,thread) 对于socket,core和thread会有不少文章介绍,这里简单说一下,具体参见下图: 一句话总结:socket就是主板上的CPU插槽; Core就是socket里独立的一组程序执行的硬件单元,比如寄存器,计算单元等; Thread:就是超线程hyperthread的概念,逻辑的执行单元,独立的执行上下文,但是共享core内的寄存器和计算单元。 NUMA体系结构中多了Node的概念,这个概念其实是用来解决core的分组的问题,具体

Cape_sir 2078

教你快速理解linux中的NUMA节点探测是干什么用的?

NUMA节点探测就是Linux开机时自动发现电脑里“哪些CPU和内存是组团工作的”,并做好标记,后续分配任务时尽量让CPU用“本地内存”,提升效率。每个区有自己的超市(内存),居民(CPU)去本区的超市买东西最快,去其他区的超市会慢一些。给每个节点贴上编号(比如Node 0、Node 1),告诉系统:“这是两个独立的小王国,尽量让它们自己管自己的事情”。像“市长”一样,检查电脑里有多少个CPU群(比如2组,每组8核)和对应的内存条,确定哪些CPU和内存离得近。如果用了节点1的内存,速度会下降。

最后一个bug的博客 486

NUMA详解

node 0 10: 10 211: 21 10以上输出显示当前系统中有两个节点,分别是节点0和节点1。节点0具有16个物理CPU核心(编号为0到15和32到47),内存大小为261726 MB,可用内存大小为119515 MB。节点1具有与节点0相同数量的物理CPU核心,内存大小为262144 MB,可用内存大小为118662 MB。表中最后三行的数字表示两个节点之间的距离,这是访问跨节点内存的相对延迟或成本的一种度量。

顺其自然~专栏 3536

numa节点_5G性能起飞,用好Kubernetes的NUMA对齐

什么是NUMANUMA的全称叫Non-Uniform Memory Access,非均匀访问存储模型。第一次见到的时候,每个字都认识,但是完全不知道它在说什么。那索性就不要管字面意思,内涵意思就是在服务器上为了支持扩展多处理器而设计的一种硬件架构。现在基本市面上见到的大部分服务器都是NUMA架构的,这是不是就简单了。NUMA架构来看上面这张图感受一下NUMA架构,一个Socket就是一个CPU处理...

weixin_39617484的博客 1819
上一篇: 干货 | 拐点已至,云原生引领数字化转型升级
下一篇: 干货 | Node.js在携程的落地和最佳实践
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值