背景
测试到性能、压力时,经常需要查看磁盘、网络、内存、cpu的性能值
这里简单介绍下各个指标的含义
一般磁盘比较关注的就是磁盘的iops,读写速度以及%util(看磁盘是否忙碌)
CPU一般比较关注,idle 空闲,有时候也查看wait (如果wait特别大往往是io这边已经达到了瓶颈)
iostat
iostat uses the files below to create reports.
- /proc/stat contains system statistics.
- /proc/uptime contains system uptime.
- /proc/diskstats contains disks statistics.
- /sys contains statistics for block devices.
- /proc/self/mountstats contains statistics for network filesystems.
- /dev/disk contains persistent device names.
注:下面的公式中“Δ”表示两次取样之间的差值,“Δt”表示采样周期。
tps |
每秒I/O次数=[(Δrd_ios+Δwr_ios)/Δt] |
r/s |
每秒读操作的次数=[Δrd_ios/Δt] |
w/s |
每秒写操作的次数=[Δwr_ios/Δt] |
rkB/s |
每秒读取的千字节数=[Δrd_sectors/Δt]*[512/1024] |
wkB/s |
每秒写入的千字节数=[Δwr_sectors/Δt]*[512/1024] |
rrqm/s |
每秒合并读操作的次数=[Δrd_merges/Δt] |
wrqm/s |
每秒合并写操作的次数=[Δwr_merges/Δt] |
avgrq-sz |
每个I/O的平均扇区数=[Δrd_sectors+Δwr_sectors]/[Δrd_ios+Δwr_ios] avgrq-sz这个值反应了用户的IO-Pattern。我们经常关心,用户过来的IO是大IO还是小IO,那么avgrq-sz反应了这个要素。它的含义是说,平均下来,这这段时间内,所有请求的平均大小,单位是扇区,即(512字节)。 |
avgqu-sz |
平均未完成的I/O请求数量=[Δtime_in_queue/Δt] 手册上说是队列里的平均I/O请求数量,更恰当的理解应该是平均未完成的I/O请求数量。 |
await |
每个I/O平均所需的时间=[Δrd_ticks+Δwr_ticks]/[Δrd_ios+Δwr_ios] 不仅包括硬盘设备处理I/O的时间,还包括了在kernel队列中等待的时间。 |
r_await |
每个读操作平均所需的时间=[Δrd_ticks/Δrd_ios] |
w_await |
每个写操作平均所需的时间=[Δwr_ticks/Δwr_ios] |
%util |
该硬盘设备的繁忙比率=[Δio_ticks/Δt] 表示该设备有I/O(即非空闲)的时间比率,不考虑I/O有多少,只考虑有没有 |
svctm |
表面看是每个IO请求的服务时间,不包括等待时间,但是实际上,这个指标已经废弃。实际上,iostat工具没有任何一输出项表示的是硬盘设备平均每次IO的时间 |
diskstats
disk参数取值位置
每一列的含义,此处都是累加值。
1 - major number | 主号码 |
2 - minor mumber |
小号码 |
3 - device name |
设备名 |
4 - reads completed successfully |
读取成功 iops总 |
5 - reads merged |
为了效率可能会合并相邻的读和写。从而两次4K的读在它最终被处理到磁盘上之前可能会变成一次8K的读,才被计数(和排队),因此只有一次I/O操作。这个域使你知道这样的操作有多频繁。 |
6 - sectors read |
读扇区大小,成功读过的扇区总次数。 |
7 - time spent reading (ms) |
读花费的毫秒数,这是所有读操作所花费的毫秒数(用__make_request()到end_that_request_last()测量) |
8 - writes completed |
写入完成 iops总 |
9 - writes merged |
为了效率可能会合并相邻的读和写。从而两次4K的读在它最终被处理到磁盘上之前可能会变成一次8K的读,才被计数(和排队),因此只有一次I/O操作。这个域使你知道这样的操作有多频繁。 |
10 - sectors written |
写扇区大小 |
11 - time spent writing (ms) |
写操作花费的毫秒数 --- 写花费的毫秒数,这是所有写操作所花费的毫秒数(用__make_request()到end_that_request_last()测量)。 |
12 - I/Os currently in progress |
正在处理的输入/输出请求数 -- -I/O的当前进度,只有这个域应该是0。当请求被交给适当的request_queue_t时增加和请求完成时减小。 |
13 - time spent doing I/Os (ms) |
输入/输出操作花费的毫秒数 ----花在I/O操作上的毫秒数, (io_ticks)该设备用于处理I/O的自然时间(wall-clock time) |
14 - weighted time spent doing I/Os (ms) |
输入/输出操作花费的加权毫秒数 ----- 加权, 花在I/O操作上的毫秒数,在每次I/O开始,I/O结束,I/O合并时这个域都会增加。这可以给I/O完成时间和存储那些可以累积的提供一个便利的测量标准。 (time_in_queue): 对字段#10(io_ticks)的加权值
|
Kernel 4.18+ appends four more fields for discard
tracking putting the total at 18:
15 - discards completed successfully
16 - discards merged
17 - sectors discarded
18 - time spent discarding
Kernel 5.5+ appends two more fields for flush requests:
19 - flush requests completed successfully
20 - time spent flushing
For more details refer to Documentation/admin-guide/iostats.rst
/proc/stat
统计CPU信息
每一列的含义如下
单位:jiffies)
(jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数,在linux中,一个节拍大致可理解为操作系统进程调度的最小时间片,不同linux内核可能值有不同,通常在1ms到10ms之间)
第一行cpu |
8063919 |
50 |
6066884 |
521788146 |
2486438 |
0 |
407319 |
0 |
0 |
0 |
User | nice | System | Idle | Iowait | Irq | Softirq | Steal | Guest | Guest_nice |
User: |
用户态正常进程执行时间比 CPU一共花了多少比例的时间运行在用户态空间或者说是用户进程(running user space processes)。典型的用户态空间程序有:Shells、数据库、web服务器…… |
Nice |
代表低优先级用户态CPU时间比,就是进程nice值被调整为1-19之间的CPU时间。 这里注意,nice可取值范围是-20到19,数值越大,优先级反而越低。 |
System |
进程在内核态的执行时间比 System表示:CPU花了多少比例的时间在内核空间运行。分配内存、IO操作、创建子进程……都是内核操作。这也表明,当IO操作频繁时,System参数会很高。
|
Idle |
空闲时间比。注意,它不包括等待I/O的时间(iowait) |
Iowait |
代表等待i/o的cpu时间 读写磁盘的操作远比CPU运行的速度要慢,CPU负载处理数据,而数据一般在磁盘上需要读到内存中才能处理。当CPU发起读写操作后,需要等着磁盘驱动器将数据读入内存,从而导致CPU 在等待的这一段时间内无事可做。CPU处于这种等待状态的时间由Wait参数来衡量 |
Irq (hi) Interrupt Request |
代表处理硬中断的CPU时间, 硬件中断是从磁盘和网络接口等各种外围设备发送到CPU的物理中断。 中断其实就是由硬件或软件所发送的一种称为IRQ(中断请求)的信号 irqbalance是一个linux的实用程序,它主要是用于分发中断请求到CPU核心上,有助于性能的提升。它的目的是寻求省电和性能优化之间的平衡。 硬件中断实际上将导致CPU停止正在执行的操作并继续处理该中断。 |
Softirq (si) |
代表处理软中断的CPU时间。
这些中断是在CPU执行指令(也就是说在进程正在运行的时候)的时候产生的,因为在执行指令时,CPU(确切的说应是在CPU中的运算器)自身会产生一个异常(此处的异常也可理解为软中断)。例如,一个数字除以0(当然这是不可能的),此时就会导致一个divide-by-zero的异常,从而导致计算机将此计算取消或者显示一个错误 的信息 软件中断不是在CPU级别上发生,而是在内核级别上发生。 |
steal |
代表当系统运行在虚拟机中的时候,被其他虚拟机占用的CPU时间。(被盗) |
Guest |
代表通过虚拟化运行其他操作系统时间,也就是运行虚拟机的cpu时间。 比如机器启动了虚拟机,那么虚拟机使用的cpu就会在这里展示 |
Guest_nice |
代表以低优先级运行虚拟机的时间。 |
有什么不对的地方,望指正