linux性能(一):cpu性能指标及工具

CPU性能指标

CPU使用率

用户CPU使用率, 包括用户态(user)和低优先级用户态(nice). 该指标过高说明应用程序比较繁忙.

系统CPU使用率, CPU在内核态运行的时间百分比(不含中断). 该指标高说明内核比较繁忙.

等待I/O的CPU使用率, iowait, 该指标高说明系统与硬件设备I/O交互时间比较长.

软/硬中断CPU使用率, 该指标高说明系统中发生大量中断.

steal CPU / guest CPU, 表示虚拟机占用的CPU百分比.

平均负载

理想情况下平均负载等于逻辑CPU个数,表示每个CPU都被充分利用. 若大于则说明系统负载较重.

平均负载:单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。它和我们传统意义上理解的CPU使用率并没有直接关系。
其中不可中断进程是正处于内核态关键流程中的进程(如常见的等待设备的I/O响应)。不可中断状态实际上是系统对进程和硬件设备的一种保护机制。
平均负载多少时合理
实际生产环境中将系统的平均负载监控起来,根据历史数据判断负载的变化趋势。当负载存在明显升高趋势时,及时进行分析和调查。当然也可以当设置阈值(如当平均负载高于CPU数量的70%时)
现实工作中我们会经常混淆平均负载和CPU使用率的概念,其实两者并不完全对等:
	CPU 密集型进程,大量 CPU 使用会导致平均负载升高,此时两者一致
	I/O 密集型进程,等待 I/O 也会导致平均负载升高,此时 CPU 使用率并不一定高
	大量等待 CPU 的进程调度会导致平均负载升高,此时 CPU 使用率也会比较高
平均负载高时可能是 CPU 密集型进程导致,也可能是 I/O 繁忙导致。具体分析时可以结合 mpstat/pidstat 工具辅助分析负载来源。

上下文切换

​ CPU 上下文切换,就是把前一个任务的 CPU 上下文(CPU 寄存器和 PC)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的位置,运行新任务。其中,保存下来的上下文会存储在系统内核中,待任务重新调度执行时再加载,保证原来的任务状态不受影响。

CPU 上下文切换分为:

  • 进程上下文切换
  • 线程上下文切换
  • 中断上下文切换

进程上下文切换

​ 进程是由内核管理和调度的,进程上下文切换只能发生在内核态。因此相比系统调用来说,在保存当前进程的内核状态和CPU寄存器之前,需要先把该进程的虚拟内存,栈保存下来。再加载新进程的内核态后,还要刷新进程的虚拟内存和用户栈。

​ 进程只有在调度到CPU上运行时才需要切换上下文,有以下几种场景:CPU时间片轮流分配,系统资源不足导致进程挂起,进程通过sleep函数主动挂起,高优先级进程抢占时间片,硬件中断时CPU上的进程被挂起转而执行内核中的中断服务。

线程上下文切换

线程上下文切换分为两种:

  • 前后线程同属于一个进程,切换时虚拟内存资源不变,只需要切换线程的私有数据,寄存器等;
  • 前后线程属于不同进程,与进程上下文切换相同。

同进程的线程切换消耗资源较少,这也是多线程的优势。

中断上下文切换

中断上下文切换并不涉及到进程的用户态,因此中断上下文只包括内核态中断服务程序执行所必须的状态(CPU寄存器,内核堆栈,硬件中断参数等)。

中断处理优先级比进程高,所以中断上下文切换和进程上下文切换不会同时发生

CPU缓存命中率

CPU缓存的复用情况,命中率越高性能越好. 其中L1/L2常用在单核,L3则用在多核中

性能工具

平均负载案例

先用uptime查看系统平均负载

判断负载在升高后再用mpstat和pidstat分别查看每个CPU和每个进程CPU使用情况.找出导致平均负载较高的进程.

上下文切换案例

先用vmstat查看系统上下文切换和中断次数

再用pidstat观察进程的自愿和非自愿上下文切换情况

最后通过pidstat观察线程的上下文切换情况

进程CPU使用率高案例

先用top查看系统和进程的CPU使用情况,定位到进程

再用perf top观察进程调用链,定位到具体函数

系统CPU使用率高案例

先用top查看系统和进程的CPU使用情况,top/pidstat都无法找到CPU使用率高的进程

重新审视top输出

从CPU使用率不高,但是处于Running状态的进程入手

perf record/report发现短时进程导致 (execsnoop工具)

不可中断和僵尸进程案例

