Linux之《荒岛余生》(二)CPU篇

舒适提示,动图已压缩,流量党放心查看。CPU方面内容很少,咱们顺便学点命令。本篇是《荒岛余生》系列第二篇,垂直观测CPU。其他参见:java

Linux之《荒岛余生》(一)准备篇git

如何作一个CPU

cpu是芯片的一种,咱们以汉芯为例,看一下制做七步曲。github

  • 提纯精度11个9的硅片(99.999999999%)
  • 生成晶圆
  • 使用光刻机加工晶圆
  • 使用刻蚀机沟槽
  • 完成P型半导体制做
  • 使用200号的粗砂纸抹掉原标志
  • 涂上新标志 bingo,完工!

虽然CPU很小,但生产它的设备可不简单。以下图,就是一台重十几吨,占地上百平米,全世界都当宝贝的光刻机! centos

你我就这样饱受科技的恩泽,有时间探讨在中央处理器上发生的故事了。

找到占用CPU最高的线程

接下来看一个实际的例子。公司有点穷,因此机器上混合部署了多个java应用,忽然有一天,CPU炸了,咱们要找到是谁引发的。这个谁不是进程,而是线程,离真相最近的那个。安全

传统作法

一般的作法是:bash

  • 在命令行输入top,而后shift+p查看占用CPU最高的进程,记下进程号
  • 在命令行输入top -Hp 进程号,查看占用CPU最高的线程
  • 使用printf 0x%x 线程号,获得其16进制线程号
  • 使用jstack 进程号获得java执行栈,而后grep16进制找到相应的信息 录个屏先

拔萝卜带泥

但我想经过另一种方式来实现这个功能(最多样化),顺便学几个其余经常使用的命令。服务器

ps -eo %cpu,pid |sort -n -k1 -r | head -n 1 |  awk '{print $2}' |xargs  top -b -n1 -Hp | grep COMMAND -A1 | tail -n 1 | awk '{print $1}' | xargs printf 0x%x
复制代码

这一行Shell的意思是,找到使用CPU最高的进程之使用CPU最高的线程的16进制号。 这么长的命令,是否是晕了?别怕,咱们一点点来。一般状况下,练习熟练了命令中出现的这几个,就可以应对50%的经常使用工做了。Come on,上图。 15423589014500.jpg 微信

接下来,试着写一下脚本吧。

有哪些查看CPU的命令

top

其实从上面命令就能够瞧出来,top和ps的命令是互通的,只不过表现形式不一样,咱们直接拿top来讲。按数字1就能够显示每核CPU的使用状况。基本上都是些单词的缩写,看几遍就忘不掉了。好比 :网络

us ==> user CPU time
复制代码

先记住这些判断准则,咱们在示例中再聊:

  • 若是load超过了cpu核数,则负载太高
  • 若是wa太高,可初步判断I/O有问题
  • sy,si,hi,st,任何一个超过5%,都有问题
  • 进程状态长时处于D、Z、T状态,提升注意度
  • cpu不均衡,判断亲和性和优先级问题

vmstat

vmstat 以另外一种形式来展现一些信息。如图: socket

除了关注相似top的一些指标,还有:

  • b 置于等待队列(等待资源、等待输入/输出)的内核线程数目。数字过大则cpu太忙。
  • cs 若是频繁的进行上下文切换,则考虑是不是线程数开的过多
  • si/so 显示了交换分区的现状,有时候会形成cpu问题,一并关注

sar

是目前Linux上最为全面的系统性能分析工具之一,但可能没有预装。在centos上使用如下命令便可安装。

yum install sysstat -y
复制代码

sar主要的好处是能够看到历史,显示友好,能够对结果进行二次处理。sar还有图形化工具,执行sar -A便可得到全部数据。

https://github.com/vlsi/ksar
复制代码

针对于CPU方面,咱们关注:

  • sar -u 默认
  • sar -P ALL 每颗cpu的使用状态信息
  • sar -q cpu队列的长度,runq-sz>cpu count就代表有瓶颈了
  • sar -w 每秒上下文交换 能够瞧见,关注的也就那几个点而已。
    ##mpstat 还有pidstat,包括彩色的dstat,功能都差很少, 用熟一个就ok了。

数据从何而来

那么数据从何而来? /proc目录是一个虚拟目录,存储的是当前内核的一系列特殊文件,你不只能查看一些状态,甚至能修改一些值来改变系统的行为。

