Linux操作系统load average过高,kworker占用较多cpu

今天巡检发现,mc1的K8S服务器集群有些异常,负载不太均衡。其中10.2.75.32-34,49的load average值都在40以上,虽然机器的cpu核数都是40或48核不算严重,但也值得重视。

登陆机器查看,执行top发现,cpu的使用率接近40%,sys有20-30,user有10-20。也发现有大量的内核线程[kworker]占用比较多的使用率。如下是在下午7点多的截图,如果是高峰期9点,kworker的数字多数是在20-30之间,说明占用了比较多的cpu资源。

顺着这个方向排查。[kworker]这种内核线程使用的是内核工作队列模式,1个cpu就产生对应的1个内核线程。参考了这个文章:https://yq.aliyun.com/articles/504369

里面有说到kworker的排查方面,即用ftrace命令,排查workqueue_queue_work中什么函数调用最多。

在机器上安装ftrace,参考文章:https://linux.cn/article-9273-1.html

apt-get install trace-cmd

装上后运行一段时间查看

trace-cmd record -e workqueue:workqueue_queue_work

trace-cmd report > result

把结果保存到result后,进行分析结果得出:

这个dbs_timer的function运行数量极大。关键字搜索一下,感觉有点是这个引起的问题,因为这个函数是跟cpu动态调整频率有关系,而cpu调频是用来省电用的

具体通过学习了cpufreq的知识:

https://www.ibm.com/developerworks/cn/linux/l-cn-cpufreq/index.html

http://abcdxyzk.github.io/blog/2015/08/12/kernel-cpufreq/

里面提到一点:

Cpufreq 作为一个子系统最早被加入到 Linux 内核中时只配备了 governors ,分别是performance、powersave 和 userspace,ondemand。当用户选择使用 performance governor 时,CPU会固定工作在其支持的最高运行频率上;当用户选择使用 powersave governor 时,CPU会固定工作在其支持的最低运行频率上。因此这两种 governors 都属于静态 governor ,即在使用它们时CPU 的运行频率不会根据系统运行时负载的变化动态作出调整。这两种governors 对应的是两种极端的应用场景,使用 performance governor 体现的是对系统高性能的最大追求,而使用 powersave governor 则是对系统低功耗的最大追求。

安装下面的软件查看配置:

apt-get install cpufrequtils

但是我们的cpu配置是这样的:

初步怀疑:cpu的动态调频策略,导致每隔一段时间就要执行od_dbs_timers函数(调用dbs_timers的调用者),来判断cpu是否要进行降频或者升频,因为我们的进程数量特别多,所以也可能会加快这个策略的运行频率。最后就导致kworker占用比较高的资源。

为了确认是否这个引起的,下午7点多的时候在3台机器上进行了验证,把cpufreq的策略改为performance,这个策略上面说过cpu将不会进行调频,这3台机器都是kworker还处于比较高使用率情况的