先用top观察iowait升高,发现大量不可中断和僵尸进程

strace无法跟踪进程系统调用

perf分析调用链发现根源来自磁盘直接I/O

软中断案例

top观察系统软中断CPU使用率高

查看/proc/softirqs找到变化速率较快的几种软中断

sar命令发现是网络小包问题

tcpdump找出网络帧的类型和来源,确定SYN FLOOD攻击导致

根据指标找工具(cpu性能)

性能指标工具说明
平均负载uptime
top
uptime最简单;
top提供更全面指标
系统整体CPU使用率vmstat
mpstat
top
sar
top、vmstat、mpstat:只能动态查看
sar:可以记录历史数据
进程CPU使用率top
pidstat
ps
htop
atop
top、ps:按CPU使用率排序
pidstat:只显示实际使用CPU的进程
htop、atop:以不同颜色显示
系统上下文切换vmstat查看上下文切换 查看运行状态 查看不可中后段进程数量
进程上下文切换pidstatpidstat -w: 自愿上下文切换 非自愿上下文切换
软中断top
mpstat
/proc/softirqs
top:软中断CPU使用率
mpstat和/proc/softirqs:提供各个软中断在每个CPU的运行次数
硬中断vmstat
/proc/interrupts
vmstat提供总的中断次数 /proc/interrupts提供各种中断在CPU上运行的累积次数
网络dstat
sar
tcpdump
dstat、sar:提供总的网络接收和发送情况
tcpdump:动态抓取正在进行的网络通讯
I/Odstat
sar
都提供I/O的整体情况
CPUlscpu
/proc/cpuinfo
lscpu更直观
事件剖析perf
execsnoop
perf:分析CPU的缓存以及内核调用链
execsnoop:监控短时进程

一:top命令

top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,用热键可以管理。

语法

top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]
参数说明:
d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称
S : 累积模式,会将己完成或消失的子进程 ( dead child process ) 的 CPU time 累积起来
s : 安全模式,将交谈式指令取消, 避免潜在的危机
i : 不显示任何闲置 (idle) 或无用 (zombie) 的进程
n : 更新的次数,完成后将会退出 top
b : 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内

实例

[mi@app ~]$ top
top - 14:30:35 up 124 days,  2:58,  2 users,  load average: 0.16, 0.07, 0.08
Tasks: 214 total,   1 running, 212 sleeping,   1 stopped,   0 zombie
%Cpu(s):  0.5 us,  0.4 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.1 st
KiB Mem : 32945484 total,  1922560 free, 15182068 used, 15840856 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 17345600 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 1949 migu      20   0 8584668   2.1g  14104 S   2.3  6.6 118:06.68 java
20531 migu      20   0 8512308   2.4g  13892 S   1.3  7.7  26:43.37 java
23440 migu      20   0 7196668   1.1g   7688 S   1.0  3.3 814:26.26 java
31040 migu      20   0  108548   1292    728 S   1.0  0.0   1:48.01 pidstat
 1942 migu      20   0 8275420   1.3g  15028 S   0.7  4.0  69:23.56 java

含义

前5行为系统总体资源统计情况

top -系统当前时间
up系统已开机多长时间
users当前用户数
load averagecpu平均负载,三个数值分别为,1分钟,5分钟,15分钟
Tasks系统当前进程数,
total:总进程数,
running:正在运行的进程数,
sleeping:睡眠的进程数,
stopped:停止的进程数,
zombie:僵尸进程数
%Cpu(s)cpu使用率
us:用户使用cpu百分百,
sy:系统内核使用cpu百分百,
ni 用户进程空间内改变过优先级的进程占用CPU百分比
id:空闲的cpu百分比
wa 等待输入输出的CPU时间百分比
hi 硬中断(Hardware IRQ)占用CPU的百分比
si 软中断(Software Interrupts)占用CPU的百分比
st 用于有虚拟cpu的情况,用来指示被虚拟机偷掉的cpu时间
Mem内存使用信息,
total:总内存大小,
free:空闲的内存,
used:已使用的内存,
buff/cache:缓存的内存大小
Swap虚拟内存信息
PID进程id
USER进程所有者
PR优先级
NInice值,负值表示高优先级,正值表示低优先级
VIRT进程使用的虚拟内存总量
RES进程使用的物理内存大小
SHR共享内存大小
S进程状态,D:不可中断的睡眠状态,R:运行,S:睡眠,T:跟踪/停止,Z:僵尸进程
%CPU进程使用的CPU占用百分比
%MEM进程使用的物理内存百分比
TIME进程使用的CPU时间总计
COMMAND命令名

