Linux性能工具

204 阅读12分钟

1 CPU使用率

通常所说的 CPU 使⽤率,就是CPU被使用的比例,也就是空闲之外的使用比例。

1.1 系统CPU使用率

Linux通过/proc虚拟文件系统,向用户空间提供了系统内部状态的信息,而/proc/stat提供的就是系统的CPU和任务统计信息。

#只保留各个CPU的数据
$ cat /proc/stat | grep ^cpu
     us      ni    sys     id     wa  hi  si  st guest  gnice
cpu  590084 4268 1235478 5762130 17246 0 5748 0 0 0
cpu0 146707 1930 298457 1453246 3132 0 1311 0 0 0
cpu1 137571 903 296183 1460387 5409 0 1398 0 0 0
cpu2 173608 595 344495 1381436 3463 0 1396 0 0 0
cpu3 132196 839 296342 1467060 5241 0 1642 0 0 0

其中,第⼀列表示的是 CPU 编号,如cpu0、cpu1 ,⽽第⼀⾏没有编号的 cpu ,表示的是所有CPU 的累加。

  • user(通常缩写为 us),代表⽤户态CPU时间。注意,它不包括 nice 时间,但包括了 guest 时间
  • nice(通常缩写为 ni),代表低优先级⽤户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这⾥注意,nice 可取值范围是 -20 到 19,数值越⼤,优先级反⽽越低
  • system(sys),内核态CPU 时间
  • idle(id),空闲时间。注意,它不包括等待 I/O 的时间(iowait)
  • iowait(wa),等待 I/O CPU 时间
  • irq(hi),硬中断的 CPU 时间
  • softirq(si),软中断的 CPU 时间
  • steal(st),当系统运⾏在虚拟机中的时候,被其他虚拟机占⽤的 CPU 时间
  • guest(guest),运⾏虚拟机的 CPU 时间
  • guest_nice(gnice),以低优先级运⾏虚拟机的时间

1.2 查看进程的CPU

pidstat命令可以查看进程的CPU:

# 每隔1秒输出⼀组数据,共输出5组
$ pidstat 1 5
23时50分37秒   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
23时50分38秒  1000      2187    0.99    1.98    0.00    0.00    2.97     0  Xorg
23时50分38秒  1000      2318    0.99    0.99    0.00    0.00    1.98     3  gnome-shell
23时50分38秒  1000      2659    0.99    0.99    0.00    0.00    1.98     3  gnome-terminal-
23时50分38秒     0     15212    0.00    0.99    0.00    0.00    0.99     1  kworker/1:2-events
23时50分38秒     0     15250    0.00    1.98    0.00    0.00    1.98     2  pidstat

...
平均时间:   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
平均时间:     0        11    0.00    0.20    0.00    0.00    0.20     -  rcu_sched
平均时间:  1000      2187    0.80    0.80    0.00    0.20    1.59     -  Xorg
平均时间:  1000      2318    0.80    0.40    0.00    0.20    1.20     -  gnome-shell
平均时间:  1000      2659    0.60    0.20    0.00    0.20    0.80     -  gnome-terminal-
平均时间:     0     15217    0.00    0.20    0.00    0.00    0.20     -  kworker/2:0-events
平均时间:     0     15251    0.80    1.59    0.00    0.00    2.39     -  pidstat
  • %usr:⽤户态CPU使⽤率
  • %system:内核态CPU使⽤率
  • %guest:运⾏虚拟机CPU使⽤率
  • %wait:等待CPU使⽤率
  • %CPU:总的CPU使⽤率

2 TOP命令

top命令可以动态查看进程变化,监控linux的系统状况;它是常用的性能分析工具,能够实时显示系统资源各个进程占用状况。

[root@localhost ~]# top
top - 09:56:25 up 49 days, 15:19,  1 user,  load average: 0.01, 0.05, 0.05
Tasks: 147 total,   1 running, 146 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.8 sy,  0.0 ni, 99.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 32781220 total,  9375268 free, 10749464 used, 12656488 buff/cach
KiB Swap:        0 total,        0 free,        0 used. 21365776 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                      
 7150 root      20   0  157724   2156   1480 R   6.2  0.0   0:00.01 top                                                                                                                                          
    1 root      20   0   43320   3604   2308 S   0.0  0.0   1:33.24 systemd

