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

为什么80%的码农都做不了架构师?>>>   hot3.png

640?wx_fmt=gif&tp=webp&wxfrom=5&wx_lazy=1

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

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

如何做一个CPU

cpu是芯片的一种,我们以汉芯为例,看一下制作七步曲。
➊ 提纯精度11个9的硅片(99.999999999%)
➋ 生成晶圆
➌ 使用光刻机加工晶圆
➍ 使用刻蚀机沟槽
➎ 完成P型半导体制作
➏ 使用200号的粗砂纸抹掉原标志
➐ 涂上新标志
bingo,完工!

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

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

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

找到占用CPU最高的线程

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

传统做法

通常的做法是:
➊ 在命令行输入top,然后shift+p查看占用CPU最高的进程,记下进程号
➋ 在命令行输入top -Hp 进程号,查看占用CPU最高的线程
➌ 使用printf 0x%x 线程号,得到其16进制线程号
➍ 使用jstack 进程号得到java执行栈,然后grep16进制找到相应的信息
录个屏先

640?wx_fmt=gif&tp=webp&wxfrom=5&wx_lazy=1

拔萝卜带泥

但我想通过另外一种方式来实现这个功能(最多样化),顺便学几个其他常用的命令。

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,上图。

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

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

有哪些查看CPU的命令

top

其实从上面命令就可以瞧出来,top和ps的命令是互通的,只不过表现形式不同,我们直接拿top来说。按数字1就可以显示每核CPU的使用情况。基本上都是些单词的缩写,看几遍就忘不掉了。比如 :

us ==> user CPU time

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

先记住这些判断准则,我们在示例中再聊:
➊ 如果load超过了cpu核数,则负载过高
➋ 如果wa过高,可初步判断I/O有问题
➌ sy,si,hi,st,任何一个超过5%,都有问题
➍ 进程状态长时处于D、Z、T状态,提高注意度
➎ cpu不均衡,判断亲和性和优先级问题

vmstat

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

640?wx_fmt=gif&tp=webp&wxfrom=5&wx_lazy=1

除了关注类似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内核都算好了躺在那呢。

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

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

几个例子

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

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

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

高频问题:load

load代表的是啥

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

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

如图,以单核为例,将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

当然,也可以这样~

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

no woman、 no love,果然是一个只有男人的世界!

转载于:https://my.oschina.net/mskk/blog/3010793

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PTA 06-图2 Saving James Bond - Easy Version (25分)

题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/672 5-10 Saving James Bond - Easy Version (25分) This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the worlds most famous spy, was captured by…

Ubuntu16.04上安装kitti2bag

kitti2bag是一个可以将kitti数据集转换为bag文件的工具,可以直接通过pip进行安装。由于kitti2bag中使用到ros,所以安装时你使用的python版本应该是2.7的因为ros只有在Python2.7时才能正常工作。比如说我,我安装了conda,在conda中安…

Nginx之windows下搭建

