关于linux CPU负载

由于自己是个小白,所以综合了网上其他的文章,以便后面复习查看

查看物理CPU个数

cat /proc/cpuinfo| grep “physical id”| sort| uniq| wc -l

查看每个物理CPU中core的个数(即核数)

cat /proc/cpuinfo| grep “cpu cores”| uniq

查看逻辑CPU的个数

cat /proc/cpuinfo| grep “processor”| wc -l

1.物理cpu数:主板上实际插入的cpu数量,可以数不重复的 physical id 有几个(physical id)

2.cpu核数:单块CPU上面能处理数据的芯片组的数量,如双核、四核等 (cpu cores)

3.逻辑cpu数:一般情况下,逻辑cpu=物理CPU个数×每颗核数,如果不相等的话,则表示服务器的CPU支持超线程技术
(HT:简单来说,它可使处理器中的1 颗内核如2 颗内核那样在操作系统中发挥作用。)

这样一来,操作系统可使用的执行资源扩大了一倍,大幅提高了系统的整体性能,此时逻辑cpu=物理CPU个数×每颗核数x2。

总核数 = 物理CPU个数 × 每颗物理CPU的核数。总逻辑CPU数 = 物理CPU个数 ×每颗物理CPU的核数 × 超线程数。

所以这算双核的。那样在操作系统中发挥作用。这样一来,操作系统可使用的执行资源扩大了一倍,大幅提高了系统的整体性能,此时逻辑cpu=物理CPU个数×每颗核数x2)

(processer 0-n)

如果服务器的physical id为0和1,所以有两个物理cpu;每个cpu有四条记录,所以此服务器的物理cpu为4核;因此可以得出服务器的逻辑cpu-vcores为4*2 = 8个)

vmstat 工具的使用

vmstat 工具提供了一种低开销的系统性能观察方式.因为 vmstat 本身就是低开销工具,在非常高负荷的服务器上,你需要查看并监控系统的健康情况,在控制窗口还是能够使用vmstat 输出结果.这个工具运行在2种模式下:average 和 sample 模式.sample 模式通过指定间隔时间测量状态值.这个模式对于理解在持续负荷下的性能表现,很有帮助.

vmstat 运行1秒间隔的命令 vmstat 1

Field Description
1.r
The amount of threads in the run queue. These are threads that are runnable, but the CPU is not available to execute them.
当前运行队列中线程的数目.代表线程处于可运行状态,但CPU 还未能执行.
2.b
This is the number of processes blocked and waiting on IO requests to finish.
当前进程阻塞并等待IO 请求完成的数目
3.in
This is the number of interrupts being processed.
当前中断被处理的数目
4.cs
This is the number of context switches currently happening on the system.
当前kernel system中,发生上下文切换的数目
5.us
This is the percentage of user CPU utilization.
CPU 利用率的百分比
6.sys
This is the percentage of kernel and interrupts utilization.
内核和中断利用率的百分比
7.wa
This is the percentage of idle processor time due to the fact that ALL runnable threads are blocked waiting on IO.
所有可运行状态线程被阻塞在等待IO 请求的百分比
8.id
This is the percentage of time that the CPU is completely idle.
CPU 空闲时间的百分比

监控 CPU 性能由以下几个部分组成:
1,检查system的运行队列,以及确定不要超出每个处理器3个可运行状态线程的限制.
2,确定CPU 利用率中user/system比例维持在70/30
3,当CPU 开销更多的时间在system mode,那就说明已经超负荷并且应该尝试重新调度优先级
4,当I/O 处理得到增长,CPU 范畴的应用处理将受到影响

要想获得服务器的CPU负载情况,有下面几种命令:
1)w命令
Linux系统下CPU使用(load average)梳理
https://cloud.tencent.com/developer/article/1027288

1)CPU利用率:显示的是程序在运行期间实时占用的CPU百分比
2)CPU负载:显示的是一段时间内正在使用和等待使用CPU的平均任务数。

