浅谈Linux高负载的系统化分析浅谈Linux高负载的系统化分析

2021-08-25 10:31:01 来源:网络整理 作者:管理员

原标题:浅谈 Linux 高负载的系统化分析浅谈 Linux 高负载的系统化分析

简介: 浅谈 Linux 高负载的系统化分析,阿里云系统组工程师杨勇通过对线上各种问题的系统化分析。

讲解 Linux Load 高如何排查的话题属于老生常谈了,但多数文章只是聚焦了几个点,缺少整体排查思路的介绍。所谓 “授人以鱼不如授人以渔”。本文试图建立一个方法和套路,来帮助读者对 Load 高问题排查有一个更全面的认识。

从消除误解开始

没有基线的 Load,是不靠谱的 Load

从接触 Unix/Linux 系统管理的第一天起,很多人就开始接触 System Load Average 这个监控指标了,然而,并非所有人都知道这个指标的真正含义。一般说来,经常能听到以下误解:

  • Load 高是 CPU 负载高……
  • 传统 Unix 于 Linux 设计不同。Unix 系统,Load 高就是可运行进程多引发的,但对 Linux 来说不是。对 Linux 来说 Load 高可能有两种情况:
  • 系统中处于 R 状态的进程数增加引发的
  • 系统中处于 D 状态的进程数增加引发的
  • Loadavg 数值大于某个值就一定有问题……
  • Loadavg 的数值是相对值,受到 CPU 和 IO 设备多少的影响,甚至会受到某些软件定义的虚拟资源的影响。Load 高的判断需要基于某个历史基线 (Baseline),不能无原则的跨系统去比较 Load。
  • Load 高系统一定很忙…..
  • Load 高系统可以很忙,例如 CPU 负载高,CPU 很忙。但 Load 高,系统不都很忙,如 IO 负载高,磁盘可以很忙,但 CPU 可以比较空闲,如 iowait 高。这里要注意,iowait 本质上是一种特殊的 CPU 空闲状态。另一种 Load 高,可能 CPU 和磁盘外设都很空闲,可能支持锁竞争引起的,这时候 CPU 时间里,iowait 不高,但 idle 高。