视图参数含义 top视图分为两部分:操作系统资源概况信息和进程信息

2.1 操作系统资源概况

平均负载概况

  top - 09:56:25 up 49 days, 15:19,  1 user,  load average: 0.01, 0.05, 0.05

load average:1,5,15min的系统平均负载。

运行任务概况

Tasks: 147 total,   1 running, 146 sleeping,   0 stopped,   0 zombie

CPU概览

%Cpu(s) 表示CPU使用百分比,时间占用百分比 = 该种类型操作消耗cpu时间 /top刷新间隔时间。
top每3s刷新一次,用户空间进程在这3秒内用了cpu 1.5s,us = 1.5s/3s = 50%

%Cpu(s):  0.0 us,  0.8 sy,  0.0 ni, 99.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
  • us:用户空间占用cpu时间百分比(可以按1进行多核统计和平均统计切换,后续同上)
  • sy:内核空间占用cpu时间百分比,
  • ni:用户空间改变过优先级的进程占用cpu时间百分比。
  • id:空闲时间占用cpu的百分比。
  • wa:等待输入输出占用cpu时间百分比
  • hi:硬中断占用cpu时间百分比
  • si:软中断占用cpu时间百分比

内存概览

单位kb

KiB Mem : 32781220 total,  9375268 free, 10749464 used, 12656488 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 21365776 avail Mem 

2.2 进程概况

内存相关单位kb

 PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                      
 7150 root      20   0  157724   2156   1480 R   6.2  0.0   0:00.01 top  
  • PID: 进程id
  • USER: 进程所有者的用户名
  • PR: 优先级
  • NI: nice值。负值表示高优先级,正值表示低优先级
  • VIRT: 进程使用的虚拟内存总量VIRT=SWAP+RES
  • RES: 进程使用的、未被换出的物理内存大小RES=CODE+DATA
  • SHR: 共享内存大小,单位kb
  • S: 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
  • %CPU: 上次更新到现在的CPU时间占用百分比
  • %MEM: 进程使用的物理内存百分比
  • TIME+: 进程使用的CPU时间总计,单位1/100秒
  • COMMAND: 命令名/命令行

3 FREE命令

3.1 free 命令参数含义

free显示的是整个系统的内存使用情况,默认以字节为单位。

>free
total used free shared buff/cache available
Mem: 8010968 935180 5968260 16668 1107528 6835728
Swap: 4194300 0 4194300
  • total 是总内存大小;
  • used: 是已使用内存的大小,包含了共享内存
  • free: 是未使用内存的大小;
  • shared: 是共享内存的大小;
  • buff/cache: 是缓存和缓冲区的大小;
  • available: 是新进程可用内存的大小。

注意available 不仅包含未使用内存,还包括了可回收的缓存,所以一般会比未使用内存更大

3.2 关于Buffers/Cache

数据来源和含义

Buffers 是内核缓冲区用到的内存,对应的是/proc/meminfo 中的 Buffers 值。 Cache 是内核页缓存和 Slab 用到的内存,对应的是/proc/meminfo 中的 Cached 与 SReclaimable 之和

Buffer 是对磁盘数据的缓存,而Cache是文件数据的缓存,它们既会用在读请求中,也会用在写请求中。

proc文件系统介绍

/proc 是 Linux 内核提供的一种特殊文件系统,是用户跟内核交互的接口,用户可以从 /proc中查询内核的运行状态和配置选项,查询进程的运行状态、统计数据等; 可以通过/proc 来修改内核的配置;
/proc文件系统同时也是很多性能工具的最终数据来源,比如free就是通过读取/proc/meminfo ,得到内存的使用情况

> man proc 
Buffers %lu
Relatively temporary storage for raw disk blocks that shouldn't get tremendously large (20MB or so).
 
