测量和解决Linux磁盘I/O资源使用情况
在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的信息页以了解更多信息。