Brendan Gregg 在最近的博客 [Linux Load Averages: Solving the Mystery] (http://www.brendangregg.com/blog/2017-08-08/linux-load-averages.html) 中,讨论了 Unix 和 Linux Load Average 的差异,并且回朔到 24 年前 Linux 社区的讨论,并找到了当时为什么 Linux 要修改 Unix Load Average 的定义。文章认为,正是由于 Linux 引入的 D 状态线程的计算方式,从而导致 Load 高的原因变得含混起来。因为系统中引发 D 状态切换的原因实在是太多了,绝非 IO 负载,锁竞争这么简单!正是由于这种含混,Load 的数值更加难以跨系统,跨应用类型去比较。所有 Load 高低的依据,全都应该基于历史的基线。本微信公众号也曾写过一篇相关文章,可以参见Linux Load Average那些事儿。

浅谈Linux高负载的系统化分析浅谈Linux高负载的系统化分析

如何排查 Load 高的问题

如前所述,由于在 Linux 操作系统里,Load 是一个定义及其含混的指标,排查 loadavg 高就是一个很复杂的过程。其基本思路就是,根据引起 Load 变化的根源是 R 状态任务增多,还是 D 状态任务增多,来进入到不同的流程。

这里给出了 Load 增高的排查的一般套路,仅供参考:

浅谈Linux高负载的系统化分析浅谈Linux高负载的系统化分析

在 Linux 系统里,读取 /proc/stat 文件,即可获取系统中 R 状态的进程数;但 D 状态的任务数恐怕最直接的方式还是使用 ps 命令比较方便。而 /proc/stat 文件里 procs_blocked 则给出的是处于等待磁盘 IO 的进程数:

浅谈Linux高负载的系统化分析浅谈Linux高负载的系统化分析

通过简单区分 R 状态任务增多,还是 D 状态任务增多,我们就可以进入到不同的排查流程里。下面,我们就这个大图的排查思路,做一个简单的梳理。

R 状态任务增多

即通常所说的 CPU 负载高。此类问题的排查定位主要思路是系统,容器,进程的运行时间分析上,找到在 CPU 上的热点路径,或者分析 CPU 的运行时间主要是在哪段代码上。

CPU user 和 sys 时间的分布通常能帮助人们快速定位与用户态进程有关,还是与内核有关。另外,CPU 的 run queue 长度和调度等待时间,非主动的上下文切换 (nonvoluntary context switch) 次数都能帮助大致理解问题的场景。

因此,如果要将问题的场景关联到相关的代码,通常需要使用 perf,systemtap, ftrace 这种动态的跟踪工具。

关联到代码路径后,接下来的代码时间分析过程中,代码中的一些无效的运行时间也是分析中首要关注的,例如用户态和内核态中的自旋锁 (Spin Lock)。

当然,如果 CPU 上运行的都是有非常意义,非常有效率的代码,那唯一要考虑的就是,是不是负载真得太大了。

D 状态任务增多

根据 Linux 内核的设计, D 状态任务本质上是 TASK_UNINTERRUPTIBLE 引发的主动睡眠,因此其可能性非常多。但是由于 Linux 内核 CPU 空闲时间上对 IO 栈引发的睡眠做了特殊的定义,即 iowait,因此iowait 成为 D 状态分类里定位是否 Load 高是由 IO 引发的一个重要参考。

当然,如前所述, /proc/stat 中的 procs_blocked 的变化趋势也可以是一个非常好的判定因 iowait引发的 Load 高的一个参考。

CPU iowait 高

很多人通常都对 CPU iowait 有一个误解,以为 iowait 高是因为这时的 CPU 正在忙于做 IO 操作。其实恰恰相反, iowait 高的时候,CPU 正处于空闲状态,没有任何任务可以运行。只是因为此时存在已经发出的磁盘 IO,因此这时的空闲状态被标识成了 iowait ,而不是 idle。

但此时,如果用 perf probe 命令,我们可以清楚得看到,在 iowait 状态的 CPU,实际上是运行在 pid 为 0 的 idle 线程上:

浅谈Linux高负载的系统化分析浅谈Linux高负载的系统化分析

相关的 idle 线程的循环如何分别对 CPU iowait 和 idle 计数的代码,如下所示:

浅谈Linux高负载的系统化分析浅谈Linux高负载的系统化分析

而 Linux IO 栈和文件系统的代码则会调用 io_schedule,等待磁盘 IO 的完成。这时候,对 CPU 时间被记为 iowait 起关键计数的原子变量 rq->nr_iowait 则会在睡眠前被增加。注意,io_schedule 在被调用前,通常 caller 会先将任务显式地设置成 TASK_UNINTERRUPTIBLE 状态:

浅谈Linux高负载的系统化分析浅谈Linux高负载的系统化分析

CPU idle 高

如前所述,有相当多的内核的阻塞,即 TASK_UNINTERRUPTIBLE 的睡眠,实际上与等待磁盘 IO 无关,如内核中的锁竞争,再如内存直接页回收的睡眠,又如内核中一些代码路径上的主动阻塞,等待资源。

Brendan Gregg 在最近的博客 [Linux Load Averages: Solving the Mystery] (http://www.brendangregg.com/blog/2017-08-08/linux-load-averages.html)中,使用 perf 命令产生的 TASK_UNINTERRUPTIBLE 的睡眠的火焰图,很好的展示了引起 CPU idle 高的多样性。本文不在赘述。

因此,CPU idle 高的分析,实质上就是分析内核的代码路径引起阻塞的主因是什么。通常,我们可以使用 perf inject 对 perf record 记录的上下文切换的事件进行处理,关联出进程从 CPU 切出 (swtich out) 和再次切入 (switch in) 的内核代码路径,生成一个所谓的 Off CPU 火焰图.

当然,类似于锁竞争这样的比较简单的问题,Off CPU 火焰图足以一步定位出问题。但是对于更加复杂的因 D 状态而阻塞的延迟问题,可能 Off CPU 火焰图只能给我们一个调查的起点。

例如,当我们看到,Off CPU 火焰图的主要睡眠时间是因为 epoll_wait 等待引发的。那么,我们继续要排查的应该是网络栈的延迟,即本文大图中的 Net Delay 这部分。

至此,你也许会发现,CPU iowait 和 idle 高的性能分析的实质就是 延迟分析。这就是大图按照内核中资源管理的大方向,将延迟分析细化成了六大延迟分析

  • CPU 延迟
  • 内存延迟
  • 文件系统延迟
  • IO 栈延迟
  • 网络栈延迟
  • 锁及同步原语竞争

任何上述代码路径引发的 TASK_UNINTERRUPTIBLE 的睡眠,都是我们要分析的对象!

以问题结束

限于篇幅,本文很难将其所涉及的细节一一展开,因为读到这里,你也许会发现,原来 Load 高的分析,实际上就是对系统的全面负载分析。怪不得叫 System Load 呢。这也是 Load 分析为什么很难在一篇文章里去全面覆盖。

本文也开启了浅谈 Linux 性能分析系列的第一章。后续我们会推出系列文章,就前文所述的六大延迟分析,一一展开介绍,敬请期待……

关于作者

杨勇 (Oliver Yang),Linux 内核工程师,来自阿里云系统组。曾就职于 EMC,Sun 中国工程研究院,在存储系统和 Solaris 内核开发领域工作。

本文为阿里云原创内容,未经允许不得转载。

显示全文
为您推荐
黄瓜生吃好还是熟吃好 黄瓜怎么样吃更健康一些
黄瓜生吃好还是熟吃好 黄瓜怎么样吃更健康一些

【导读】 黄瓜生吃好还是熟吃好 黄瓜怎么样吃更健康一些,下面是小编为你收集整理的,希望对你有帮助!黄瓜是很多人喜欢吃的美食,夏天可能很多人会生吃黄瓜,那么黄瓜到底是生吃好一些还是煮熟吃好一起呢,和小编一起了解探索一下吧。黄瓜生吃好还是熟吃好其实黄瓜最好不要生吃,很多人知道黄瓜不仅可以减肥,同时还可......

发布时间:2023-06-01 07:01:03

收视大爆,《请叫我总监》低开高走的背后,这帮配角居功至伟
收视大爆,《请叫我总监》低开高走的背后,这帮配角居功至伟

在4月份播出的一众新剧中,《请叫我总监》是这其中让人印象最深刻的一部,甜宠类剧作本就有着广泛的受众群,但却鲜少能够上星,显然《请叫我总监》与以往的甜宠类剧作有很大的不同。这部剧作虽然是将男女主角的感情.........

发布时间:2023-06-01 06:53:18

吴京回应张译华表奖封帝
吴京回应张译华表奖封帝

在5月还有一个电影周,2023海浪电影周在阿那亚再次启航。其中张译和吴京等也出席阿那亚电影周盛典,这是他们自中国观察奖以来第二次联手出席该活动。吴京回应张仪华表奖时说,他真诚地祝贺皇帝作为影帝,网友说.........

发布时间:2023-06-01 06:03:09

烤箱烤大虾多长时间
烤箱烤大虾多长时间

【导读】 烤箱烤大虾多长时间,下面是小编为你收集整理的,希望对你有帮助!烤箱烤大虾需要十分钟。将虾稍微腌制一下,200度,十分钟就好。烤箱停止之后,还有余温,可以再放置五分钟再拿出来。记得最后在虾背上铺上黄油,并且烤前烤箱需要180度预热5分钟。烤虾是一道美味的菜品,制作......

发布时间:2023-06-01 06:01:03

何自强:一位电影解说UP主的电影梦
何自强:一位电影解说UP主的电影梦

如果你喜欢电影,或许你刷到过他的视频——扁豆看电影。这个账号在全网的粉丝超过千万,解说过的电影也接近500部,它背后的主人叫何自强。现在的他已经不仅是个UP主(指在视频网站、论坛等上传视频音频文件的人.........

发布时间:2023-06-01 05:03:11

什么叫动车
什么叫动车

【导读】 什么叫动车,下面是小编为你收集整理的,希望对你有帮助!指轨道交通系统中装有动力装置车辆,包括机车和动力车厢两大类。动车装配有驱动车轮,而与之相对应地无驱动装置车辆为拖车。动车为安装有车轮驱动机器设备铁路车辆,不是动车组。不仅高速列车中有动车,所有火车类型......

发布时间:2023-06-01 05:01:03

洪欣的致歉信不是繁体字
洪欣的致歉信不是繁体字

5月1日清晨,洪欣突然发文自称和张丹峰不再是夫妻关系,张丹峰也回应说“对,不过了”,还附上了笑哭了的表情包,不难看出二人是在冲动下发文的。随后,毕滢也发微博喊话两人吵架归吵架,别拿离婚开玩笑,这么发展.........

发布时间:2023-06-01 04:03:10

南巨龙:南美超巨型恐龙(超过30米长/尾巴灵活)
南巨龙:南美超巨型恐龙(超过30米长/尾巴灵活)

【导读】 南巨龙:南美超巨型恐龙(超过30米长/尾巴灵活),下面是小编为你收集整理的,希望对你有帮助!南巨龙是一种泰坦巨龙类的超巨型恐龙,体长超过30米,诞生于8800万年前的白垩纪末期,最大的特点就是它的尾巴灵活性非常强,比雷龙还要更加敏捷精准,据说能够快速拍中一只巨脉蜻蜓,第一批南巨龙化石是在南美......

发布时间:2023-06-01 04:01:03

高叶礼服开线了
高叶礼服开线了

5月18日是第76届戛纳世界电影节红毯开幕的第二天,今天有不少明星陆续抵达,红毯依旧出现百花齐放的状况。首先是张雨绮,今天是她本次戛纳红毯的第二套造型了。张雨绮一向在造型方面相当大胆,这次穿着白色礼衣.........

发布时间:2023-06-01 03:03:21

贺铸最豪放的词是哪首?
贺铸最豪放的词是哪首?

【导读】 贺铸最豪放的词是哪首?,下面是小编为你收集整理的,希望对你有帮助!贺铸是北宋词人,字方回,又名贺三愁,人称贺梅子,自号庆湖遗老。他出身贵族,是宋太祖贺皇后族孙,后来又娶宗室之女,是贺知章后裔。由于先祖贺知章是庆湖的,所以就自号为庆湖遗老。贺铸擅长写词,词的风格很多样......

发布时间:2023-06-01 03:01:04

父母受扰 王一博方呼吁抵制“追私”
父母受扰 王一博方呼吁抵制“追私”

近日,剧组被闯,父母受扰,王一博方呼吁抵抗“追私”违规行为!之前王一博被曝出一段视频,视频中王一博的手机被安装了监听软件,并且在某酒店房间内,拍照了大量的不雅观视频。该工作曝光之后,引发了众多网友的重.........

发布时间:2023-06-01 02:03:11

三星堆为什么不挖了 挖掘保护技术不够成熟(现今技术突破)
三星堆为什么不挖了 挖掘保护技术不够成熟(现今技术突破)

【导读】 三星堆为什么不挖了 挖掘保护技术不够成熟(现今技术突破),下面是小编为你收集整理的,希望对你有帮助!三星堆自1929年被发现,1934年时华西大学博物馆组成的考古队首次小范围发掘了三星堆遗址,此后在八十多年当中陆陆续续进行了十多次挖掘。明明三星堆可以进行深入研究,毕竟它带给我们如此多的谜团,挖掘的越......

发布时间:2023-06-01 02:01:03