CPU 性能统计信息
每一种系统级的 Linux 性能工具都提供了不同的方式来获取相似的统计结果。虽然没有工具能显示全部的信息,但是有些工具显示的是相同的统计信息,为了不多次解释统计信息的含义,我们在描述所有工具之前对这些信息进行一次性说明:
运行队列统计
在 Linux 中,一个进程要么是可运行的,要么是阻塞的,阻塞进程可能在等待的是从 I/O 设备来的数据,或者是系统调用的结果。如果进程是可运行的,那就意味着它要和其他也是可运行的进程竞争 CPU 时间。一个可运行的进程不一定会使用 CPU,但是当 Linux 调度器决定下一个要运行的进程时,它会从可运行进程队列中挑选。**如果进程是可运行的,同时又在等待使用处理器,这些进程就构成了运行队列。运行队列越长,处于等待状态的进程就越多**。
性能工具通常会给出可运行的进程个数和等待 I/O 的阻塞进程个数。另一种常见的系统统计是平均负载。**系统的负载是指正在运行和可运行的进程总数**。平均负载是给定时间被的负载量。一般情况下,取平均负载的时间为 1 分钟,5分钟和15分钟。
上下文切换
大部分现代处理器一次只能运行一个进程或线程。虽然有些处理器实际上可以同时运行多个进程,但是 Linux 会把它们看做多个单线程处理器。如果要制造出给定单处理器同时运行多个任务的假象,Linux 内核就要不断地在不同的进程间切换。**这种不同进程间的切换称为上下文切换,因为当其发生时,CPU 要保存旧进程的所有上下文信息,并取出新进程的所有上下文信息**。上下文中包含了 Linux 跟踪新进程的大量信息,其中包括: 进程正在执行的指令,分配给进程的内存,进程打开的文件等。这些上下文切换涉及大量信息的移动,因此,上下文切换的开销可以是相当大的。尽量减少上下文切换的次数十个好主意。
中断
此外,处理器还周期性的从硬件设备接收中断。当设备有事件需要内核处理时,它通常就会触发这些中断。比如,如果磁盘控制器刚刚完成从驱动器取数据块的操作,并准备好提供给内核,那么磁盘控制器就会触发一个中断。对内核收到的每个中断,如果已经有相应的已注册的中断处理程序,就运行改=该程序,否则将忽略这个中断。这些中断处理程序在系统中具有很高的运行优先级,并且通常执行速度也很快。有时,中断处理程序有工作要做,但是又不需要高优先级,因此它可以启动 下半部(bottom half)
,也就是所谓的软中断处理程序。如果有很多中断,内核会花大量的时间服务这些中断。查看 /proc/interrupts
文件可以显示出哪些 CPU 上触发了哪些中断。
CPU使用率
CPU 使用率是个简单的概念。在任何给定的时间,CPU 可以执行以下七件事情中的一个:
- CPU 可以是空闲的,这意味着处理器实际上没有做任何工作,并且等待有任务可以执行;
- CPU 可以运行用户代码,即指定的
用户
时间(us); - CPU 可以执行 Linux 内核中的应用程序代码,这就是
系统
时间(sy); - CPU 可以执行
比较友好
的或者优先级被设置为低于一般进程的用户代码; - CPU 可以处于
iowait
状态,即系统正在等待 I/O(如磁盘或网络) 完成; - CPU 可以处于
irq
状态,即它正在用高优先级代码处理硬件中断; - CPU 可以处于
softirq
模式,即系统正在执行同样由中断触发的内核代码,只不过其运行于较低的优先级(软中断)。
大多数性能工具将这些数值表示为占 CPU 总时间的百分比。这些时间的范围从 0% 到 100%,但全部三项加起来等于 100%。
一个具有高 系统
时间百分比的系统表明其大部分时间都消耗在了内核上。像 oprofile
一样的工具可以帮助确定时间都消耗在了哪里。具有高 用户
时间的系统则将其大部分时间都用来运行应用程序。如果系统在应该工作的时候花费了大量的时间处于 iowait
状态,那它很可能在等待来自设备的 I/O,导致速度变慢的原因肯呢个是磁盘,网卡或其他设备.
Linux 性能工具
vmstat (虚拟内存统计)
vmstat 是指虚拟内存统计,这个名称表明它能告诉你系统的虚拟内存性能信息。幸运的是,它实际能完成的工作远不止于此。vmstat 是一个很有用的命令,他能获取整个系统性能的粗略信息,包括:
- 正在运行的进程个数;
- CPU 的使用情况;
- CPU 接收的中断个数;
- 调度器执行的上下文切换次数
它是用于获取系统性能大致信息的极好工具。
vmstat 命令说明
vmstat 使用方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18Usage:
vmstat [options] [delay [count]]
Options:
-a, --active active/inactive memory
-f, --forks number of forks since boot
-m, --slabs slabinfo
-n, --one-header do not redisplay header
-s, --stats event counter statistics
-d, --disk disk statistics
-D, --disk-sum summarize disk statistics
-p, --partition <dev> partition specific statistics
-S, --unit <char> define display unit
-w, --wide wide output
-t, --timestamp show timestamp
-h, --help display this help and exit
-V, --version output version information and exitvmstat 常用命令行选项:
-a: 用
inact/active
(活跃与否) 来取代buff/cache
的内存输出信息;-f:显示从启动到目前为止,系统复制(fork)的程序数;
-n: 默认情况下,vmstat 定期显示每个性能统计数据的列标题。本选项禁止该特性,因此初始列标题之后,只显示性能数据。如果想将 vmstat 导出为电子表格,使用这个选项是有好处的;
-w: 以更宽的格式输出内容,可以将内容对其输出
-s: 本选项一次性输出 vmstat 收集的系统统计的详细信息。该信息为系统启动后的总数据;
-S: 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。(k/K, m/M,default is KiB)
-d: 列出硬盘有关读写总量的统计表;
-p: 查看硬盘分区的读写情况。
delay: vmstat 采样的间隔时间;
count: vmstat 采集的总数
vmstat 运行于两种模式: 采样模式和平均模式。如果不指定参数,则 vmstat 统计运行于平均模式下,vmstat 显示的是从系统启动以来所有统计数据的平均值。但是如果指定了延迟,那么第一个采样仍然是系统启动以来的均值,但之后 vmstat 按延迟秒数采样系统并显示统计数据。
与 CPU 相关的输出信息:
列 说明 r 当前可运行的进程数。这些进程没有等待 I/O,而是已经准备好运行。理想状态下,可运行进程数应与可用 CPU 的数量相等 b 等待 I/O 完成的被阻塞的进程数 forks 创建新进程的次数 in 系统发生中断的次数 cs 系统发生上下文切换的次数 us 用户进程消耗的总 CPU 时间的百分比(包括 友好的
时间)sy 系统代码消耗的总 CPU 时间的百分比,其中包括消耗在 system,irq 和 softirq 状态的时间 wa 等待I/O消耗的总 CPU 时间的百分比 id 系统空闲消耗的总 CPU 时间的百分比 st 被虚拟机所盗用的 CPU 时间的百分比
vmstat 用法示例
不添加任何命令行参数
1
2
3
4# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 4584632 193424 2448800 0 0 1 65 10 6 2 2 94 2 0如上所示,显示的是自系统启动以来它记录下的统计信息的均值。根据 CPU 使用率列下面的 us、sy、wa 和 id,本示例显示出自系统启动开始,基本上处于空闲状态。从启动开始,CPU 有 2% 的时间用于执行用户应用程序代码,2% 的时间用于执行系统代码,2% 的时间在用于等待 I/O,而其余 94% 的时间处于空闲状态。
尽管 vmstat 从系统启动时开始统计有助于确定系统的负载情况,但是 vmstat 最有用的是运行于采样模式下,如下所示,在采样模式下,vmstat 间隔 delay 参数指定的秒数输出系统统计数据,而采样次数由 count 给出。
1
2
3
4
5
6
7
8# vmstat -w 2 5
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 4518540 193444 2499684 0 0 1 65 27 35 2 2 94 2 0
3 0 0 4518064 193444 2499700 0 0 0 46 4602 8410 3 2 95 0 0
0 0 0 4518096 193444 2499736 0 0 0 198 4598 8201 3 2 95 1 0
0 0 0 4521484 193444 2499680 0 0 0 774 6439 11122 4 3 92 1 0
1 0 0 4520896 193444 2499700 0 0 0 0 4055 7280 3 1 96 0 0上面示例第一行的统计数据和之前一样,是系统启动以来的均值,但之后就是定期采样。本示例显示出系统的活动非常少,通过查看 b 列下面的 0,我们可以知道在运行时没有阻塞进程。通过查看 r 列,我们还可以看到 vmstat 采样数据时,正在运行的进程数量。
vmstat 是一种记录记录系统在一定负载或测试条件下行为的好方法。可以用 vmstat 显示系统的行为,同时利用 Linux 的 tee 命令将结果输出到文件。如果只传递了 delay 参数,vmstat 就会无限采样。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24# vmstat -w -n 1 |tee /tmp/vmstat_output
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 1 0 4589716 193448 2496068 0 0 1 65 49 74 2 2 94 2 0
0 0 0 4589972 193448 2496120 0 0 20 0 4822 8275 3 2 95 1 0
0 0 0 4590488 193448 2496136 0 0 0 148 5303 9387 3 2 95 0 0
0 0 0 4590628 193448 2496148 0 0 0 388 4148 7102 3 2 95 0 0
0 0 0 4590424 193448 2496188 0 0 0 0 4153 7250 2 1 96 0 0
0 0 0 4590256 193448 2496204 0 0 0 0 3616 6451 3 2 96 0 0
0 0 0 4590056 193448 2496236 0 0 0 4 4693 8313 3 2 95 0 0
0 0 0 4588336 193448 2496240 0 0 0 96 4178 7297 4 2 94 0 0
0 0 0 4588572 193448 2496264 0 0 0 272 4902 8861 3 2 95 1 0
0 0 0 4588604 193448 2496272 0 0 0 0 3365 5903 2 1 97 0 0
0 0 0 4588604 193448 2496276 0 0 0 0 4342 7969 2 1 97 0 0
0 0 0 4588604 193448 2496280 0 0 0 0 3952 7561 2 2 96 0 0
0 0 0 4590752 193448 2496284 0 0 0 136 4451 7901 2 1 97 0 0
0 0 0 4591228 193448 2496296 0 0 0 120 4960 8464 4 2 95 0 0
0 0 0 4591476 193448 2496320 0 0 0 256 4877 8815 3 2 95 1 0
0 0 0 4591196 193448 2496348 0 0 0 4 4556 7897 3 1 96 0 0
0 0 0 4590680 193448 2496376 0 0 0 0 4570 8058 3 1 96 0 0
0 0 0 4590408 193448 2496392 0 0 0 16 3775 6492 3 2 95 0 0
2 0 0 4588152 193448 2496408 0 0 0 200 6062 10631 6 2 92 0 0
1 0 0 4588352 193448 2496416 0 0 0 0 4142 7347 2 1 97 0 0
0 0 0 4588268 193448 2496420 0 0 0 0 4039 7289 3 1 96 0 0如上所示,我们可以看到系统发生的中断和上下文切换。在 in 列 和 cs 列能分别查看到中断和上下文切换的总数。
注意: 如果上下文切换的数量小于中断的数量。调度器切换进程的次数少于定时器中断触发的次数。这很可能是因为系统基本上是空闲的,在定时器中断触发的大多数时候,调度器没有任何工作要做,因此它也不需要从空闲进程切换出去。
查看 CPU 的统计信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27# vmstat -s
8154996 K total memory
4708364 K used memory
4381364 K active memory
1143528 K inactive memory
2279356 K free memory
28596 K buffer memory
1138680 K swap cache
2097148 K total swap
254464 K used swap
1842684 K free swap
311995 non-nice user cpu ticks
19 nice user cpu ticks
177708 system cpu ticks
106944705 idle cpu ticks
83711 IO-wait cpu ticks
0 IRQ cpu ticks
11658 softirq cpu ticks
0 stolen cpu ticks
3331980 pages paged in
70847452 pages paged out
9259 pages swapped in
88915 pages swapped out
88736823 interrupts
119830094 CPU context switches
1662321920 boot time
284488 forks如上所示,现在我们来查看 CPU 的统计信息。第一组数据,即
CPU ticks
,显示的是自动启动的 CPU 时间,这里的 tick 是一个时间单位。虽然精简的 vmstat 输出仅显示四个 CPU 状态 – us、sy、id 和 wa,这里则显示了全部 CPU ticks 的分布情况。此外还能看到中断和上下文切换的总数。以及一个新添加的内容forks
,它大体上表示的是从系统启动开始,已经创建的新进程的数量。
top
top 是 Linux 系统监控工具中的瑞士军刀。它善于将相当多的系统整体性能信息放在一个屏幕上。显示的内容还能以交互的方式进行改变,因此在系统运行时,如果一个特定的问题不断突显,则可以修改 top 显示的信息。
默认情况下,top 表现为将一个占用 CPU 最多的进程按降序排列的列表。top 根据指定的延迟定期更新这个列表(其初始值位 3 秒)
top 命令说明
top 命令使用方法:
1
2
3
4# top -h
procps-ng version 3.3.10
Usage:
top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]top 常用的命令行选项:
- -d secs: 统计信息更新的时间间隔;
- -n max: 退出前迭代的次数。top 更新统计信息的次数为 max 次;
- -i: 是否显示空闲进程;
- -b: 以批处理模式运行。通常,top 只显示单屏信息,超出该屏幕的进程不显示。该选项显示全部进程,如果你要将 top 的输出保存为文件或将输出流水给另一个命令行处理,那么该选项很有用;
top 运行时选项:
选项 说明 A 进程信息的另一种显示方式,器内容为各种系统资源最大的消耗者 I 选择 top 是否用系统中的 CPU 数量除以 CPU 使用率
例如,一个系统中有两个 CPU,如果一个进程占用了这两个 CPU,那么这个选项将在 top显示 CPU 使用率为 100% 或 200% 之间切换f 显示配置界面,选择在屏幕上显示哪些统计信息 o 显示配置界面,修改统计信息的显示顺序 top 运行时输出切换选项
选项 说明 1(数字 1) 切换 CPU 使用率是按独立使用率还是按总量显示 l(小写的 L) 切换是否更新和显示平均负载以及正常运行时间信息 top 性能统计信息
选项 说明 us 用户应用程序消耗的 CPU 时间 sy 内核消耗的 CPU 时间 ni 修改过优先级值的进程消耗的 CPU 时间 id 空闲的 CPU 时间 wa 等待 I/O 的 CPU 时间 hi irq 处理程序消耗的 CPU 时间 si softirq 处理程序消耗的 CPU 时间 load average 1min、5min 和 15min 的平均负载 %CPU 特定进程消耗 CPU 时间的百分比 PRI 进程优先级,值越大表示优先级越高。RT 代表任务为实时优先级,该优先级高于标准范围 NI 进程的 nice 值。nice 值越高,系统执行该进程的必要性就越低。具有高 nice 值的进程通常其优先级会非常低 WCHAN 若进程在等待 IO,该项显示其等待的是哪个内核函数 TIME 自进程开始执行起已消耗的总的 CPU 时间(用户和系统) COMMAND 进程正在执行的命令 S 进程当前的状态。这里,进程可以是睡眠状态(S)、运行状态(R)、僵尸状态(要求终止但还未终止)(Z)、不可中断的睡眠状态(D)、或者跟踪状态(T)