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/OCPU 时间 - 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 时,就容易发生非自愿上下文切换。