Linux iosnoop Latency Heat Maps

I/O 延迟的奇怪模式可以通过折线图和汇总统计数据隐藏,并通过直方图和热图显示。在我之前的文章中,我展示了我的 Linux iosnoop工具,它可以跟踪块设备 I/O 以及时间戳和延迟。这些信息可以可视化,揭示任何奇怪的模式。
例如,我将使用我的trace2heatmap.pl程序(也在github 上)从 iosnoop 输出制作延迟热图。这是我使用的命令,它捕获了开始 (-s) 和结束 (-t) 时间戳:

./iosnoop -ts 90 > out.iosnoop

#更多 out.iosnoop
跟踪块 I/O 90 秒(缓冲)…
STARTs ENDs COMM PID TYPE DEV BLOCK BYTES LATms
6743904.592147 6743904.592316 java 9823 R 202.32 17266904 8192 0.17
6743904.594729 6743904.594907 java 9823 R 202.16 23030152 8192 0.18
6743904.597172 6743904.597402 java 9823 R 202.32 1405848 8192 0.23
6743904.598571 6743904.598745 java 9823 R 202.32 25259784 8192 0.17
[…]
我不会使用开始时间戳 (STARTs),但拥有高分辨率可能对以后的研究有用。
现在将其转换为热图:

git clone https://github.com/brendangregg/HeatMap

cd HeatMap

cat …/out.iosnoop | awk ‘$1 ~ /[1]/ { 打印 $2, $9 }’ | ./trace2heatmap.pl \

--unitslatency=ms --unitstime=s --maxcol=90 --maxlat=100 --grid \
--title="块 I/O 延迟热图" > biolatencyheatmap.svg

您可以根据需要调整各种选项。我将其截断为 100 毫秒 (–maxlat),并添加了一个标题。这使得以下内容(鼠标悬停以获取详细信息,或尝试直接SVG):
伟大的!我使用这些来检查延迟异常值,以及大部分 I/O 的分布。时间在 x 轴上,I/O 延迟在 y 轴上。每次 I/O 的数量和延迟范围由每个块的暗度显示:越暗越暗。
在这种情况下,大部分 I/O 非常快,在 0 到 2 毫秒之间(显示为底部的深红线)。还有高延迟 I/O 云,大约每 9 秒,大约 70 毫秒,创建了多模式分布。仅从平均延迟很难看出它们的存在。
事实证明,这些都是由于单个磁盘造成的,我可以使用 awk 对其进行过滤:

cat …/out.iosnoop | awk ‘$6 == “202,1” { 打印 $2, $9 }’ | …

我还使用以下方法将队列大小减少到这个慢速磁盘:

echo 4 > /sys/block/xvda1/queue/nr_requests

在我之前的博客评论中建议了这种类型的调整,作为对大量写入后面的读取排队导致的 I/O 延迟异常值的一种可能的缓解。这稍微降低了 I/O 延迟异常值的严重性,并且 I/O 云雾化了很多。(此调整也会损害该磁盘的性能,因此不要在不了解它的作用的情况下复制它。)
查看该磁盘的之前(128 个队列长度)和之后(4 个队列长度)延迟热图。
有磁盘 I/O 问题吗?不使用延迟热图吗?你应该!有关更多详细信息,请参阅我的热图页面。

转载翻译自: https://www.brendangregg.com


  1. 0-9 ↩︎