监控磁盘IO性能的工具
最多存储监视工具。
如何通过示例监视磁盘IO性能。
如何在Linux上检查磁盘读写情况。
使用iostat,vmstat和其他工具检查和监视Linux中的磁盘IO统计信息和磁盘状态。
如何在Linux中按进程ID监视磁盘IO。
存储监控工具。
通过示例获取Linux中磁盘读写操作的详细信息。
在本文中,将介绍各种工具以及用于监视Linux环境中磁盘IO性能的示例。
提示:
我正在运行一个虚拟进程,以使用如下所示的dd命令和压力工具执行一些读取和写入操作。
# while true; do cp loadfile loadfile1; done
1. iostat-报告磁盘IO统计信息
isoatat是sysstat rpm的一部分。
我们可以根据环境使用" yum"或者任何其他工具来安装" sysstat"。
# rpm -q sysstat sysstat-10.1.5-17.el7.x86_64
iostat总结了每个磁盘的I/O统计信息,提供了IOPS,吞吐量,I/O请求时间和利用率的指标。
它可以由任何用户执行,通常是第一个用于监视磁盘io性能并在命令行上调查磁盘IO统计信息和问题的命令。
iostat提供了许多用于定制输出的选项。
一个有用的组合是-dxz 1,仅显示磁盘利用率(-d),扩展列(-x),跳过零度量标准的设备(-z)和每秒输出。
# iostat -dxz 1 Linux 3.10.0-1062.9.1.el7.x86_64 (rhel-fews-cc) 01/07/2017 _x86_64_ (32 CPU) Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.28 1.35 2.34 8.52 36.45 510.13 100.68 0.06 5.36 3.79 5.79 0.17 0.18 dm-0 0.00 0.00 0.95 0.06 3.81 0.23 8.00 0.00 2.10 1.60 10.66 0.62 0.06 dm-1 0.00 0.00 1.65 9.81 30.58 509.90 94.31 0.06 5.32 6.07 5.19 0.12 0.14 dm-2 0.00 0.00 1.65 9.81 30.58 509.90 94.31 0.06 5.32 6.07 5.19 0.12 0.14 dm-3 0.00 0.00 1.65 9.80 30.63 508.68 94.17 10.69 933.11 12.15 1088.51 0.16 0.18
这些列概述了所应用的工作负载。
我们可以查看iostat手册页以了解每一列的含义。
2. vmstat-报告虚拟内存统计信息
vmstat是另一个监视工具,它是procps-ng rpm的一部分。
很有可能默认情况下在Linux节点上安装了" procps-ng",或者我们也可以使用" yum"手动安装它。
# rpm -q procps-ng procps-ng-3.3.10-23.el7.x86_64
vmstat报告有关进程,内存,页面调度,块IO,陷阱,磁盘和cpu活动的信息。
其中我们将使用vmstat
监视Linux中的磁盘IO性能,并使用-d
间隔1秒。
# vmstat -d 1 1 disk- ------------reads------------ ------------writes----------- -----IO----- total merged sectors ms total merged sectors ms cur sec sda 667530 12447 7660380 2108711 91090178 3458386 12047478760 1506891675 0 11791 dm-0 607338 0 4858728 1760585 206130 0 1649040 5723571 0 1245 dm-1 72135 0 2626562 466444 94344918 0 12045847864 1574232872 0 11050 dm-2 72135 0 2626562 466583 94344918 0 12045847864 1574410699 0 11050 dm-3 72240 0 2630178 905647 94422613 0 12046752440 3064011073 9 12087 dm-4 0 0 0 0 0 0 0 0 0 0
获取有关磁盘活动的摘要磁盘IO统计信息
# vmstat -D 1 1 6 disks 3 partitions 1492064 total reads 12447 merged reads 20407898 read sectors 5711511 milli reading 374572389 writes 3460667 merged writes 48208708608 written sectors 7759736862 milli writing 0 inprogress IO 47247 milli spent IO
请关注vmstat的手册页,以获取受支持参数的完整列表,我们可以使用它们来监视系统资源。
3. iotop-监视磁盘IO速度
iotop专门获取磁盘统计信息,是iotop rpm的一部分。
我们可以根据环境使用" yum"或者任何其他工具来安装" iotop"。
# rpm -q iotop iotop-0.6-4.el7.noarch
iotop监视Linux内核(需要2.6.20或者更高版本)输出的磁盘I/O使用情况信息,并按系统上的进程或者线程显示当前I/O使用情况表。
使用--only
iotop将仅显示实际在执行I/O的进程或者线程,而不显示所有进程或者线程,因此我们可以检查和监视磁盘IO性能。
# iotop --only Total DISK READ : 0.00 B/s | Total DISK WRITE : 1103.25 M/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 699.93 K/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 15091 be/4 root 0.00 B/s 965.33 M/s 0.00 % 99.99 % cp loadfile loadfile1 29926 be/4 root 0.00 B/s 0.00 B/s 0.00 % 15.49 % [kworker/u64:0] 3312 be/3 root 0.00 B/s 137.92 M/s 0.00 % 0.09 % [jbd2/dm-3-]
4. nmon-监视系统统计信息
nmon在RHEL/CentOS的默认存储库中不可用。
我们可以从EPEL存储库进行安装。
在RHEL/CentOS 7上安装整个EPELrepo
# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
并在CentOS/RHEL 8上安装EPEL REPO
# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
接下来,我们可以使用yum命令安装nmon
。
# yum install nmon
另外,我们也可以手动安装nmon
工具
# rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/n/nmon-16g-3.el7.x86_64.rpm
nmon可以显示CPU,内存,网络,磁盘(迷你图形或者数字),文件系统,NFS,主要进程,资源(Linux版本和处理器)以及Power微分区信息。
从终端执行nmon
# nmon
只显示磁盘使用情况统计信息,请按D键。
┌nmon─16g─────────────────────Hostname=rhel-fews-cc─Refresh= 2secs ───18:29.30──────────┐ │ Disk I/O ──/proc/diskstats────mostly in KB/s─────Warning:contains duplicates──────────│ │DiskName Busy Read Write Xfers Size Peak% Peak=R+W InFlight │ │sda 61% 62.0 240088.7KB/s 3712.48 64.7KB 580% 3316396.1KB/s148 │ │sda1 0% 0.0 0.0KB/s 0.0 0.0KB 0% 0.0KB/s 0 │ │sda2 0% 0.0 0.0KB/s 0.0 0.0KB 0% 0.0KB/s 0 │ │sda3 61% 62.0 240088.7KB/s 3712.48 64.7KB 580% 3316396.1KB/s148 │ │dm-0 0% 62.0 0.0KB/s 15.5 4.0KB 58% 1559.6KB/s 0 │ │dm-1 61% 0.0 242871.9KB/s 3794.90 64.0KB 580% 3314548.6KB/s218 │ │dm-2 61% 0.0 242871.9KB/s 3794.90 64.0KB 580% 3314548.6KB/s218 │ │dm-3 61% 0.0 14779.6KB/s 230.92 64.0KB 580% 3145026.3KB/s2181 │ │Totals Read-MB/s=0.2 Writes-MB/s=957.7 Transfers/sec=15261.0 │ └───────────────────────────────────────────────────────────────────────────────────────┘
要使用图来显示磁盘使用情况统计信息
┌nmon─16g──────[H for help]───Hostname=rhel-fews-cc─Refresh= 2secs ───18:25.12──────────┐ │ Disk I/O ──/proc/diskstats────mostly in KB/s─────Warning:contains duplicates──────────│ │DiskName Busy Read WriteMB|0 |25 |50 |75 100| │ │sda 60% 0.4 563.8|RWWWWWWWWWWWWWWWWWWWWWWWWWWWW> | │ │sda1 0% 0.0 0.0|> | │ │sda2 0% 0.0 0.0|> | │ │sda3 59% 0.4 563.8|RWWWWWWWWWWWWWWWWWWWWWWWWWWWW> | │ │dm-0 22% 0.4 0.0|RRRRRRRRRRR> | │ │dm-1 41% 0.0 568.0|WWWWWWWWWWWWWWWWWWWW> | │ │dm-2 41% 0.0 568.0|WWWWWWWWWWWWWWWWWWWW> | │ │dm-3 60% 0.0 511.9|WWWWWWWWWWWWWWWWWWWWWWWWWWWWW> | │ │Totals Read-MB/s=1.1 Writes-MB/s=2775.4 Transfers/sec=44468.8 │ └───────────────────────────────────────────────────────────────────────────────────────┘
5.atop-先进的系统和过程监控器
我们可以使用yum再次安装" atop"(假设我们已经安装了EPEL仓库),或者我们可以手动安装" atop"来检查和监视Linux中的磁盘IO性能。
# rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/a/atop-2.4.0-4.el7.x86_64.rpm
程序" atop"是一个交互式监视器,用于查看Linux系统上的负载。
我们可以使用atop
来按进程监视磁盘IO。
它显示了系统级别上最关键的硬件资源(从性能角度来看)的占用情况,即cpu,内存,磁盘和网络。
# atop
现在按" shift + d"进行磁盘活动,然后按" c"获取完整的命令名称。
PRC | sys 6.08s | user 0.05s | #proc 398 | #tslpu 1 | #zombie 0 | #exit 4 | CPU | sys 54% | user 1% | irq 6% | idle 3026% | wait 114% | ipc 0.80 | CPL | avg1 0.99 | avg5 43.05 | avg15 866.47 | csw 122763 | intr 90675 | numcpu 32 | MEM | tot 125.8G | free 105.4G | cache 17.8G | buff 230.0M | slab 938.9M | hptot 0.0M | SWP | tot 3.7G | free 3.7G | | | vmcom 2.7G | vmlim 66.6G | LVM | rhel-root | busy 69% | read 0 | write 65586 | MBw/s 409.6 | avio 0.10 ms | LVM | pool00_tdata | busy 66% | read 0 | write 63780 | MBw/s 398.3 | avio 0.10 ms | LVM | pool00-tpool | busy 66% | read 0 | write 63780 | MBw/s 398.3 | avio 0.10 ms | LVM | pool00_tmeta | busy 9% | read 494 | write 0 | MBw/s 0.0 | avio 1.87 ms | DSK | sda | busy 69% | read 494 | write 61302 | MBw/s 398.5 | avio 0.11 ms | NET | transport | tcpi 3 | tcpo 2 | udpi 0 | udpo 0 | tcpao 0 | PID TID S DSK COMMAND-LINE (horizontal scroll with <- and -> keys) 1/4 12652 - S 76% -bash 3312 - S 24% jbd2/dm-3-8 27272 - S 0% kworker/u64:3 16016 - D 0% kworker/u64:1 29926 - S 0% kworker/u64:0 16287 - E 0% cp 16290 - E 0% cp
6. collectl-收集描述当前系统状态的数据
CentOS/RHEL的内部存储库中没有collectl
,因此我们可以自己安装EPEL存储库,然后使用yum安装collectl
或者手动安装它。
# rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/c/collectl-4.3.0-5.el7.noarch.rpm
collectl
将收集描述当前系统状态的数据。
我们可以使用collectl
来检查和监视Linux中的磁盘IO性能。
以下命令报告CPU和磁盘IO统计信息。
这里c和d代表CPU和磁盘。
# collectl -scd waiting for 1 second sample... #<----CPU[HYPER]-----><----------Disks-----------> #cpu sys inter ctxsw KBRead Reads KBWrit Writes 0 0 7406 3895 92 23 342208 5347 3 3 2616 2540 20 5 98436 657 0 0 8802 3496 272 68 516096 8064 0 0 1174 620 36 9 65536 1024 2 2 7302 3290 184 46 368640 5760 2 2 17221 6692 500 125 962688 14885
关注collectl的手册页以查看所有受支持的选项。
7. sar-监视磁盘IO性能
sar是另一种著名且广泛使用的方法,它是sysstat rpm的一部分。
我们可以根据环境使用" yum"或者任何其他工具来安装" sysstat"。
# rpm -q sysstat sysstat-10.1.5-17.el7.x86_64
sar是一个功能强大的工具,可用于监视所有系统资源。
但是要坚持本文的主题,我们将使用-d监视磁盘IO性能1秒,间隔为1秒。
# sar -d 1 1 Linux 3.10.0-1062.9.1.el7.x86_64 (rhel-fews-cc) 01/07/2017 _x86_64_ (32 CPU) 06:43:44 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 06:43:45 PM dev8-0 6274.00 400.00 796672.00 127.04 142.20 22.64 0.16 100.00 06:43:45 PM dev253-0 50.00 400.00 0.00 8.00 0.00 0.08 0.08 0.40 06:43:45 PM dev253-1 6225.00 0.00 796800.00 128.00 143.10 22.96 0.16 100.00 06:43:45 PM dev253-2 6225.00 0.00 796800.00 128.00 143.11 22.96 0.16 100.00 06:43:45 PM dev253-3 0.00 0.00 0.00 0.00 4285.03 0.00 0.00 100.00
我们可以查看本文以了解所有这些列以及sar
和ksar
支持的其他选项。
8. blktrace-生成磁盘I/O的跟踪
blktrace
是blktrace
rpm的一部分,应在默认存储库中可用。
我们可以根据环境使用yum
命令或者其他工具进行安装。
# rpm -qa | grep blktrace blktrace-1.0.5-8.el7.x86_64
blktrace是用于跟踪块I/O事件的专用实用程序
每个I/O都打印了多个事件行。
我们还可以按进程监视磁盘IO。
这些列是:
设备主要,次要编号
CPU编号
序列号
动作时间,以秒为单位
进程ID
动作标识符(请参阅blkparse(1)):Q ==排队,G ==获取请求,P ==插入,M ==合并,D ==发出,C ==完成,等等。
RWBS描述(请参阅本章前面的" rwbs"部分):W ==写,S ==同步,等等。
地址+大小[装置]
# btrace /dev/sda 8,3 3 50080 29.219400645 24545 A W 86921600 + 128 <- (253,1) 85174656 8,0 3 50081 29.219400796 24545 A W 95783296 + 128 <- (8,3) 86921600 8,0 3 50082 29.219400987 24545 Q W 95783296 + 128 [kworker/u64:3] 8,0 3 50083 29.219401336 24545 G W 95783296 + 128 [kworker/u64:3] 8,0 3 50084 29.219401617 24545 I W 95783296 + 128 [kworker/u64:3] 8,0 3 50085 29.219401811 24545 D W 95783296 + 128 [kworker/u64:3] <Output trimmed> CPU0 (8,0): Reads Queued: 312, 9,460KiB Writes Queued: 1,430, 91,400KiB Read Dispatches: 198, 9,460KiB Write Dispatches: 1,430, 91,460KiB Reads Requeued: 0 Writes Requeued: 0 Reads Completed: 198, 9,460KiB Writes Completed: 1,430, 91,460KiB Read Merges: 114, 5,176KiB Write Merges: 0, 0KiB Read depth: 34 Write depth: 255 IO unplugs: 167 Timer unplugs: 0 <Output trimmed> Throughput (R/W): 3,714KiB/s/67,320KiB/s Events (8,0): 227,220 entries Skips: 0 forward (0 - 0.0%)
执行结束时,我们将获得磁盘统计信息摘要以及读取和写入操作的吞吐量详细信息。
" Perf tools"是基于Linuxperf_events
(又名perf)和ftrace
的性能分析工具。
9. perf-tools:iolatency
" iolatency"将直方图概括了块设备的I/O延迟,并且是" perf-tools"的一部分,我们可以从以下位置下载" iolatency"脚本
# wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/iolatency
提供对下载脚本的可执行权限
# chmod u+x iolatency
接下来,使用-Q
选项执行脚本,以启用排队时间。
-Q选项通过基于block_rq_insert
而不是block_rq_issue
进行跟踪来包括块I/O排队时间:
# ./iolatency -Q Tracing block I/O. Output every 1 seconds. Ctrl-C to end. >=(ms) .. <(ms) : I/O |Distribution | 0 -> 1 : 32 |# | 1 -> 2 : 0 | | 2 -> 4 : 0 | | 4 -> 8 : 0 | | 8 -> 16 : 0 | | 16 -> 32 : 5605 |######################################| 32 -> 64 : 156 |## | ^C Ending tracing...
此处磁盘延迟介于16 32毫秒之间。
我们可以在官方github页面上获得有关iolatency
的更多示例。
10. perf-tools:iosnoop-按进程监视磁盘IO
iosnoop是perf-tools中的另一个工具。
我们可以从以下路径下载iosnoop脚本
# wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/iosnoop
提供对下载脚本的可执行权限
# chmod u+x iosnoop
它将跟踪磁盘I/O,包括延迟在内的详细信息。
其中我使用-p提供了cp命令的PID,其中ionoop将显示通过进程ID监视磁盘IO的等待时间值。
# ./iosnoop -p $(pidof cp) Tracing block I/O issued by PID 14823. Ctrl-C to end. COMM PID TYPE DEV BLOCK BYTES LATms cp 8893 W 8,0 1214026496 524288 24.65 cp 8893 W 8,0 1214027520 524288 24.74 cp 8893 W 8,0 1214028544 524288 24.82 cp 8893 W 8,0 1214029568 524288 24.90 cp 8893 W 8,0 1214030592 524288 24.99 ^C Ending tracing...
有关更多示例和支持的选项列表,我们可以查看官方的github页面
11. BPF工具
传统的性能工具可提供有关存储I/O的一些见解,包括IOPS速率,平均延迟和队列长度以及按进程的I/O。
BPF跟踪工具可以提供有关磁盘状态的更多信息,并可以用于Linux中的磁盘IO性能。
11.1 BPF前提条件
我们必须安装在rpms以下才能使用BPF
bcc
bpftool
bpftrace
可以从系统存储库中安装bcc
。
确保bcc
rpm版本与加载的内核版本匹配。
因此,我们可以将两个rpm一起安装
# yum install bcc kernel
接下来安装bpftools
和bpftrace
以能够监视磁盘IO性能
# curl https://repos.baslab.org/bpftools.repo
这将下载repo
文件并将其放置在/etc/yum.repos.d/bpftools.repo
中。
现在,我们可以使用yum
安装bpftrace
和bpftools
。
# yum install bpftool bpftrace
有关安装bpftool和bpftrace的更多信息
11.2 biolatency
" biolatency"是一个BCC和" bpftrace"工具,用于显示磁盘IO统计信息,并以直方图表示延迟。
术语设备等待时间是指从向设备发出请求到完成的时间,包括在操作系统中排队的时间。
我们可以使用" biolatency"来检查磁盘统计信息并监视磁盘IO性能。
" biolatency"中的" -D"选项分别显示磁盘统计信息的直方图,以了解每种类型的性能。
# /usr/share/bcc/tools/biolatency -D Tracing block device I/O... Hit Ctrl-C to end. ^C <-- Press Ctrl+C after waiting for few seconds/minutes disk = 'sda' usecs : count distribution 0 -> 1 : 0 | | 2 -> 3 : 0 | | 4 -> 7 : 0 | | 8 -> 15 : 0 | | 16 -> 31 : 0 | | 32 -> 63 : 127 | | 64 -> 127 : 1101 | | 128 -> 255 : 3190 |** | 256 -> 511 : 3855 |** | 512 -> 1023 : 5222 |*** | 1024 -> 2047 : 9027 |** *** | 2048 -> 4095 : 23773 |** **** **** ***** | 4096 -> 8191 : 1256 | |
此输出显示内部磁盘/dev/sda
的磁盘IO统计信息,I/O延迟通常在128到4095微秒之间
11.3 biosnoop
" biosnoop"是一个BCC和" bpftrace"工具,可为每个磁盘IO统计信息打印单行摘要。
它为每个磁盘IO统计信息打印一行输出,包括延迟(从设备问题到完成的时间)的详细信息。
这使我们可以更详细地检查磁盘IO性能:
# /usr/share/bcc/tools/biosnoop -Q TIME(s) COMM PID DISK T SECTOR BYTES QUE(ms) LAT(ms) 0.000000 kworker/u64:1 4434 sda W 708680704 65536 0.00 101.43 0.000097 kworker/u64:1 4434 sda W 708680832 65536 0.00 101.52 0.000190 kworker/u64:1 4434 sda W 708680960 65536 0.00 101.61 0.000252 kworker/u64:1 4434 sda W 708681088 65536 0.00 101.66 0.000265 kworker/u64:1 4434 sda W 708681216 65536 0.00 101.67 0.000285 kworker/u64:1 4434 sda W 708681344 65536 0.00 101.68
" biosnoop"列为:
TIME:秒的I/O完成时间
COMM:进程名称(如果已缓存)
PID:
进程ID,如果已缓存DISK:存储设备名称
T:类型:R ==读,W ==写
SECTOR:
磁盘上的地址,以512字节扇区为单位BYTES:I/O的大小
LAT(ms):从设备问题到设备完成的I/O持续时间
11.4 biotop
" biotop"是一个类似于" top"的BCC工具,但在Linux中用于获取磁盘统计信息和磁盘IO统计信息。
biotop [options] [interval [count]]
选项包括:
-C:
不要清除屏幕-r ROWS:
要打印的行数
# /usr/share/bcc/tools/biotop -C Tracing... Output every 1 secs. Hit Ctrl-C to end 23:23:37 loadavg: 2.17 1.58 0.91 4/630 6711 PID COMM D MAJ MIN DISK I/O Kbytes AVGms 5702 kworker/u64:2 W 8 0 sda 3285 210240 2.62 6120 kworker/u64:0 W 8 0 sda 486 31104 23.37 6709 cp W 8 0 sda 18 9088 39.43 5702 kworker/u64:2 R 8 0 sda 36 144 1.48
列表顶部是kworker
线程启动写操作:这是后台写刷新,并且此时还不知道弄脏页面的实际过程。
11.5 bitesize
bitesize是一个BCC和bpftrace工具,用于显示磁盘IO统计信息的大小。
# /usr/share/bcc/tools/bitesize Tracing block I/O... Hit Ctrl-C to end. ^C Process Name = kworker/u65:0 Kbytes : count distribution 0 -> 1 : 8 |** **** **** **** **** **** **** **** **** **** **| Process Name = jbd2/dm-3-8 Kbytes : count distribution 0 -> 1 : 6 |** **** **** **** **** **** **** **** **** **** **|
该输出显示磁盘状态,即kworker线程和jbd2都在调用I/O,大部分在0到1 KB范围内。
11.6 ext4slower
ext4slower跟踪ext4文件系统并检查ext4文件系统的磁盘IO性能,然后仅打印那些超过阈值的磁盘统计信息。
其他文件系统的bcc
中也存在类似的工具:btrfsslower
,xfsslower
和zfsslower
。
还有fileslower
,它在VFS层上工作并跟踪所有内容(尽管开销更高)。
# /usr/share/bcc/tools/ext4slower Tracing ext4 operations slower than 10 ms TIME COMM PID T BYTES OFF_KB LAT(ms) FILENAME 16:55:38 dd 23317 W 512 319 18446744073708.55 dummy_file
其中我在另一个终端上运行一个" dd"命令,以模拟人造磁盘IO统计信息