当前位置: 首页 > Linux

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

时间:2023-04-06 19:51:36 Linux

温馨提示,动画已经压缩,流量党可以放心观看。关于CPU的内容不多,顺便学习一些命令吧。本文是《荒岛余生》系列的第二篇,垂直观察CPU。其余参见:Linux《荒岛余生》(一)准备工作如何制作CPUCPU是一种芯片。下面我们就以韩信为例,看看它是如何分七步制作的。Siliconwafers(99.999999999%)withapurificationaccuracyof119999999999999999999999999999999999999999999999999999999999999999ininin100000000000000000000000000000000000000000000000000000000000000000000000000000000000000!AlthoughtheCPUissmall,theequipmenttoproduceitisnotsimple.如下图所示,是一台重达十余吨,占地面积达数百平方米的光刻机,在全世界都被视为珍宝!就这样,你我都得到了科技的加持,才有时间讨论发生在中央处理器上的故事。查找CPU使用率最高的线程让我们看一个实际的例子。公司有点穷,所以多个java应用混合部署在机器上。突然有一天,CPU爆炸了,我们需要找出是谁造成的。这个人不是进程,而是线程,是最接近真相的人。传统的方法是:在命令行输入top,然后shift+p查看CPU使用率最高的进程,记下进程号,在命令行输入top-Hp进程号,查看最高的线程CPU使用率使用printf0x%x线程号,获取其16进制线程号,使用jstack进程号获取java执行栈,然后grep十六进制查找对应信息,先录个屏,不过我想实现这个另一种方式(最多样化)的功能,顺便学习其他几个常用的命令。ps-eo%cpu,pid|排序-n-k1-r|头-n1|awk'{print$2}'|xargstop-b-n1-Hp|grep命令-A1|尾-n1|awk'{print$1}'|xargsprintf0x%x这行Shell的意思是找CPU占用率最高的进程的CPU占用率最高的线程的十六进制数。这么长的命令你是不是头晕了?不要害怕,我们一点一点地走。一般情况下,如果你练习并熟练掌握这些命令,你将能够应对50%的常见任务。来吧,上面。15423589014500.jpg接下来,试着写一个脚本。检查CPU的最常用命令是什么?其实从上面的命令就可以看出。top和ps的命令是可以互通的,只是表达方式不同。我们以top为例。按数字1显示每个内核的CPU使用率。基本上都是一些单词的缩写,多看几遍就忘不了了。例如:us==>userCPUtime先记住这些判断标准,例子里说:负载超过cpu核数,负载过高如果wa过高,可以初步判断有aproblemI/Osy,si,hi,st任意一个超过5%,存在进程状态长期处于D,Z,T状态的问题,引起关注。cpu不平衡,判断affinity和priority的问题换一种形式表现出来。vmstatvmstat一些信息。如图:除了关注top等一些指标外,还有:b放入等待队列(等待资源,等待输入/输出)的内核线程数。如果数字太大,则CPU太忙。cs如果频繁切换上下文,考虑是不是线程太多了。si/so显示交换分区的当前状态,有时会导致cpu问题。关注一下sar,它是目前Linux上最全面的系统性能分析工具。一个,但可能不会预装。在centos上使用如下命令安装。yuminstallsysstat-ysar的主要优点是可以看到历史,友好的显示,并对结果进行二次处理。sar还有一个图形工具,执行sar-A就可以得到所有的数据。https://github.com/vlsi/ksar对于CPU,我们关注:sar-udefaultsar-PALL每个cpu的使用状态信息sar-qcpu队列的长度,runq-sz>cpucount表示存在瓶颈。sar-wcontextexchangepersecond可以看到,重点只放在那几个点上。mpstat和pidstat,包括coloreddstat,功能几乎一样,熟悉了就ok了。数据从何而来那么数据从何而来呢?/proc目录是一个虚拟目录,存放了当前内核的一系列特殊文件。你不仅可以查看一些状态,甚至可以修改一些值来改变系统的行为。例如top的负载(使用uptime命令得到同样的结果)。读取的是/proc/loadavg文件和各个核心cpu的信息。读取/proc/stat文件的命令是对/proc目录下一系列信息的分析和友好展示。这些值对于我刚放在那里的Linux内核来说已经算不错了。(图片来源网络)创建这个目录的人真是个天才!几个例子。本文属于微信公众号“小姐姐的味道”,转载出处。高CPU是症状。除了系统确实达到极限外,其他都是其他原因造成的,比如I/O;比如设备。我们在其他章节中讨论这些。GC导致的高CPU继续我们的第一个例子。通过查看jstack找到对应的16进制进程,原来是GC线程。"VMThread"prio=10tid=0x00007f06d8089000nid=0x58c7runnable"GCtaskthread#0(ParallelGC)"prio=10tid=0x00007f06d801b800nid=0x58d7runnable这种情况下,JVM内存不够,疯狂GC,可能是套接字/线程忘记关闭,或者大对象没有被回收。这种情况只能通过重启来解决。请记住在重新启动之前使用jmap转储堆栈。当然,你可能会遇到jdk版本问题。st%的比例太高了。st过高一般是物理CPU资源不足导致的,也就是只出现在虚拟机上。如果你买的虚拟机st一直很高,那么你的服务商可能超卖压榨你的资源。不信双11,看看你的虚拟机?网卡导致单CPU过高。业务端几个kafka,CPU占用率正常,只有10%左右,但是有一个核心CPU,负载特别高,si特别高。mpstat-ISUM-PALL查看cpu使用情况,cpu0确实有很多中断。20:15:18CPUintr/s20:15:23all34234.2020:15:2309566.2020:15:2310.00当网卡需要cpu服务时,会抛出一个中断,告诉cpu发生了什么,cpu会停止当前的工作来处理这个中断。实际上,默认情况下,所有的中断处理都集中在cpu0上,导致服务器负载很高。cpu0成为瓶颈,而其他cpu处于空闲状态。?方案一:使用CPU亲和函数,kafka跳过网卡使用的CPU?方案二:更换网卡?通常修改方法还是有点复杂,比如修改/proc/irq/{seq}/smp_affinity我们可以直接安装irqbalance,然后执行。yuminstallirqbalance-yserviceirqbalancestartcpu使用率低,但是负载高,cpuid%高,也就是idle,比如90%。但是loadaverage很高,比如4核达到10。分析:loadaverage很高,说明它的任务已经排队了,有很多任务在等待。发生这种情况时,可能会出现大量不可中断的进程。使用top或者ps查看进程对应的状态。psaux一种情况是大量进程处于D状态,也就是不可中断的休眠状态,所以很有可能是硬件问题。详见《Linux进程状态(ps stat)之R、S、D、T、Z、X》高频问题:load是什么意思?说白了,load就是你当前系统进程的排队状态。如图,以单核为例,CPU资源被抽象成一条单向街道。会出现三种情况:路上只有4辆车,车辆畅通无阻,载重0.5左右。路上有8辆车,可以安全地首尾相接。此时负载大约为1,路上有8辆车。12辆车,除了路上的8辆车外,还有4个路口在外面等,也就是超载,需要排队。此时负载约为1.5。1的负载代表什么?关于这个问题,还有很多误解。很多同学认为当负载达到1时,系统就会达到瓶颈,这是不完全正确的。负载的大小与CPU核心数密切相关:单核CPU达到100%,双核CPU约1个负载达到100%,四核CPU约2个负载达到100%,负载大约是4。因此,负载为10,但它是一台16核机器,你的系统远远没有达到负载限制。文末,实际排查过程比较少,因为cpu问题一般都会伴随其他问题。但是本文中出现的这些命令并不简单,尤其是其丰富的参数。这些参数,executeman,就可以看到美感了。比如:mantop当然也可以这样~没有女人就没有爱情,真的是男人的世界!