二:vmstat命令

vmstat命令的含义为显示虚拟内存状态(“Virtual Memory Statistics”),但是它可以报告关于进程、内存、I/O等系统整体运行状态。

语法

[root@localhost ~]# vmstat [-a] [刷新延时 刷新次数]
[root@localhost ~]# vmstat [选项] 

vmstat命令常用选项及含义

选项含义
-fs-f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的。
-s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明。
-S-S : 单位. 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。
-d-d: 列出硬盘有关读写总量的统计表。
-p-p: 分区设备文件名.查看硬盘分区的读写情况。

实例

[mi@app ~]$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 2067240 155952 15568772    0    0     0     9    0    0  0  0 99  0  0
 1  0      0 2065044 155952 15568772    0    0     0   112 3736 5584  2  1 97  0  0
 0  0      0 2067176 155952 15568772    0    0     0   108 3941 5805  1  1 98  0  0
 0  0      0 2067092 155952 15568780    0    0     0     0 3147 5378  0  0 99  0  0
 0  0      0 2066596 155952 15568780    0    0     0     0 3260 5420  0  0 99  0  0
 0  0      0 2066480 155952 15568972    0    0     0     0 5358 7234  2  1 98  0  0

含义

字段含义
procs进程信息字段:
-r:等待运行的进程数,数量越大,系统越繁忙。
-b:不可被唤醒的进程数量,数量越大,系统越繁忙。
memory内存信息字段:
-swpd:虚拟内存的使用情况,单位为 KB。
-free:空闲的内存容量,单位为 KB。
-buff:缓冲的内存容量,单位为 KB。
-cache:缓存的内存容量,单位为 KB。
swap交换分区信息字段:
-si:从磁盘中交换到内存中数据的数量,单位为 KB。
-so:从内存中交换到磁盘中数据的数量,单位为 KB。
这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差
io磁盘读/写信息字段:
-bi:从块设备中读入的数据的总量,单位是块。
-bo:写到块设备的数据的总量,单位是块。
这两个数越大,代表系统的 I/O 越繁忙。
system系统信息字段:
-in:每秒被中断的进程次数。
-cs:每秒进行的事件切换次数。
这两个数越大,代表系统与接口设备的通信越繁忙。
cpuCPU信息字段:
-us:非内核进程消耗 CPU 运算时间的百分比。
-sy:内核进程消耗 CPU 运算时间的百分比。
-id:空闲 CPU 的百分比。
-wa:等待 I/O 所消耗的 CPU 百分比。
-st:被虚拟机所盗用的 CPU 百分比。

三:pidstat

pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。

pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

安装

pidstat 是sysstat软件套件的一部分,sysstat包含很多监控linux系统状态的工具,它能够从大多数linux发行版的软件源中获得。

yum install sysstat

语法

pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
常用的参数:

-u:默认的参数,显示各个进程的cpu使用统计
-r:显示各个进程的内存使用统计
-d:显示各个进程的IO使用情况
-p:指定进程号
-w:显示每个进程的上下文切换情况
-t:显示选择任务的线程的统计信息外的额外信息
-T { TASK | CHILD | ALL }
这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
-V:版本号
-h:在一行上显示了所有活动,这样其他程序可以容易解析。
-I:在SMP环境,表示任务的CPU使用率/内核数量
-l:显示命令名和所有参数

实例

(一)查看进程的cpu上下文切换

vmstat只能查看总的cpu上下文切换,pidstat可以查看每个进程的上下文切换

语法
[migu@app-hbbjhbqomclb01amg ~]$ pidstat -w 1
Linux 3.10.0-1160.25.1.el7.x86_64 (app-hbbjhbqomclb01amg)       11/29/2022      _x86_64_        (8 CPU)

11:15:17 AM   UID       PID   cswch/s nvcswch/s  Command
11:15:18 AM     0         1      0.99      0.00  systemd
11:15:18 AM     0         6      0.99      0.00  ksoftirqd/0
11:15:18 AM     0         9    121.78      0.00  rcu_sched
11:15:18 AM     0        11      0.99      0.00  watchdog/0
11:15:18 AM     0        12      0.99      0.00  watchdog/1
11:15:18 AM     0        13      0.99      0.00  migration/1
11:15:18 AM     0        17      0.99      0.00  watchdog/2
11:15:18 AM     0        19      0.99      0.00  ksoftirqd/2
11:15:18 AM     0        22      0.99      0.00  watchdog/3
11:15:18 AM     0        27      0.99      0.00  watchdog/4

