测量和解决Linux磁盘I/O资源使用情况

时间:2020-03-21 11:46:18  来源:igfitidea点击:

在Debian Linux服务器上测量磁盘使用率并确定利用最大I/O带宽的进程。

安装性能监控工具

如果尚未安装,请安装sysstat和iotop:

# apt-get update && apt-get install sysstat iotop

对于RHEL/CentOS,请执行以下操作:

# yum install -y sysstat iotop

sysstat软件包包含我们今天将使用的sar和iostat系统性能工具。

确保在'/etc/default/sysstat'中启用了sar。
如果未启用,请执行此操作。

我们可能还希望将“/etc/sysstat/sysstat”中的历史记录值更改为不同于7天的值:

HISTORY=60

请注意,如果值大于28,则日志文件将保存在多个目录中,每个月一个。

默认情况下,sysstat将每10分钟收集一次数据。
我们可以通过修改cronjob'/etc/cron.d/sysstat'来更改此设置。

最后,重新启动服务:

# service sysstat restart

测量磁盘I/O使用率

iostat的磁盘使用率

iostat命令可以生成三种类型的报告:

  • CPU使用率报告(请查看此帖子以了解使用情况)。
  • 设备利用率报告。
  • 网络文件系统报告。

本文超出了使用CPU和NFS利用率报告的范围。

以一秒为间隔显示磁盘sda的三个设备利用率(-d)报告(以兆字节(-m)为单位)。
请注意,iostat生成的第一个报告给出了自启动时间以来的平均值。

$iostat -d sda -m 1 3
Linux 3.2.0-4-686-pae (flames) 	23/02/14 	_i686_	(2 CPU)
Device:

tps   MB_read/s   MB_wrtn/s   MB_read   MB_wrtn
sda

12.44

0.27

0.24    113018     97399
Device:

tps   MB_read/s   MB_wrtn/s   MB_read   MB_wrtn
sda

850.00

104.79

0.00

104

0
Device:

tps   MB_read/s   MB_wrtn/s   MB_read   MB_wrtn
sda

869.00

106.22

0.00

106

0

显示以下值(根据手册页):

  • tps:指示每秒发送到设备的传输次数。传输是对设备的I/O请求。可以将多个逻辑请求合并为对设备的单个I/O请求。
  • MB_read/s:表示从设备读取的数据量,以每秒的兆字节数表示。
  • MB_wrtn/s:表示写入设备的数据量,以每秒兆字节为单位。
  • MB_read:读取的总兆字节数。
  • MB_wrtn:写入的总兆字节数。

上面的iostat报告表明,某些应用程序正在以约104 MB/s的速度从sda磁盘读取数据。

以一秒为间隔显示设备sda的三个设备利用率(-d)报告,这些报告以兆字节(-m)为单位的扩展(-x)统计信息:

显示以下值(根据手册页):

  • rrqm/s:每秒合并到队列中的读取请求的数量。
  • wrqm/s:每秒排队到设备中的合并写入请求的数量。
  • r/s:设备每秒完成的读取请求的数量(合并后)。
  • w/s:设备每秒完成的写入请求数(合并后)。
  • rMB/s:每秒从设备读取的兆字节数。
  • wMB/s:每秒写入设备的兆字节数。
  • avgrq-sz:发出到设备的请求的平均大小(以扇区为单位)。
  • avgqu-sz:发出到设备的请求的平均队列长度。
  • await:发出给要服务的设备的I/O请求的平均时间(以毫秒为单位)。这包括队列中的请求所花费的时间以及为请求服务所花费的时间。
  • r_await:发出到要服务的设备的读取请求的平均时间(以毫秒为单位)。这包括队列中的请求所花费的时间以及为请求服务所花费的时间。
  • w_await:发布到要服务的设备的写请求的平均时间(以毫秒为单位)。这包括队列中的请求所花费的时间以及为请求服务所花费的时间。
  • svctm:发出给设备的I/O请求的平均服务时间(以毫秒为单位)。已过时,将在将来的sysstat版本中删除。
  • %util:向设备发出I/O请求的CPU时间百分比(设备的带宽利用率)。

对磁盘性能问题进行故障排除时要注意的重要字段以蓝色标记。

%util值接近100%可能表示设备饱和。
最好用SD卡来说明。
举例来说,我们在'/mnt/temp'上安装了8GB的非品牌microSD(SDHC)卡:

$df -h | grep mmc
/dev/mmcblk0p1 7.4G 6.6G 905M 89% /mnt/temp

然后发出以下dd命令以在卡上创建image.iso文件:

$dd if=/dev/zero of=/mnt/temp/image.iso bs=1k count=500k

以下是microSD设备的扩展iostat命令统计信息(以兆字节为单位),在将image.iso文件写入卡时捕获:

我们可能会注意到,发给microSD卡的写请求(w_await)的平均时间约为2.6秒。
实际写入速度(wMB/s)为3.5MB/s。
CPU时间(%util)为100%,表示处理器正在等待I/O请求。

iotop的磁盘使用率

iotop命令显示每个进程读取和写入的I/O带宽的动态实时视图。
也可以使用非交互模式。
一般来说,iotop是一个非常容易使用的类似顶部的磁盘I/O监视器。