for i in $(ls /sys/devices/system/cpu/*/cpufreq/scaling_governor);do echo performance > $i;done

查看实际的模式是否修改完成

等待片刻后,load average 下降很多, kworker也从top命令的首页中消失,cpu的sys和user使用率也降低,说明这个改动是有效的。

在类似K8S这种负载比较高,进程数量多的服务器上,应该要关闭这个调频功能,虽然不省电,但至少可以避免在负载出现一定程度的情况下内核线程反而会加大cpu资源消耗的情况。

Linux操作系统load average过高,kworker占用较多cpu的更多相关文章

  1. [转帖]进程上下文频繁切换导致load average过高

    进程上下文频繁切换导致load average过高 2016年6月26日admin发表评论阅读评论 http://www.361way.com/linux-context-switch/5131.ht ...

  2. Linux 通过 load average 判断服务器负载情况

    Linux中load average判断服务器负载情况 转载文章 http://www.111cn.net/sys/linux/56003.htm 写的比较详细,推荐看看.

  3. linux主机load average的概念&&计算过程&&注意事项

    最近开发的一个模块需要根据机房各节点的负载情况(如网卡IO.load average等指标)做任务调度,刚开始对Linux机器load average这项指标不是很清楚,经过调研,终于搞清楚了其计算方 ...

  4. 进程上下文频繁切换导致load average过高

    一.问题现象 现网有两台虚拟机主机95%的cpu处于idle状态,内存使用率也不是特别高,而主机的load average达到了40多. 二.问题分析 先在主机上通过top.free.ps.iosta ...

  5. Linux系统Load average负载详细解释

    我们知道判断一个系统的负载可以使用top,uptime等命令去查看,它分别记录了一分钟.五分钟.以及十五分钟的系统平均负载 例如我的某台服务器: $ uptime 09:50:21 up 200 da ...

  6. 理解Linux系统负荷load average

    理解Linux系统负荷   一.查看系统负荷 如果你的电脑很慢,你或许想查看一下,它的工作量是否太大了. 在Linux系统中,我们一般使用uptime命令查看(w命令和top命令也行).(另外,它们在 ...

  7. [进程管理] Linux中Load average的理解

    Load average的定义 系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树.如果一个进程满足以下条件则其就会位于运行队列中: - 它没有在等待I/O操作的结果 - 它没有主动进入等待状 ...

  8. linux c++应用程序内存高或者占用CPU高的解决方案_20161213

    对于绝大多数实时程序来说,实时处理相关程序中的循环问题所带来的对机器的损耗和自身的处理速度的平衡,以及与其他程序的交互以及对其他功能的影响难免会成为程序设计中最大的障碍同时也是最大的突破点. 在所有这 ...

  9. LINUX下CPU Load Average的一点研究

    背景: 公司的某个系统工作在基于Linux的Cent OS下,一个host下同时连接了许多client, 最近某台Host总是显示CPU Load Average过高,我们单纯的以为是CPU的占用过高 ...

随机推荐

  1. java jdk1.8 API

    里面有 中英文 jdk 1.8 API    还有 jdk1.6 和1.7 英文 API 链接:https://pan.baidu.com/s/1tchABVX7htJCaO3quENP1g提取码:y ...

  2. Android中BroadcastReceiver的使用

    1.Android中广播分为静态注册和动态注册 2.下面是一个简单静态注册的例子 创建一个继承BroadcastReceiver的子类 public class DeviceBootReceiver ...

  3. ajax:用于创建快速动态网页的技术

    ajax是一种用于创建快速动态网页的技术. 异步的javascript和XML(JSON),主要是完成一个局部刷新. 异步:你传输吧,我先干我自个儿的事,你传好了告诉我一声 同步:你传输,我停下活儿看 ...

  4. 鼠标指针光标样式css cursor default pointer hand url

    一.cursor语法与结构 1.cursor语法:cursor : auto | crosshair | default | hand | move | help | wait | text | w- ...

  5. vue处理换行符

    1.处理换行符 <tr class="unread" v-for="(item,index) in DataList" :key="index& ...

  6. vue组件间的传值方式及方法调用汇总

    1.传值 a.父组件传子组件 方法一: 父页面: <myReportContent v-if="contentState==1" :paramsProps='paramsPr ...

  7. element-ui组件,全选树节点,新增数据子节点数据,出现回填问题

    案情分析:全选后父节点被选中保存,在这个树节点下新增数据时,就会出现,也被选中,事实上数据是没有被选中,也就意味着权限未被配置,而显示是已经配置了,显然这个是一个bug 1.处理前,直接用下面的方法很 ...

  8. Java&Selenium截图方法封装

    Java&Selenium截图方法封装 package util; import org.apache.commons.io.FileUtils; import org.openqa.sele ...

  9. Week08_day01 (Hive 自定义函数 UDF 一个输入,一个输出(最常用))

    当我们进入企业就会发现,很多时候,企业的数据都是加密的,我们拿到的数据没办法使用Hive自带的函数去解决,我们就需要自己去定义函数去查看,哈哈,然而企业一般不会将解密的代码给你的,只需要会用,但是我们 ...

  10. Dijkstra算法和Floyd算法

    一.简介 迪杰斯特拉(Dijkstra)算法和弗洛伊德(Flyod)算法均是用于求解有向图或无向图从一点到另外一个点最短路径. 二.Dijkstra 迪杰斯特拉算法也是图论中的明星算法,主要是其采用的 ...