CPU利用率高,并不意味着负载就一定大。
举例来说:
如果有一个程序它需要一直使用CPU的运算功能,那么此时CPU的使用率可能达到100%,但是CPU的工作负载则是趋近于"1",因为CPU仅负责一个工作!
如果同时执行这样的程序两个呢?CPU的使用率还是100%,但是工作负载则变成2了。所以也就是说,当CPU的工作负载越大,代表CPU必须要在不同的工作之间
进行频繁的工作切换。

-------------load average举例理解---------------
判断系统负荷是否过重,必须理解load average的真正含义。假设当前我的一台服务器只有一个CPU,所有的运算都必须由这个CPU来完成。
不妨把这个CPU想象成一座大桥,桥上只有一根车道,所有车辆都必须从这根车道上通过(很显然,这座桥只能单向通行)。
1)系统负荷为0,意味着大桥上一辆车也没有。
2)系统负荷为0.5,意味着大桥一半的路段有车。
3)系统负荷为1.0,意味着大桥的所有路段都有车,也就是说大桥已经"满"了。但是必须注意的是,直到此时大桥还是能顺畅通行的。
4)系统负荷为1.7,意味着车辆太多了,大桥已经被占满了(100%),后面等着上桥的车辆为桥面车辆的70%。
以此类推,系统负荷2.0,意味着等待上桥的车辆与桥面的车辆一样多;
系统负荷3.0,意味着等待上桥的车辆是桥面车辆的2倍。
总之,当系统负荷大于1,后面的车辆就必须等待了;系统负荷越大,过桥就必须等得越久。

CPU的系统负荷,基本上等同于上面的类比。大桥的通行能力,就是CPU的最大工作量;桥梁上的车辆,就是一个个等待CPU处理的进程(process)。
如果CPU每分钟最多处理100个进程,那么:
系统负荷0.2,意味着CPU在这1分钟里只处理20个进程;
系统负荷1.0,意味着CPU在这1分钟 里正好处理100个进程;
系统负荷1.7,意味着除了CPU正在处理的100个进程以外,还有70个进程正排队等着CPU处理。

为了服务器顺畅运行,系统负荷最好不要超过1.0,这样就没有进程需要等待了,所有进程都能第一时间得到处理。
很显然,1.0是一个关键值,超过这个值,系统就不在最佳状态了,就需要动手干预了。
1)CPU利用率:显示的是程序在运行期间实时占用的CPU百分比
2)CPU负载:显示的是一段时间内正在使用和等待使用CPU的平均任务数。

CPU利用率高,并不意味着负载就一定大。
举例来说:
如果有一个程序它需要一直使用CPU的运算功能,那么此时CPU的使用率可能达到100%,但是CPU的工作负载则是趋近于"1",因为CPU仅负责一个工作!
如果同时执行这样的程序两个呢?CPU的使用率还是100%,但是工作负载则变成2了。所以也就是说,当CPU的工作负载越大,代表CPU必须要在不同的工作之间
进行频繁的工作切换。
-----------------------下面通过一个电话亭打电话的比喻来说明这两者之间的区别------------------------
某公用电话亭,有一个人在打电话,四个人在等待,每人限定使用电话一分钟,若有人一分钟之内没有打完电话,只能挂掉电话去排队,等待下一轮。
电话在这里就相当于CPU,而正在或等待打电话的人就相当于任务数

在电话亭使用过程中,肯定会有人打完电话走掉,有人没有打完电话而选择重新排队,更会有新增的人在这儿排队,这个人数的变化就相当于任务数的增减。
为了统计平均负载情况,我们5分钟统计一次人数,并在第1、5、15分钟的时候对统计情况取平均值,从而形成第1、5、15分钟的平均负载。