以一秒钟的间隔(-d1)显示三个迭代(-n3),仅显示(-o)实际执行I/O的进程或者线程,并在第一次迭代(-q)上打印列名称:

# iotop -o -q -d1 -n3
Total DISK READ:

32.61 M/s | Total DISK WRITE:

0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN

IO    COMMAND
 3892 be/4 sandy

33.94 M/s    0.00 B/s  0.00 %  0.00 % dd if=/tmp/image.iso of=/dev/null
Total DISK READ:     103.46 M/s | Total DISK WRITE:

0.00 B/s
 3892 be/4 sandy     103.46 M/s    0.00 B/s  0.00 % 25.10 % dd if=/tmp/image.iso of=/dev/null
Total DISK READ:     102.81 M/s | Total DISK WRITE:

0.00 B/s
 3892 be/4 sandy     102.69 M/s    0.00 B/s  0.00 % 27.24 % dd if=/tmp/image.iso of=/dev/null

如果未传递任何参数,则iotop将以交互模式启动。

vmstat的磁盘使用率

我想说vmstat命令不是用来对磁盘I/O性能进行故障排除的工具之一,这没错。
但是,对于全面了解系统上发生的事情来说,这是极好的。

vmstat的vm模式显示有关磁盘使用情况的非常基本的信息:

$vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0  33300  15648  64196 589664    0    0     6    33   27    2  2  1 97  1
 0  1  33300  14160  64196 590976    0    0 99572     0 1421 2076  9 31 48 11
 1  0  33300  14036  64180 590956    0    0 98484     0 1450 2092  8 31 49 12

I/O活动标记为蓝色。
显示以下值:

  • bi:从块设备接收的块(块/秒)。
  • bo:发送到块设备的块(块/秒)。

我真正喜欢vmstat的地方是能够显示有关分区(-p)的详细统计信息:

$vmstat -p sda2
sda2

reads   read sectors  writes    requested writes

2901080  269345106    3152170  240487152

显示的值具有以下含义:

  • 读取数:发出到该分区的读取总数。
  • 读取扇区:分区的总读取扇区。
  • 写入:发出到该分区的写入总数。
  • 请求的写入:对分区的写入请求总数。

sar的磁盘使用情况

Sar是一个了不起的工具,用于收集,报告和保存系统活动信息。
Sar可以显示实时使用情况以及提取历史数据以进行故障排除和/或者容量规划。

每隔一秒钟显示三个打印精美的(-p)块设备(-d)活动报告:

$sar -d -p 1 3
Linux 3.2.0-4-686-pae (flames) 	24/02/14 	_i686_	(2 CPU)
20:20:19  DEV

tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz  await  svctm  %util
20:20:20  sda   911.00 232936.00

0.00    255.69

1.15   1.27   1.06  96.40
20:20:20  DEV

tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz  await  svctm  %util
20:20:21  sda   904.00 230880.00

0.00    255.40

1.16   1.28   1.06  96.00
20:20:21  DEV

tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz  await  svctm  %util
20:20:22  sda   896.00 228864.00     48.00    255.48

1.24   1.31   1.08  96.80
Average:  DEV

tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz  await  svctm  %util
Average:  sda   903.67 230893.33     16.00    255.52

1.18   1.29   1.07  96.40

该报告显示以下字段(按手册页):

  • tps:指示每秒发送到设备的传输次数。
  • rd_sec/s:从设备读取的扇区数。扇区的大小为512字节。
  • wr_sec/s:写入设备的扇区数。扇区的大小为512字节。
  • avgrq-sz:发出到设备的请求的平均大小(以扇区为单位)。
  • avgqu-sz:发出到设备的请求的平均队列长度。
  • await:发出给要服务的设备的I/O请求的平均时间(以毫秒为单位)。这包括队列中的请求所花费的时间以及为请求服务所花费的时间。
  • svctm:发出给设备的I/O请求的平均服务时间(以毫秒为单位)。已过时,将在将来的sysstat版本中删除。
  • %util:向设备发出I/O请求的CPU时间百分比(设备的带宽利用率)。当该值接近100%时,将发生设备饱和。

我们可能会注意到,“ sar -d”命令报告的大多数值与“ iostat -d”相同。
另一方面,sar具有提取历史数据的另一个优势。

提取开始(-s)1 PM和结束(-e)2 PM时间间隔的漂亮打印(-p)块设备(-d)历史统计记录:

$sar -d -p -s 13:00:00 -e 14:00:00
Linux 3.2.0-4-686-pae (flames) 	24/02/14 	_i686_	(2 CPU)
13:05:01   DEV    tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz  await  svctm  %util
13:15:01   sda   5.37

0.00    295.39     55.02

0.02   3.95   1.29   0.69
13:25:01   sda   5.44

0.00    299.61     55.03

0.02   4.18   1.33   0.72
13:35:01   sda   5.14

0.00    287.16     55.83

0.02   4.10   1.34   0.69
13:45:01   sda   5.43

0.00    298.31     54.94

0.02   4.10   1.22   0.66
13:55:01   sda   5.54

0.00    305.46     55.12

0.02   3.96   1.24   0.69
Average:   sda   5.39

0.00    297.19     55.18

0.02   4.06   1.28   0.69

Sar还可以报告I/O和传输速率统计信息(-b)以及分页统计信息(-B),请查看sar的信息页以了解更多信息。