2个工具,助你排查Kubelet CPU 使用率过高问题

本文是跟安信证券容器云技术团队共同进行问题排查的最佳实践。

问题背景

我们发现客户的Kubernetes集群环境中所有的worker节点的Kubelet进程的CPU使用率长时间占用过高通过pidstat可以看到CPU使用率高达100%。本文记录下了本次问题排查的过程。

2个工具,助你排查Kubelet CPU 使用率过高问题

集群环境

2个工具,助你排查Kubelet CPU 使用率过高问题

排查过程

使用strace工具,58同城kubelet进程进行跟踪

1、由于Kubelet进程CPU使用率异常可以使用strace工具对kubelet进工具英文程动态跟踪进程的调用情况,首先使用strace -cp <PID>命令统计kubcpu天梯图elet进程在某,2021图片段时间内的每个系统调用的时间、调用和错误情况。

2个工具,助你排查Kubelet CPU 使用率过高问题

从上图可以看到,执行系统调用排查的意思过程中,futex抛出了五千,12星座多个errocpu温度多少正常rs,这并不com.cn/tag/%e6%98%af%e4%b8%80%e4%b8%aa" target="_blank">是一个正常的数量,而且该函数占用的时间达到了99%,所以需要进一步查看kubelet进程相关的调用。

2、由于strace -cp命令只能查看进程的整体调用情况,所以我们可以通过strace -tt -p <PID>命令打印每个系统调用的时间戳,如下:

2个工具,助你排查Kubelet CPU 使用率过高问题

从s,2021年是什么年trace输cpu天梯图出的结果来看,在执行futex相关的系统调用时,有大量的Connect timed out,并返回了-1和ETIMEDOUT的error,所以排查情况说明怎么写才会在strace -cp中看到了那么多,,,,站役成长的画的error。

futex是一种用户态和内工具简笔画核态混合的同步机制,当futex变量告诉进程有竞争发生时,会执行系统调用去完成相应的处理,例如wait或者wakcpu由什么组成e up,从官方的文档了解到,futex有这么几个参数:

futex(uint32_t *uaddr, int futex_op, uint32_t v排查情况说明怎么写al,
const struct timespec *timeout,   /* or: uint,,,,站役成长的画32_t val2 */
uint32_t *uaddr2, uint32_t val3);

官方文档给出ETIMEDOUT的解释:

ETIMEDOUT
The operation in futex_op employed the timeout specified in
timeout, and the timeout expired before the operation
completed.

意思就,2021年是什么年是在指定的timeout时间中,未能完成相应的操作,其中futex_op对应上述输出结果的FUTEX_WAIT_PRIVATEFUTEX_WAIT_PRIVATE,可以看到基本都是发生使用率英文FUTEX_W工具人的自我修养快穿冻感超人AIT_PRIVATE时发生的,2021图片超时。

从目前的系统调用层面可以判断,futex无法顺利进入睡眠状态,但是futex进行了哪些操作还是不清楚,因此仍无法判断kubeletCPU飙高的原因,所以我们需要进一步从k使用率怎么算ubelet的函数调用中去看cpu温度多少正常到底是执行卡在了哪个地方。

FUTEX_PRIVATE_FLAG:这个参数告诉内核futex是进程,12星座 公主 礼服 儿童专用的,不与其他进程共享,这里的FUTEX_WAIT_PRIVATE和FUTEX_WAKE_PRIVATE就是其中排查隐患的两种FLAG;

futex相关说明1: https:,12星座//man7.org/linux/man-pages/man7/futex.7.h工具人的自我修养tml
fucpu天梯2021ex相关说明2: https://man7.org/linux/man-pages/man2/futex.2.html

使用go pprof工具对k使用率怎么算ubelet函数调用进行分析

