浅谈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-10-22 08:01:05

燃气和天然气的区别是什么
燃气和天然气的区别是什么

【导读】 燃气和天然气的区别是什么,下面是小编为你收集整理的,希望对你有帮助!天然气的压力是2800帕,管道煤气(燃气)的压力是2000帕。管道煤气灶可以改成天然气灶。把灶具的喷嘴和火盖更改一下即可。燃气的出气口很小,天然气的要稍大些,其中喷嘴就是在开关后面的出气喷嘴,在灶底下......

发布时间:2023-10-22 07:01:04

oppoa72电池多少毫安
oppoa72电池多少毫安

【导读】 oppoa72电池多少毫安,下面是小编为你收集整理的,希望对你有帮助!对于oppoa72电池多少毫安的这个问题,我们下面就来大概了解下。oppoa72电池容量为4040毫安。OPPOA72的正面采用了打孔屏,背部采用了左上角的浴霸三摄,采用侧边指纹解锁它采用6.5英寸的......

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

河童是什么生物,水神的使者/吃人的水虎怪(图片)
河童是什么生物,水神的使者/吃人的水虎怪(图片)

【导读】 河童是什么生物,水神的使者/吃人的水虎怪(图片),下面是小编为你收集整理的,希望对你有帮助!在我国和日本的民间有很多关于河童的传说,有人说它们是守护河流的河神,也有人说它们是狡猾嗜血的怪物。没有人具体知道河童是什么生物,也没有人拍摄到河童图片,它还有一个名称叫做水虎。日本会将河童当作神灵膜拜......

发布时间:2023-10-22 05:01:06

三星手机重置后如何恢复原来数据
三星手机重置后如何恢复原来数据

【导读】 三星手机重置后如何恢复原来数据,下面是小编为你收集整理的,希望对你有帮助!1、待完成三星手机恢复出厂设置操作后,重启手机,等出现“欢迎”界面后,选择“简体中文”,点击“下一步”按钮。2、接下来需要连接无线WiFi网络,用于实现手机数据的恢复操作。3、在“日期和时间”界面中,......

发布时间:2023-10-22 04:01:04

在郑州哪里看夜景最好
在郑州哪里看夜景最好

【导读】 在郑州哪里看夜景最好,下面是小编为你收集整理的,希望对你有帮助!1、郑州CBD的标志建筑物玉米楼,在深沉的夜晚,变换着彩色的光芒,这光芒既不是微光,也不刺眼,在夜空下,形成一道亮丽的风景线。大金蛋的质感和CBD的风采截然一体,它深沉的变换着霓虹灯,给夜晚增添色彩。......

发布时间:2023-10-22 03:37:00

主板诊断卡显示a2的意思是什么
主板诊断卡显示a2的意思是什么

【导读】 主板诊断卡显示a2的意思是什么,下面是小编为你收集整理的,希望对你有帮助!主板诊断卡显示a2是什么意思主板诊断卡显示A2的意思是:高速缓冲存储器测试结束,即将显示任何软错误。解决方法:检查键盘锁。其它相关代码的意思:A0:发出键盘识别命令,即将使键盘识别标志复原。解决方法:......

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

白骨精到底是谁的白骨?未说明(前世一定是位美女)
白骨精到底是谁的白骨?未说明(前世一定是位美女)

【导读】 白骨精到底是谁的白骨?未说明(前世一定是位美女),下面是小编为你收集整理的,希望对你有帮助!我们在观看《西游记》的时候难免发出疑问,出现的这么多妖怪中哪个是最弱的?哪个又是最强的?可以是武力的对比,也可以是背景的比较,但是有个公认的事情就是白骨精是最弱的,毕竟白骨精只是一摊白骨,很难有厉害的......

发布时间:2023-10-22 02:01:05

雨打梨花深闭门和千树万树梨花开哪一句是实指?
雨打梨花深闭门和千树万树梨花开哪一句是实指?

【导读】 雨打梨花深闭门和千树万树梨花开哪一句是实指?,下面是小编为你收集整理的,希望对你有帮助!说到梨花其实还是有很多人知道的,古代人用诗句写梨花那是写了很多很多的,最近很多人都在问这个“雨打梨花深闭门”和“千树万树梨花开”都是写的梨花了,那么哪一句是实指梨花呢?这个问题还是有很多人问了,下面一......

发布时间:2023-10-22 01:01:05

诗文燕燕讲了什么?是爱情还是友情?
诗文燕燕讲了什么?是爱情还是友情?

【导读】 诗文燕燕讲了什么?是爱情还是友情?,下面是小编为你收集整理的,希望对你有帮助!每个人自出生以来就会有七情六欲,如果一个活生生的人没有喜、怒、忧、思、悲、恐、惊(七情),也没有眼、耳、鼻、舌、身、意的生理能力和需求,那他活着有何意义呢?爱情作为人类感情中最神秘最难言滋味的一种情感......

发布时间:2023-10-22 00:01:06

全球三大生态系统:湿地被称为地球之肾(海洋生态系统最大)
全球三大生态系统:湿地被称为地球之肾(海洋生态系统最大)

【导读】 全球三大生态系统:湿地被称为地球之肾(海洋生态系统最大),下面是小编为你收集整理的,希望对你有帮助!全球三大生态系统分别是湿地、海洋和森林,这三大生态系统在自然界中都占据一定的地位,并且分别有所处的空间。虽然三大生态系统在地理位置上连接并不紧密,但是在整个自然环境当中都发挥着不可磨灭的作用,并且能相......

发布时间:2023-10-21 23:01:06

什么节吃月饼
什么节吃月饼

【导读】 什么节吃月饼,下面是小编为你收集整理的,希望对你有帮助!中秋节。中秋节自古便有祭月、赏月、拜月、吃月饼、赏桂花、饮桂花酒等习俗,流传至今,经久不息。中秋节以月之圆兆人之团圆,为寄托思念故乡,思念亲人之情,祈盼丰收、幸福,成为丰富多彩、弥足珍贵的文化遗产。中......

发布时间:2023-10-21 22:01:05