含义
cswch/s表示每秒自愿上下文切换(voluntary context switches)的次数
ncswch/s表示每秒非自愿上下文切换(non voluntary context switches)的次数
  • 自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
  • 而非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
(二)查看进程的cpu使用率
语法
[mi@app ~]$ pidstat -u 5
Linux 3.10.0-1160.25.1.el7.x86_64 (app-hbbjhbqomclb01amg)       11/29/2022      _x86_64_        (8 CPU)
03:15:06 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:15:11 PM     0         9    0.00    0.20    0.00    0.20     7  rcu_sched
03:15:11 PM     0       434    1.00    1.20    0.00    2.20     3  systemd-journal
03:15:11 PM  1000       492    0.00    0.20    0.00    0.20     5  mgweb
03:15:11 PM  1000       493    0.00    0.20    0.00    0.20     4  mgweb
03:15:11 PM     0      1331    0.40    0.20    0.00    0.60     2  rsyslogd
03:15:11 PM  1000      1850    4.79    0.20    0.00    4.99     3  python3
03:15:11 PM  1000      1930    0.20    0.00    0.00    0.20     6  java
03:15:11 PM  1000      1942    1.00    0.40    0.00    1.40     0  java
03:15:11 PM  1000      1949    1.00    0.40    0.00    1.40     5  java
03:15:11 PM  1000      1955    0.40    0.00    0.00    0.40     7  java
03:15:11 PM  1000      3795    1.20    0.00    0.00    1.20     7  java
03:15:11 PM     0      4917    0.20    0.00    0.00    0.20     4  titan_monitor
03:15:11 PM  1000      8865    0.00    0.20    0.00    0.20     6  pidstat
03:15:11 PM  1000     20531    0.80    0.60    0.00    1.40     6  java
03:15:11 PM  1000     22578    0.20    0.00    0.00    0.20     0  redis-server
03:15:11 PM  1000     23440    0.20    0.40    0.00    0.60     7  java



含义

每隔 5 秒输出 1 组数据

%usr用户空间的cpu使用率
%system内核空间的cpu使用率
%wait等待上下文切换的cpu使用率
%CPU总的cpu使用率

# -d 展示 I/O 统计数据,-p 指定进程号,间隔 1 秒输出 3 组数据
$ pidstat -d -p 4344 1 3
06:38:50      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
06:38:51        0      4344      0.00      0.00      0.00       0  app
06:38:52        0      4344      0.00      0.00      0.00       0  app
06:38:53        0      4344      0.00      0.00      0.00       0  app
kB_rd/s:表示每秒读的 KB 数

kB_wr/s: 表示每秒写的 KB 数

iodelay: 表示 I/O 的延迟(单位是时钟周期)

四、mpstat

mpstat的全称为Multiprocessor Statistics,是一款常用的多核CPU性能分析工具,用来实时查询每个CPU的性能指标,以及所有CPU的平均指标

安装

它是Linux性能工具集sysstat中的一个工具.(和pidstat一样)

yum install sysstat

语法

mpstat [-P {cpu|ALL}] [interval [count]]
参数描述
-P{cpu|ALL} 表示监控哪个CPU,ALL是所有
internval相邻两次采样的间隔时间
count采样的次数,count只能和internval一起使用

实例

查看多核CPU核心的当前运行状况信息, 每2秒更新一次

[mi@app ~]$ mpstat -P ALL 2
Linux 3.10.0-1160.25.1.el7.x86_64 (app-hbbjhbqomclb01amg)       11/30/2022      _x86_64_        (8 CPU)

10:15:57 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
10:15:59 AM  all    0.44    0.00    0.31    0.00    0.00    0.00    0.12    0.00    0.00   99.12
10:15:59 AM    0    0.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   99.00
10:15:59 AM    1    0.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   99.00
10:15:59 AM    2    0.50    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.50
10:15:59 AM    3    0.50    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.50
10:15:59 AM    4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
10:15:59 AM    5    1.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   98.51
10:15:59 AM    6    0.50    0.00    0.00    0.00    0.00    0.00    0.50    0.00    0.00   99.00
10:15:59 AM    7    0.00    0.00    0.50    0.00    0.00    0.00    0.99    0.00    0.00   98.51

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值