有的人拿起电话就打,一直打完1分钟,而有的人可能前三十秒在找电话号码,或者在犹豫要不要打,后三十秒才真正在打电话。如果把电话看作CPU,人数看
作任务,我们就说前一个人(任务)的CPU利用率高,后一个人(任务)的CPU利用率低。当然, CPU并不会在前三十秒工作,后三十秒歇着,只是说,有的程
序涉及到大量的计算,所以CPU利用率就高,而有的程序牵涉到计算的部分很少,CPU利用率自然就低。但无论CPU的利用率是高是低,跟后面有多少任务在排队
没有必然关系

load average相关梳理(一分钟,五分钟,十五分钟的平均CPU负载,最重要的指标是最后一个数字,即前15分钟的平均CPU负载,这个数字越小越好。所谓CPU负载指的是一段时间内任务队列的长度,通俗的讲,就是一段时间内一共有多少任务在使用或等待使用CPU。(当前的"负载值除以cpu核数"就是cpu的利用率))
3)系统负荷为1.0,意味着大桥的所有路段都有车,也就是说大桥已经"满"了。但是必须注意的是,直到此时大桥还是能顺畅通行的。

二、top用法
2.1 top:动态观察程序的变化
[root@linux ~]# top [-d] | top [-bnp]
参数:
-d :后面可以接秒数,就是整个程序画面更新的秒数。预设是 5 秒;
-b :以批次的方式执行 top ,还有更多的参数可以使用喔!
通常会搭配数据流重导向来将批次的结果输出成为档案。
-n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
-p :指定某些个 PID 来进行观察监测而已。

在 top 执行过程当中可以使用的按键指令:
? :显示在 top 当中可以输入的按键指令;
P :以 CPU 的使用资源排序显示;
M :以 Memory 的使用资源排序显示;
N :以 PID 来排序喔!
T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
k :给予某个 PID 一个讯号 (signal)
r :给予某个 PID 重新制订一个 nice 值

mpstat -P ALL 1 10

如上命令的含义就是每秒一次mpstat,一共采样10次取平均值,可以明显看出CPU0的空闲idel明显小于其他CPUx,而且大部分消耗在user上面

Linux服务器上总是经常会出现几个CPU利用率达到100%并且一直高居不下,如下图所示,再Linux上,输入 top 命令,然后再按一下 1,
就会显示你服务器逻辑CPU的数量以及现在服务器CPU各个参数,但是很有可能提示你屏幕不够大

对于多个或多核的 CPU, 上面的显示则会是多个 CPU 所占用的百分比的总和, 因此会
出现 160% us 这样的现象, 如需查看每个核的消耗情况, 可在进入 top 视图后按 1, 就会按核来显示消耗情况

当 CPU 消耗过多时, 体现为 us 或 sy 值变大。
默认情况下, TOP 视图中显示的为进程的 CPU 消耗状况, 在 TOP 视图中按 shift+h 后,可查看线程的 CPU 消耗状况

此时的 PID 即为线程 ID, 其后的%CPU 表示该线程所消耗的 CPU 百分比。

可以通过 top -H -p pid 找到导致cpu高的线程
使用printf “%x\n” 线程号将异常线程号转化为16进制
jstack 进程号|grep 16进制异常线程号 -A90来定位异常代码的位置(最后的-A90是日志行数,也可以输出为文本文件或使用其他数字)。可以看到异常代码的位置。
top -H -p 402004

Tasks: 29 total 进程总数
1 running 正在运行的进程数
28 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数
Cpu(s):
0.3% us 用户空间占用CPU百分比 4.0% us 表示的为用户占用了 4%的 CPU 时间,主要为所运行的应用程序对 CPU 的消耗;
1.0% sy 内核空间占用CPU百分比 8.9% sy 表示的为系统占用了 8.9%的 CPU 时间, 主要为系统切换所消耗的 CPU; 或者是有人说是系统调用,socket,磁盘读写等等,假如是这些,我该怎样确定到底是什么原因.

