在本文中,我们来看看磁盘的性能指标以及如何查看这些指标。
Linux磁盘性能指标
在衡量磁盘性能时,我们经常提到五个常见指标:利用率、饱和度、IOPS、吞吐量和响应时间。这五个指标是衡量磁盘性能的基本指标。
利用率(Utilization):磁盘处理I/O的时间百分比。过度使用(如超过80%)通常意味着磁盘I/O存在性能瓶颈。
饱和度(Saturation):指磁盘处理I/O的繁忙程度。过度饱和意味着磁盘存在严重的性能瓶颈。当饱和度为100%时,磁盘无法接受新的I/O请求。
IOPS(Input/OutputPerSecond):指每秒I/O请求的数量。
吞吐量(Throughput):每秒I/O请求的大小。
响应时间(Responsetime):指发送I/O请求和接收响应之间的间隔时间。
这里需要注意的是,关于利用率,我们只考虑有无I/O,而不考虑I/O的大小。也就是说,当利用率为100%时,磁盘仍有可能接受新的I/O请求。
一般来说,在为应用选择服务器时,首先要对磁盘的I/O性能进行基准测试,这样才能准确评估磁盘性能,以判断是否能够满足应用的需求。
当然,这需要你在随机读、顺序读、随机写、顺序写等各种应用场景下测试不同I/O大小(通常是512B~1MB之间)的性能。
磁盘I/O观察
首先要观察的是每个磁盘的使用情况。iostat是最常用的磁盘I/O性能观察工具。它提供了各种常用性能指标,例如每个磁盘的利用率、IOPS和吞吐量。当然,这些指标实际上来自/proc/diskstats。
以下是iostat的输出示例:
#-d-xmeansdisplayalldiskI/Operformance$iostat-d-x1Devicer/sw/srkB/swkB/srrqm/swrqm/s%rrqm%wrqmr_awaitw_awaitaqu-szrareq-szwareq-szsvctm%utilloop00.000.000.000.000.000.000.000.000.000.000.000.000.000.000.00loop10.000.000.000.000.000.000.000.000.000.000.000.000.000.000.00sda0.000.000.000.000.000.000.000.000.000.000.000.000.000.000.00sdb0.000.000.000.000.000.000.000.000.000.000.000.000.000.000.00
在上述指标中,您需要注意的是:
%util是我们前面提到的磁盘I/O使用情况
r/s和w/s是IOPS
rkB/s和wkB/s是吞吐量
r_await和w_await是响应时间
您可能已经注意到iostat不能直接获取磁盘的饱和度。事实上,通常没有什么简单的方法可以测量饱和度。但是,您可以将观察到的平均请求队列长度或完成读写请求的等待时间与基准测试(例如通过fio)的结果进行比较,以综合评估磁盘饱和度。
进程I/O观察
除了每个磁盘的I/O情况,每个进程的I/O情况也是大家关注的重点。
上面提到的iostat只提供了观察磁盘的整体I/O性能数据。缺点是无法知道哪些进程正在读写磁盘。要观察进程的I/O,还可以使用pidstat和iotop工具。
例如,要使用pidstat
$pidstat-d113:39:51UIDPIDkB_rd/skB_wr/skB_ccwr/siodelayCommand13:39:521029160.004.000.000rsyslogd
从pidstat的输出可以看出,它可以实时查看每个进程的I/O情况,这包括以下内容:
用户ID(UID)和进程ID(PID)。
每秒读取的数据大小(kB_rd/s),以KB为单位。
每秒发出的写请求数据的大小(kB_wr/s),单位为KB。
每秒取消写入请求的数据大小(kB_ccwr/s),以KB为单位。
块I/O延迟(iodelay),包括等待同步块(synchronizedblock)I/O和换入块(swap-inblock)I/O完成的时间,以时钟周期为单位。
除了使用pidstat实时查看进程磁盘I/O外,还有一个磁盘性能分析的常用方法是根据I/O大小对进程进行排序。为此,我推荐iotop工具。它是一个类似于top的工具,您可以按I/O大小对进程进行排序,并找到具有更大I/O的进程。
$iotopTotalDISKREAD:0.00B/s|TotalDISKWRITE:7.85K/sActualDISKREAD:0.00B/s|ActualDISKWRITE:0.00B/sTIDPRIOUSERDISKREADDISKWRITESWAPINIO>COMMAND15055be/3root0.00B/s7.85K/s0.00%0.00%systemd-journald
从该输出可以看到,前两行分别代表进程的磁盘读写总大小和磁盘的实际读写总大小。由于缓存、缓冲区、I/O合并等因素,它们可能不相等。
剩下的部分从各个角度代表了进程的I/O情况,包括线程ID、I/O优先级、每秒磁盘读取大小、每秒磁盘写入大小、换入百分比和等待I/O时钟百分比。
结论
在本文中,我介绍了Linux磁盘I/O的性能指标和查看性能工具。我们通常使用IOPS、吞吐量、利用率、饱和度和响应时间等几个指标来评估磁盘的I/O性能。
可以使用iostat获取磁盘的I/O情况,也可以使用pidstat、iotop等观察进程的I/O情况。但在分析这些性能指标时,要注意结合读写比率、I/O类型、I/O大小等综合分析。
链