Cached %lu
In-memory cache for files read from the disk (the page cache). Doesn't include SwapCached.
...
SReclaimable %lu (since Linux 2.6.19)
Part of Slab, that might be reclaimed, such as caches.
 
SUnreclaim %lu (since Linux 2.6.19)
Part of Slab, that cannot be reclaimed on memory pressure.

Buffers是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB 左右)。这样,内核就可以把分散的写集中起来,统一优化磁盘的写入

Cached 是从磁盘读取文件的页缓存,也就是用来缓存文件读取的数据。

SReclaimable 是 Slab 的一部分。Slab包括两部分,其中的可回收部分,用 SReclaimable 记录;而不可回收部分,用 SUnreclaim 记录。

磁盘和文件的区别

  • 磁盘是一个块设备,可以划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后才可以在这个目录中读写文件。
  • 其实 Linux 中“一切皆文件”,而文章中提到的“文件”是普通文件,磁盘是块设备文件
  • 在读写普通文件时,会经过文件系统,由文件系统负责与磁盘交互;而读写磁盘或者分区时,就会跳过文件系统,也就是所谓的“裸I/O“。这两种读写方式所使用的缓存是不同的,也就是文中所讲的 Cache 和 Buffer 区别。

4 平均负载

4.1 平均负载的概念

平均负载表示单位时间内,系统处于可运行状态不可中断状态平均进程数,也就是平均活跃进程数,它和cpu使用率并没有直接关系。

可运行状态:对应top或者ps命令R状态(Running 或Runnable)的进程。
不可中断状态:进程是正处于内核关键流程中的进程不可打断的(比如等待硬件设备I/O响应),对应D状态(Uninterruptible Sleep,即Disk Sleep)的进程。 不可中断状态实际上是系统对进程和硬件的一种保护机制。

平均负载不仅包括正在使用CPU的进程,还包括等待CPU等待 I/O 的进程。

查看平均负载

使用命令uptime,可以查看系统的平均负载。最后三个数字依次是1分钟,5分钟,15分钟的平均负载。

> uptime
21:16:07 up  1:43,  3 users,  load average: 5.98, 2.14, 1.19

4.2 平均负载为多少时合理

平均负载最理想的情况等于CPU的个数, 当平均负载高于CPU数量70%,需要排查负载高的问题了。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能。

查看系统有几个CPU:

 grep 'model name' /proc/cpuinfo | wc -l

4.3 平均负载与 CPU 使用率

CPU使用率是单位时间内CPU繁忙情况的统计,跟平均负载并不一定完全对应。

CPU密集型进程

使用大量 CPU 会导致平均负载升高,此时这两者一致的。
可能表现: %usr

I/O 密集型进程

等待 I/O 也会导致平均负载升高,但CPU使用率不一定很高
可能表现: %sys高, %iowait

大量进程的场景

大量等待CPU调度的进程也会导致平均负载升高,此时的CPU使用率也会比较高
可能表现: %wait高(pidstat命令)

5 Pidstat 命令

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

pidstat [option] interval [count]

常用的参数

  • -u:默认的参数,显示各个进程的cpu使用统计
  • -r:显示各个进程的内存使用统计
  • -d:显示各个进程的IO使用情况
  • -p:指定进程号
  • -w:显示每个进程的上下文切换情况
  • -t:显示选择任务的线程的统计信息外的额外信息
  • -l:显示命令名和所有参数

5.1 CPU

-u选项,指定各个进程的cpu使用统计(默认)
-p选项,指定进程 (每隔2秒执行一次,共执行2次)

[root@localhost ~]# pidstat 2 2
Linux 3.10.0-1062.el7.x86_64 (192.168.32.130) 	03/08/2020 	_x86_64_	(4 CPU)

04:30:48 AM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
04:30:50 AM     0      1636    0.50    0.00    0.00    0.50     1  java
04:30:50 AM     0      2103    0.00    0.50    0.00    0.50     1  pidstat

04:30:50 AM   UID       PID    %usr %system  %guest    %CPU   CPU  Command