早期的Kubernetes版本,可以直接通过debug/pprof 接口获取debug数据,后面考虑到相关安全性的问题,取消了这个接口,具体信息可以参考CVE-2工具简笔画019-11248(https://使用率github.com/kubernetes/kubernetes/issues/81023)。因此我们将通过kubectl开启proxy进行相关数据指标的获取

1、首先使用kube工具ctl proxy命令启动API server代理

kubect,2021年是什么年l proxy --address='0.0.0.0'  --accept-hosts='^*$'

这里需要注意,如果使用的是Rancher UI上复制的k,,,,站役成长的画ubeconfig文件,则需要使用指定了master IP的conte使用率最高的名字xt,如果是RKE或者其他工具安装则可以忽略。

2、构建排查报告模板Golang环境。go pp排查报告怎么写ro,58同城f需要在golang环境下使用,本地如,12星座 公主 礼服连衣裙果没有安装golang,则排查报告可以通过排查安全隐患Docker快速构建Golang环境

docker run -itd --name g,12星座 公主 礼服连衣裙olang-env --net host golang bash

3、使用go pprof工具导出采集的指标,这里替排查情况说明怎么写换127.0.0.1为apiserver节点的IP,默认端口是8001,工具人的自我修养快穿冻感超人如果docpu是什么cker run的环境跑在api使用率怎么算server所在的节点上,可以使用127.0.0.1。另外,还要替换NODENAME为对应的节点名称。

docker e,58同城招聘xec -it golang-env bash
go tool pprcpu温度过高怎么办of -seconds=60 -raw -output=kubelet.pp工具人的自我修养rof http://1工具人男主不想走剧情27.cpu性能天梯图0.0.1:8001/api/v1/nocpu性能天梯图des/${NODENAME}/proxy/debug/pprof/profile

4、输出好的pprof文件不方便查看,需要转换成火焰图,推荐使用FlameGraph工具生成svg图

git clone https://git工具人是什么意思hub.com/brendangregg/Flacpu使用率100怎么办meGraph.git
cd Fl使用率怎么算ameGraph/
./stackcollapse-go使用率是什么意思.pl kubel,2021年是什么年et.pprof > kubelet.out
./flameg工具简笔画raph.pl kubelet.out > kubelet.svg

转换成火焰图后,就排查的意思可以在浏览器直观地看到函数相关调用和具体调用时间比了。

5、分析火焰图

2个工具,助你排查Kubelet CPU 使用率过高问题

从kubelet的火焰图可以,,,,站役成长的画看到,调用时间最长的函数cpu使用率100怎么办是*k8s.io/kubernetes/vendor/github.com/gcpu温度多少正常oogle/cadviso,58同城找工作r/manager.(containerData).housekeeping**,其中cAdvisor是kubelet内置的指标采集工具,主要是负责对节点机器上的资源及容器进行实时监控和性能数据采集,2021年是什么年,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况。

深入函数调用可以发现k8s.io/kubernetes/vendor/github.c使用率怎么算om/opencontainers/runc/libcontain,2021年是什么年er/cgroups/fs.(Manager).GetStats这个函数占用k8s.io/kubernetes/vendor/github.com/google/cadv,,,,站役成长的画isor/manager.cpu性能天梯图(containecpu性能天梯图rData).housekeeping这工具人男配他觉醒了个函数的时间是最长的,说明在获取容器CGroup相关状态时占用了较多的时间。

6、既然这个函数占用时间长,那么我们就分析一下,58同城找工作这个函数具体干了什么。

查看源代码:
http,,,,站役成长的画s://github.com/kubernetes/k使用率最高的头像ubernetes/blob/ded8a1e2853aef374fc93300fe1b22cpu温度多少正常5f38f19使用率d9d/vendor/github.com/opencontainers/runc/libcontainer/cgroups,2021图片/fs/memory.go#L162

func (s *MemoryGroup) GetStats(p排查报告ath string, stats *cgroups.Stats) errorcpu使用率100怎么办 {
// Set stats工具的拼音 from mcpu温度多少正常emory.stat.
statsFile, err :=,58同城找工作 os.Open(filepath.Join(path, "memory.stat"))
if err !=cpu性能天梯图 nil {
if os.IsNotExist(err) {
return nil
}
return err
}
defer statsFile.Close()
sc := bufio.NewScannecpu性能排行r(statsFile)
for sc.Scan() {
t, v, err := fscommon.cpu天梯2021GetCgroupPa排查报告怎么写ramKeyValue(sc.Text())
if err != nil {
return fmt.Errorf("failed to parse memory.stat (%q) - %v", sc.Text(), err)
}
stats.Me,58同城找工作moryStats.Stats[t] = v
}
stats.MemoryStats.Cache = sta,58同城ts.MemoryStats.Stats["cache"]
memoryUsage, err := getM工具人emoryData(path, "")
if erCPUr != nil {
return err
}
stats.Mcpu性能天梯图emoryStats.Usage = memory工具Usage
swapUsage, err := getMemcpu性能天梯图oryData(pcpu天梯图2021最新版ath, "memsw")
if e,12星座rr != nil {
return err
}
stats排查报告模板.MemoryStats.SwapUsage = swapUsage
kernelUsage, err := getMemoryData(path, "kmem")
if err != nil {
return err
}
stats.MemoryStats.KernelUsage = kernelUsage
kernelTCPUsage, err := getMemoryData(path, "kmem.tcp")
if err != nil {
return err
}
stats.MemoryStats.KernelTCPUsage = kernelTCPUsage
useHierarchy := strings.Join([]string{"memory", "use_hierarchy"}, ".")
value, err := fscommon.GetCgroupParamUint(path, useHierar排查情况说明怎么写chy)
if err != nil {
return err
}
if value == 1 {
sta排查安全隐患ts.Mem工具人是什么意思orycpu温度过高怎么办Stats.UseHierarchy = true
}
pagesByNUMA, e工具人是什么意思rr := getPageUsageByNUMA(path)
if e工具的拼音rr != nil {
return err
}
stats.Memo工具简笔画rySt使用率最高的头像ats.PageUsageByN,2021图片UMA = pagesByNU,2020年高考分数线MA
return nil
}

从代码中可以看到,进工具简笔画程会去读取memory.stat这个文cpu天梯图2021最新版件,这个文件存放了cgroup内存使用情况。也就是说,工具在读取这个文件花费了大量的时间。这时候,如果我们手动去查看这个文件,会是什么效果?

# time cat /sys/fs/cgroup/memory/工具memory.stat >/dev/null
real 0m9.065s
user 0m0.000s
sys 0m9.064s

从这里可以看出端倪了,读取这个文件花费了9s,显然是不正常的。

基于上述结果,我们在cAdvisor的GitHub上查找到一个issue(https://github.com/google/cadvisor/issues/1774),从该issue中可以得知,该问题跟slab memor,,,,站役成长的画y 缓存有一定的关系。从该issue中得知,受影响的机器的内存会逐渐被使使用率怎么计算公式用,通过/proc/meminfo看到使用的内存是slacpu温度过高怎么办b memory使用率,该内,2021图片存是内核缓存的内存工具页,并且其中绝大部分都是dentry缓存。从这里我们可以判断出,当CGroup中的进程生命周期结束后,由于缓,12星座存的原因,还存留在slab memory中,导致其类似僵尸CGroup一样无法被释放。

也就是每当创建一个memory CGroup,在内核内存空间中,就会为其创建分配一份内存空间,该内存包含当前CGroup相关的cach工具英文e(dentry、inode),也就是目使用率录和文件索引的缓存,该缓存本质上是为了提高读取的效率。但是当CGroup中的所有进程都退出时,存在内核内存空间使用率怎么算的缓存并没有清理掉。

内核通cpu温度多少正常过伙伴算法进行内存分配,每当有进程申请内存空间时使用率是什么意思,会为其分配至少一个内存页面,也就是最少会分配4k内存,每次释放内存,也是按照最少一个页面来进行释放。当请求分配的内存大小为几十个字节或,58同城几百个字节时,4k对其来说是一个巨大的内存空间,在Linux中,为了解决这个问题,引入了slab内存分配管理机制,用来处理这种小量的内存请求,这就会导致,当CGroup中的所有进程都退出时,不会轻易回收这部分的内存,而这部分内存排查报告怎么写中的缓存数据,还会被读取到stats中,从而导致影响读取cpu性能排行的性能。

解决方法

1、清理节点缓存,这是一个临时的解决方法,暂时清空节点内存缓存,能够缓解kubelet CPU使用率,但是后排查癌症要做什么检查面缓存上来了,CPU使用率又会升上来。

echo 2 > /proc/sys/vm/drop_caches

2、升级内核版本

其实这个主要还是内核的问题,在GitHub上这个commit(https://git,58同城招聘hub.com/torvaldscpu是什么/linux/commit/205b20cc5a99cdf197c32f4dbee2b09c69947使用率7f0)中有提到,在5.2+以上的内核版本中,优化了CGroup stats相关的查询性能,如果想要更好的解决该问使用率题,建议可以参考自己操作系统和环境,合理的升cpu天梯2021级内核版本。
另外Redhat在kernel-4.18.0-1,12星座 公主 礼服连衣裙76(https://bugzilla.redhat.com/show_bug.cgi?id=1795049)版本中也优化了相关CGro工具英文up的性能问题,而CentOS 8/RHEL 8默认使用的内核版本就是4.18,如果目前您使用的操作系统是RHEL7/CentOS7,则可以尝试逐渐替换新的操作系统,使用这个4.18.0-176版本以上的内核,毕竟新版本内核总归是对容器相关的体验会好很工具人多。

kernel相关commit:
https://github.com/tor排查报告valds/linux/commit/205b20cc5a99cdf197c32f4dbee2b09c699477f0
redhat kernel bug f使用率怎么算ix:
https://bugzilla.排查情况说明怎么写redhat.com/show_bug.cgi?id=1795049