好比top的load (使用uptime命令获得一样的结果)。读取的就是 /proc/loadavg 文件 而每核cpu的信息,读取 /proc/stat文件

这些命令,是对/proc目录中一系列信息的解析和友好的展现,这些值,Linux内核都算好了躺在那呢。

(图片来源网络) 建立这个目录的人真是天才!

几个例子

此文归属微信公众号「小姐姐味道」,转载注明出处。CPU太高是表象。除了系统确实负载已经到了极限,其余的,都是由其余缘由引发的,好比I/O;好比设备。这些咱们放在其余章节进行讨论。

GC引发的CPU太高

接着咱们最开始的例子来。经过查看jstack找到相应的16进制进程,结果发现是GC线程。

"VM Thread" prio=10 tid=0x00007f06d8089000 nid=0x58c7 runnable 
 
"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f06d801b800 nid=0x58d7 runnable 
复制代码

这种状况,通常都是JVM内存不够用了,疯狂GC,多是socket/线程忘了关闭了,也多是大对象没有回收。这种状况只能经过重启来解决了,记得重启以前,使用jmap dump一下堆栈哦。固然,你可能会获得jdk版本的问题。

st%占比太高

st太高通常是物理CPU资源不足所致,也就是只发生在虚拟机上。 若是你买的虚拟机st一直很高,那你的服务提供商可能在超卖,挤占你的资源。不信双11的时候看下你的虚拟机?

网卡致使单cpu太高

业务方几台kafka,cpu使用处于正常水平,才10%左右,但有一核cpu,负载特别的高,si奇高。

mpstat -I SUM -P ALL 查看cpu使用状况,cpu0的中断确实比较多。

20:15:18  CPU    intr/s  
20:15:23  all  34234.20  
20:15:23    0   9566.20  
20:15:23    1      0.00
复制代码

网卡须要cpu服务时,都会抛出一个中断,中断告诉cpu发生了什么事情,cpu就要中止目前的工做来处理这个中断。其实,默认全部的中断处理都集中在cpu0 上,致使服务器负载太高。cpu0 成了瓶颈,而其余cpu却还闲着。 ➊ 解决方式1:使用CPU亲和性功能,kafka略过网卡所使用的CPU ➋ 解决方式2: 更换网卡 ➌ 一般修改的方式仍是有些复杂了,好比,修改/proc/irq/{seq}/smp_affinity 咱们能够直接安装irqbalance,而后执行就能够了。

yum install irqbalance -y 
service irqbalance start
复制代码

cpu使用率低,但负载高

cpu id%高,也就是空闲,好比90%。但 load average很是高,好比4核达到10。

分析:load average高,说明其任务已经排队,许多任务正在等待。出现此种状况,可能存在大量不可中断的进程。

使用top或者ps能够看到进程相应的状态。

ps aux 
复制代码

一种状况就是有大量进程处于D的状态,也就是不可中断的睡眠状态,因此极可能是硬件问题。 详见 《Linux进程状态(ps stat)之R、S、D、T、Z、X》

高频问题:load

load表明的是啥

说句白话,load表明的就是你目前系统进程的排队状况。

如图,以单核为例,将CPU资源抽象成一条单行马路。则会发生三种状况:

  • 马路上的车只有4辆,车辆畅通无阻,load大约是0.5
  • 马路上的车有8辆,正好能首尾相接安全经过,此时load大约为1
  • 马路上的车有12辆,除了在马路上的8辆车,还有4辆交集的等在外面,也就是超出容量了,须要排队。此时load大约为1.5

load为1表明的是啥

针对这个问题,误解仍是比较多的。不少同窗认为,load达到1,系统就到了瓶颈,这不彻底正确。 load的值和cpu核数息息相关:

  • 单核的cpu达到100%,load约1
  • 双核的cpu都达到100%,load约2
  • 四核的cpu都达到100%,load约为4

因此,对于一个load到了10,倒是16核的机器,你的系统还远没有达到负载极限。

结尾

本篇实际的排查过程较少,由于cpu问题通常都伴随着其余问题。但文中出现的这些命令可不简单,尤为是它们丰富的参数。这些参数,执行一下man,就能够一睹芳容了。好比:

man top
复制代码

固然,也能够这样~

no woman、 no love,果真是一个只有男人的世界!
相关文章
相关标签/搜索