linux 性能测试磁盘状态监测:iostat监控学习,包含/proc/diskstats、/proc/stat简单了解
背景测试到性能、压力时,经常需要查看磁盘、网络、内存、cpu的性能值这里简单介绍下各个指标的含义一般磁盘比较关注的就是磁盘的iops,读写速度以及%util(看磁盘是否忙碌)CPU一般比较关注,idle 空闲,有时候也查看wait (如果wait特别大往往是io这边已经达到了瓶颈)iostatiostat uses the files below to create ...
背景
测试到性能、压力时,经常需要查看磁盘、网络、内存、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 | 代表以低优先级运行虚拟机的时间。 |
有什么不对的地方,望指正
更多推荐
所有评论(0)