舒适提示,动图已压缩,流量党放心查看。CPU方面内容很少,咱们顺便学点命令。本篇是《荒岛余生》系列第二篇,垂直观测CPU。其他参见:java
cpu是芯片的一种,咱们以汉芯为例,看一下制做七步曲。github
虽然CPU很小,但生产它的设备可不简单。以下图,就是一台重十几吨,占地上百平米,全世界都当宝贝的光刻机! centos
接下来看一个实际的例子。公司有点穷,因此机器上混合部署了多个java应用,忽然有一天,CPU炸了,咱们要找到是谁引发的。这个谁不是进程,而是线程,离真相最近的那个。安全
一般的作法是:bash
top
,而后shift+p
查看占用CPU最高的进程,记下进程号top -Hp 进程号
,查看占用CPU最高的线程printf 0x%x 线程号
,获得其16进制线程号jstack 进程号
获得java执行栈,而后grep
16进制找到相应的信息 录个屏先
但我想经过另一种方式来实现这个功能(最多样化),顺便学几个其余经常使用的命令。服务器
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 微信
其实从上面命令就能够瞧出来,top和ps的命令是互通的,只不过表现形式不一样,咱们直接拿top来讲。按数字1就能够显示每核CPU的使用状况。基本上都是些单词的缩写,看几遍就忘不掉了。好比 :网络
us ==> user CPU time
复制代码
vmstat 以另外一种形式来展现一些信息。如图: socket
b
置于等待队列(等待资源、等待输入/输出)的内核线程数目。数字过大则cpu太忙。cs
若是频繁的进行上下文切换,则考虑是不是线程数开的过多si
/so
显示了交换分区的现状,有时候会形成cpu问题,一并关注是目前Linux上最为全面的系统性能分析工具之一,但可能没有预装。在centos上使用如下命令便可安装。
yum install sysstat -y
复制代码
sar主要的好处是能够看到历史,显示友好,能够对结果进行二次处理。sar还有图形化工具,执行sar -A
便可得到全部数据。
https://github.com/vlsi/ksar
复制代码
针对于CPU方面,咱们关注:
pidstat
,包括彩色的dstat
,功能都差很少, 用熟一个就ok了。那么数据从何而来? /proc
目录是一个虚拟目录,存储的是当前内核的一系列特殊文件,你不只能查看一些状态,甚至能修改一些值来改变系统的行为。
好比top的load (使用uptime命令获得一样的结果)。读取的就是 /proc/loadavg
文件 而每核cpu的信息,读取 /proc/stat
文件
这些命令,是对/proc目录中一系列信息的解析和友好的展现,这些值,Linux内核都算好了躺在那呢。
此文归属微信公众号「小姐姐味道」,转载注明出处。CPU太高是表象。除了系统确实负载已经到了极限,其余的,都是由其余缘由引发的,好比I/O;好比设备。这些咱们放在其余章节进行讨论。
接着咱们最开始的例子来。经过查看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太高通常是物理CPU资源不足所致,也就是只发生在虚拟机上。 若是你买的虚拟机st一直很高,那你的服务提供商可能在超卖,挤占你的资源。不信双11的时候看下你的虚拟机?
业务方几台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 id%高,也就是空闲,好比90%。但 load average很是高,好比4核达到10。
分析:load average高,说明其任务已经排队,许多任务正在等待。出现此种状况,可能存在大量不可中断的进程。
使用top或者ps能够看到进程相应的状态。
ps aux
复制代码
说句白话,load表明的就是你目前系统进程的排队状况。
针对这个问题,误解仍是比较多的。不少同窗认为,load达到1,系统就到了瓶颈,这不彻底正确。 load的值和cpu核数息息相关:
因此,对于一个load到了10,倒是16核的机器,你的系统还远没有达到负载极限。
本篇实际的排查过程较少,由于cpu问题通常都伴随着其余问题。但文中出现的这些命令可不简单,尤为是它们丰富的参数。这些参数,执行一下man,就能够一睹芳容了。好比:
man top
复制代码
固然,也能够这样~