0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比 0.0% ni 表示被 nice 命令改变优先级的任务所占用的 CPU 时间的百分比;
98.7% id 空闲CPU百分比 87.0% id 表示 CPU 的空闲时间所占的百分比为 87%;处于空闲状态的 CPU 时间百分比。如果该值持续为 0,同时 sy 是 us 的两倍,则通常说明系统则面临着 CPU 资源的短缺。
0.0% wa 等待输入输出的CPU时间百分比 0.0% wa 表示的为在执行的过程中等待 IO 所占用的 CPU 的百分比为 0%;IO 等待消耗的 CPU 时间百分比。该值较高时,说明 IO 等待比较严重,这可能磁盘大量作随机访问造成的,也可能是磁盘性能出现了瓶颈。
0.0% hi CPU服务于硬中断所耗费的时间总额 0.2% hi 表示的为硬件中断所占用的 CPU 时间百分比为 0.2%
0.0% si、0.0%st CPU服务于软中断所耗费的时间总额、Steal Time 0.0% si 表示的为软件中断所占用的 CPU 时间的百分比为 0.0%
Mem: 191272k total 物理内存总量
173656k used 使用的物理内存总量
17616k free 空闲内存总量
22052k buffers 用作内核缓存的内存量
Swap: 192772k total 交换区总量
0k used 使用的交换区总量
192772k free 空闲交换区总量
123988k cached 缓冲的交换区总量.
内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,
该数值即为这些内容已存在于内存中的交换区的大小.
相应的内存再次被换出时可不必再对交换区写入.
序号 列名 含义
1 PID 进程id
2 PPID 父进程id
3 RUSER Real user name
4 UID 进程所有者的用户id
5 USER 进程所有者的用户名
6 GROUP 进程所有者的组名
7 TTY 启动进程的终端名.不是从终端启动的进程则显示为 ?
8 PR 优先级
9 NI nice值.负值表示高优先级,正值表示低优先级
10 P 最后使用的CPU,仅在多CPU环境下有意义
11 %CPU 上次更新到现在的CPU时间占用百分比
12 TIME 进程使用的CPU时间总计,单位秒
13 TIME+ 进程使用的CPU时间总计,单位1/100秒
14 %MEM 进程使用的物理内存百分比
15 VIRT 进程使用的虚拟内存总量,单位kb,VIRT=SWAP+RES
16 SWAP 进程使用的虚拟内存中,被换出的大小,单位kb.
17 RES 进程使用的、未被换出的物理内存大小,单位kb,RES=CODE+DATA
18 CODE 可执行代码占用的物理内存大小,单位kb
19 DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
20 SHR 共享内存大小,单位kb
21 nFLT 页面错误次数
22 nDRT 最后一次写入到现在,被修改过的页面数.
23 S 进程状态:
D=不可中断的睡眠状态
R=运行
S=睡眠
T=跟踪/停止
Z=僵尸进程
24 COMMAND 命令名/命令行
25 WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
26 Flags 任务标志,参考 sched.h

User Time(译注:用户进程时间) - 关于在user space中被执行进程在CPU 开销时间百分比.
System Time(译注:内核线程以及中断时间) - 关于在kernel space中线程和中断在CPU 开销时间百分比.
Wait IO(译注:IO 请求等待时间) - 所有进程线程被阻塞等待完成一次IO 请求所占CPU 开销idle的时间百分比.
Idle(译注:空闲) - 一个完整空闲状态的进程在CPU 处理器中开销的时间百分比.

us

当 us 值高时, 表示运行的应用程序消耗了大部分的 CPU。
首先通过 top 或 pidstat 的方式找到消耗 CPU 的线程 ID, 并将此线程 ID 转化为十六进制的值, 之后通过 kill -3 或 jstack 的方式 dump 出应用的 java 线程信息, 通过之前转化出的十六进制的值找到对应的 nid 的线程, 该线程即为消耗 CPU 的线程, 以上过程需要多操作几次,
以确保找到真实的消耗 CPU 的线程,