Average:      UID       PID    %usr %system  %guest    %CPU   CPU  Command
Average:        0      1636    0.25    0.00    0.00    0.25     -  java
Average:        0      2103    0.00    0.25    0.00    0.25     -  pidstat
  • %usr:进程在用户空间占用cpu的百分比
  • %system:进程在内核空间占用cpu的百分比
  • guest:虚拟机占用cpu的百分比
  • %CPU:进程占用cpu的百分比 -CPU:处理进程的cpu编号

5.2 内存

-r选项:指定内存使用统计

[root@localhost ~]# pidstat -r -p 1636 2 2
Linux 3.10.0-1062.el7.x86_64 (192.168.32.130) 	03/08/2020 	_x86_64_	(4 CPU)
04:54:42 AM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
04:54:44 AM     0      1636      0.00      0.00 4135676 431228  23.15  java
04:54:46 AM     0      1636      1.00      0.00 4135676 431228  23.15  java
Average:        0      1636      0.50      0.00 4135676 431228  23.15  java
  • minflt/s: 任务每秒发生的次要错误,不需要从磁盘中加载页
  • majflt/s: 任务每秒发生的主要错误,需要从磁盘中加载页
  • VSZ: 该进程使用的虚拟内存(kB)
  • RSS: 该进程使用的物理内存(kB)
  • %MEM: 该进程使用内存的百分比

5.3 IO

-d 选项,可以查看到进程IO的统计信息:

[root@localhost ~]# pidstat -d  -p 1636 1 2
Linux 3.10.0-1062.el7.x86_64 (192.168.32.130) 	03/08/2020 	_x86_64_	(4 CPU)

05:02:21 AM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
05:02:22 AM     0      1636      0.00      8.00      0.00  java
05:02:23 AM     0      1636      0.00      0.00      0.00  java
Average:        0      1636      0.00      4.00      0.00  java
  • kB_rd/s:每秒从磁盘读取的数据量(以KB为单位)
  • kB_wr/s:每秒向磁盘写的数据量(以KB为单位)
  • kB_ccwr/s:任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生

5.4 上下文切换

-w选项:查看每个进程上下文切换情况

[root@localhost ~]# pidstat -w 5 2
Linux 3.10.0-1062.el7.x86_64 (192.168.32.130) 	03/08/2020 	_x86_64_	(4 CPU)

04:35:33 AM   UID       PID   cswch/s nvcswch/s  Command
04:35:38 AM     0         9      2.99      0.00  rcu_sched
04:35:38 AM     0        11      0.20      0.00  watchdog/0
04:35:38 AM     0        12      0.20      0.00  watchdog/1
04:35:38 AM     0        13      0.20      0.00  migration/1
04:35:38 AM     0        17      0.20      0.00  watchdog/2
04:35:38 AM     0        19      0.20      0.00  ksoftirqd/2
04:35:38 AM     0        22      0.20      0.00  watchdog/3
04:35:38 AM     0        24      0.20      0.00  ksoftirqd/3
04:35:38 AM     0        40      0.20      0.00  kworker/3:1
04:35:38 AM     0        41      1.00      0.00  kworker/2:1
04:35:38 AM     0        48      0.20      0.00  khugepaged
04:35:38 AM     0        65      0.40      0.00  kworker/1:1
04:35:38 AM     0       463     20.16      0.00  xfsaild/dm-0
04:35:38 AM     0       764      0.20      0.00  irqbalance
04:35:38 AM     0       775     10.38      0.00  vmtoolsd
04:35:38 AM     0       945      0.20      0.00  kworker/0:1H
04:35:38 AM     0      2066      1.20      0.00  kworker/u256:0
04:35:38 AM     0      2086      2.40      0.20  kworker/0:3
04:35:38 AM     0      2094      0.60      0.00  kworker/0:1
  • cswch/s:每秒自愿上下文切换(voluntary context switches)的次数
  • ncswch/s:每秒非自愿上下文切换(non voluntary context switches)的次数

自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说 I/O、内存等系统资源不足时。
非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。