从阿里大促中,我发现的CPU与Load异常排查思路

这里面的所有值都是从系统启动时间到当前时间的一个值。因此,对于cpu的计算的做法是,采样两个足够短的时间t1、t2:

  •  将t1的所有cpu使用情况求和,得到s1;
  •  将t2的所有cpu使用情况求和,得到s2;
  •  s2 – s1得到这个时间间隔内的所有时间totalCpuTime;
  •  第一次的空闲idle1 – 第二次的空闲idle2,获取采样时间内的空闲时间;
  •  cpu使用率 = 100 * (totalCpuTime – idle) / totalCpuTime。

其他时间例如us、sy、ni都是类似的计算方式,总结起来说,cpu这个值反应的是某个采样时间内的cpu使用情况。因此有时候cpu很高,但是打印线程堆栈出来发现高cpu的线程在查询数据库等待中,不要觉得奇怪,因为cpu统计的是采样时间内的数据。

假设top观察某段时间用户空间cpu一直很高,那么意味着这段时间用户的程序一直在占据着cpu做事情。

对load的理解

关于load的含义,其实有些文章把它跟行车过桥联系在一起是比较恰当和好理解的:

一个单核的处理器可以形象得比喻成一条单车道,车辆依次行驶在这条单车道上,前车驶过之后后车才可以行驶。

如果前面没有车辆,那么你顺利通过;如果车辆众多,那么你需要等待前车通过之后才可以通过。

因此,需要些特定的代号表示目前的车流情况,例如:

  •  等于0.00,表示目前桥面上没有任何的车流。实际上这种情况0.00和1.00之间是相同的,总而言之很通畅,过往的车辆可以丝毫不用等待的通过;
  •  等于1.00,表示刚好是在这座桥的承受范围内。这种情况不算糟糕,只是车流会有些堵,不过这种情况可能会造成交通越来越慢;
  •  大于1.00,那么说明这座桥已经超出负荷,交通严重的拥堵。那么情况有多糟糕? 例如2.00的情况说明车流已经超出了桥所能承受的一倍,那么将有多余过桥一倍的车辆正在焦急的等待。

但是比喻终归是比喻,从比喻中我们了解了,load表示的是系统的一个能力,但是我们却不知道什么样的任务会被归到load的计算中。关于具体怎么样的任务会被归到load的计算中,可以使用man uptime命令看一下Linux对于load的解释:

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章