sy
当 sy 值高时, 表示系统调用耗费了较多的 CPU, 对于 Java 应用程序而言, 造成这种现象的主要原因是启动的线程比较多, 并且这些线程多数都处于不断的等待(例如锁等待状态)和执行状态的变化过程中, 这就导致了操作系统要不断的调度这些线程, 切换执行, 以下为一个示例这种状况的代码。

对于 CPU 消耗严重的情况
根据之前的分析, CPU us 高的原因主要是执行线程不需要任何挂起动作, 且一直执行,导致 CPU 没有机会去调度执行其他的线程, 对于这种情况, 常见的一种优化方法是对这种线程的动作增加 Thread.sleep, 以释放 CPU 的执行权, 降低 CPU 的消耗。

CPU sy 高的原因主要是线程的运行状态要经常切换, 对于这种情况, 常见的一种优化方法是减少线程数。

最近在监控数据库的过程中发现,在操作系统层面top里面%sy值在不断的上涨,最严重的时候
%sy+%us达到100%,%id几乎为0了,直接结果就是数据库出现假死现象,应用程序无响应,之后查
了很多资料,发现一篇文章中陈述的现象跟我们的很类似,操作系统也是linux,说linux在处理页交换
上面有BUG,在aix和unix上都没这种现象,处理方法就是禁止在swap分区发生页交换,之后在测试库上
作了相应的调整,具体效果,有待进一步观察。
而正式库上经过一段时间的观察,发现造成%sy上涨的进程是oracle进程,而且会持续很长时间,最后到
数据库里捕捉相应的sql语句,却抓不出来,没办法,拉了一份awr报告,发现top5里面有direct pathread事件,难怪抓不到对应的sql语句,对物理读高的,排序操作多的sql
语句进行了彻底的优化,之后就没有再出现这种情况,仅此记录一下。

学习 Linux 时,经常可以看到两个词:User space(用户空间)和 Kernel space(内核空间)。

简单说,Kernel space 是 Linux 内核的运行空间,User space 是用户程序的运行空间。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响

Kernel space 可以执行任意命令,调用系统的一切资源;User space 只能执行简单的运算,不能直接调用系统资源,必须通过系统接口(又称 system call),才能向内核发出指令。

简单的赋值运算,在 User space 执行。第三行需要写入文件,就要切换到 Kernel space,因为用户不能直接写文件,必须通过内核安排。第四行又是赋值运算,就切换回 User space。

查看 CPU 时间在 User space 与 Kernel Space 之间的分配情况,可以使用top命令。它的第三行输出就是 CPU 时间分配统计。

如果想查看单个程序的耗时,一般使用time命令。

程序名之前加上time命令,会在程序执行完毕以后,默认显示三行统计。

real:程序从开始运行到结束的全部时间,这是用户能感知到的时间,包括 CPU 切换去执行其他任务的时间。
user:程序在 User space 执行的时间
sys:程序在 Kernel space 执行的时间

user和sys之和,一般情况下,应该小于real。但如果是多核 CPU,这两个指标反映的是所有 CPU 的总耗时,所以它们之和可能大于real。
ni:niceness 的缩写,CPU 消耗在 nice 进程(低优先级)的时间百分比

ni:niceness 的缩写,CPU 消耗在 nice 进程(低优先级)的时间百分比
id:idle 的缩写,CPU 消耗在闲置进程的时间百分比,这个值越低,表示 CPU 越忙
wa:wait 的缩写,CPU 等待外部 I/O 的时间百分比,这段时间 CPU 不能干其他事,但是也没有执行运算,这个值太高就说明外部设备有问题
hi:hardware interrupt 的缩写,CPU 响应硬件中断请求的时间百分比
si:software interrupt 的缩写,CPU 响应软件中断请求的时间百分比
st:stole time 的缩写,该项指标只对虚拟机有效,表示分配给当前虚拟机的 CPU 时间之中,被同一台物理机上的其他虚拟机偷走的时间百分比

https://cloud.tencent.com/developer/article/1354700

猜你喜欢

转载自blog.csdn.net/shunnianlv/article/details/105855239