linux iostat监控学习,包含/proc/diskstats、/proc/stat简单了解

时间:2024-05-19 20:25:58

背景

测试到性能、压力时,经常需要查看磁盘、网络、内存、cpu的性能值

这里简单介绍下各个指标的含义

一般磁盘比较关注的就是磁盘的iops,读写速度以及%util(看磁盘是否忙碌)

CPU一般比较关注,idle 空闲,有时候也查看wait (如果wait特别大往往是io这边已经达到了瓶颈)

iostat 

linux iostat监控学习,包含/proc/diskstats、/proc/stat简单了解

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参数取值位置

linux iostat监控学习,包含/proc/diskstats、/proc/stat简单了解

每一列的含义,此处都是累加值。

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信息

linux iostat监控学习,包含/proc/diskstats、/proc/stat简单了解

每一列的含义如下

单位: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

代表以低优先级运行虚拟机的时间。

 

有什么不对的地方,望指正