去nginx.org下载nginx 以nginx-1.8.1为例解压到D盘nginx-1.8.1目录 假设NGINX_HOME为D:\nginx-1.8.1 3种启动途径: 一、双击nginx.exe图标,可见黑窗口一闪而过,启动完毕。 二、命令行到nginx目录,输入nginx启动。(注&a…

单片机错误笔记

记录下使用单片机过程中的一些错误,便于以后查询: 单片机型号:STC15F2K60S2 晶振:18.432 报错代码: *** WARNING L1: UNRESOLVED EXTERNAL SYMBOLSYMBOL: REC_DAT1MODULE: .\Objects\usart.obj (USART) …

软件开发记录03

今天我完成了软件设置&#xff0c;预算列表&#xff0c;添加预算的页面布局。 &#xff08;1&#xff09;软件设置 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"…

395. Longest Substring with At Least K Repeating Characters

题目要求 Find the length of the longest substring T of a given string (consists of lowercase letters only) such that every character in T appears no less than k times.Example 1:Input: s "aaabb", k 3Output: 3The longest substring is "aaa&qu…

UICollectionView 具体解说学习

UICollectionView 和UITableView非常像,是APPLE公司在iOS 6后推出的用于处理图片这类UITableView 布局困难的控件,和UITableView 一样,它也有自己的Datasource和delegate。以下具体说下像这种方式的效果. 首先来看看UICollectionView 的DataSource。protocol UICollectionView…

70.文件异常

ferror检测文件异常perror提示文件错误信息clearerr清除异常,让文件指针回到开头完整代码 1 #define _CRT_SECURE_NO_WARNINGS2 #include<stdio.h>3 #include<stdlib.h>4 //perror提示文件错误信息5 //ferror检测文件异常6 //clearerr清除异常,让文件指针回到开头…

ServiceNow 中关于UI Action 在portal端的使用

在 portal端是可以使用Form和UI Action的&#xff0c;例如&#xff1a;var data.f $sp.getForm()&#xff1b;//需要添加上相应参数在开箱组件Form的Server script中就有如下代码&#xff1a;data.f $sp.getForm(data.table, data.sys_id, data.query, data.view);data.f对象中…

特殊密码锁

总时间限制: 1000ms内存限制: 1024kB描述有一种特殊的二进制密码锁&#xff0c;由n个相连的按钮组成&#xff08;n<30&#xff09;&#xff0c;按钮有凹/凸两种状态&#xff0c;用手按按钮会改变其状态。 然而让人头疼的是&#xff0c;当你按一个按钮时&#xff0c;跟它相邻…

系统安全题目(二)

1、在 php mysql apache 架构的web服务中输入GET参数 index.php?a1&a2&a3 服务器端脚本 index.php 中$GET[a] 的值是&#xff1f;正确答案: C A 1B 2C 3D 1,2,3 2、以下哪些不是CSRF漏洞的防御方案&#xff1f;正确答案: D A 检测HTTPrefererB 使用随机tokenC 使用验…

转发和重定向的区别?

实际发生位置不同&#xff0c;地址栏不同 转发是发生在服务器的 转发是由服务器进行跳转的&#xff0c;细心的朋友会发现&#xff0c;在转发的时候&#xff0c;浏览器的地址栏是没有发生变化的&#xff0c;在我访问Servlet111的时候&#xff0c;即使跳转到了Servlet222的页面&a…

BZOJ3795 : 魏总刷DP

对于HARD&#xff1a; 需要满足$ku[i]\times k\leq Tlate[i]$。 对于EASY&#xff1a; 需要满足$ku[i]\times k\leq T-rest[i]$。 故对于HARD&#xff0c;设$a[i]-late[i]$&#xff0c;对于EASY&#xff0c;设$a[i]rest[i]$&#xff0c;并将所有题目的$u[i]$都$1$。 那么需要满…

信息学竞赛相关优秀文章合集[持续更新]

线段树详解 &#xff08;原理&#xff0c;实现与应用&#xff09;可持久化线段树 简介 运用伸展树解决数列维护问题.pdfSplay 学习笔记&#xff08;一&#xff09;Splay 学习笔记&#xff08;二&#xff09;Splay 学习笔记&#xff08;三&#xff09; 请要相信我&#xff0c;30…

ceres-solver学习笔记

前一段时间总有一个想法&#xff0c;那就是&#xff0c;我只直到视觉slam是远远不够的&#xff0c;激光slam仍然是一个比较稳妥的技术&#xff0c;好落地&#xff0c;应用广泛&#xff0c;我想着&#xff0c;如果我学会了会大大增加自己的核心竞争力&#xff0c;所以我抽时间开…

几款常见的视频格式转换器

在短视频占半壁江山的时候&#xff0c;关于体积、格式等成了困扰人们的因素&#xff0c;视频太大不利于传播&#xff0c;比如微信里就限制了传输的大小不得超过20M&#xff0c;所以其实说起来工作上QQ的性能远超微信。今天这里小编给大家总结几款常用的视频转换器&#xff0c;希…

PHP Shell生成工具Weevely

PHP Shell生成工具WeevelyWeevely是一款模拟Telnet连接的PHP Shell工具。它不提供网页形式的接口&#xff0c;而是提供一个命令形式的终端。渗透测试人员首先使用该工具生成对应的PHP网页。然后&#xff0c;将该网页上传到目标Web服务器上。渗透人员就可以在终端连接该页面&…

ceres学习之平面拟合

背景&#xff1a;orb-slam2最终保存的轨迹形成的平面是一个倾斜的&#xff0c;这个与相机初始化位置有关&#xff0c;但是有些时候&#xff0c;我们需要的是一个2d的轨迹的试图&#xff0c;直接将轨迹向某一个平面投影的话。 得到的估计是失真的&#xff0c;所以我们需要对轨迹…

二维树状数组模板(区间修改+区间查询)

二维树状数组模板(区间修改区间查询) 例题&#xff1a;JOIOI上帝造题的七分钟 一共两种操作&#xff1a; \(L\ x_1\ y_1\ x_2\ y_2\ d\)&#xff1a;把\((x_1,y_1)\)&#xff0c;\((x_2,y_2)\)这个矩形内所有元素加\(d\)。\(k\ x_1\ y_1\ x_2\ y_2\)&#xff1a;查询\((x_1,y_1…

egg(110,111,112)--egg之微信支付

微信支付前的准备工作 准备工作 准备工作&#xff1a;个体工商户、企业、政府及事业单位。需要获取内容 appid&#xff1a;应用 APPID&#xff08;必须配置&#xff0c;开户邮件中可查看&#xff09;MCHID&#xff1a;微信支付商户号&#xff08;必须配置&#xff0c;开户邮件中…