最近,我尝试使用fio测试我的磁盘。我对fio的配置如下:
[global]
invalidate=0 # mandatory
direct=1
#sync=1
fdatasync=1
thread=1
norandommap=1
runtime=10000
time_based=1
[write4k-rand]
stonewall
group_reporting
bs=4k
size=1g
rw=randwrite
numjobs=1
iodepth=1
在此配置中,您可以看到我将fio配置为使用direct io进行随机写入。测试运行时,我使用iostat来监控I / O性能。我发现:如果我将fdatasync设置为1,那么fio观察到的iops大约是64,而iostat观察到的大约是170.为什么这个不同?如果我没有配置" fdatasync",两个iops大致相同,但更高,大约450.为什么?据我所知,直接io没有通过页面缓存,在我看来,这意味着它应该花费大约相同的时间,无论是否使用fdatasync都无关紧要。
我听说iostat在某些情况下会提出错误的统计数据。那是真的吗?究竟是什么情况会让iostat出错?是否还有其他工具可用于监控I / O性能?
答案 0 :(得分:0)
查看您的作业文件,您似乎没有对块设备进行I / O,而是针对文件系统中的文件。因此,虽然您可能会要求文件系统“将此数据放在该文件中的该位置”,但文件系统可能会变成多个块设备请求,因为它还必须更新与该文件关联的元数据(例如日志,文件时间戳,写入时复制等) )也是。因此,当请求被发送到磁盘(这是您使用iostat测量的)时,原始请求已被放大。
还要记住的是Linux可能有一个ioscheduler用于该磁盘。这可以在提交到磁盘之前重新排列,拆分和合并请求/在堆栈中进一步返回它们。请参阅https://www.kernel.org/doc/Documentation/block/queue-sysfs.txt中nomerges
的不同参数,了解如何避免某些合并/重新排列,但请注意,您无法控制过大的请求的拆分(但文件系统不会过大的请求)。
(PS:我不知道iostat是“错误的”所以你可能需要问那些直接说出来的人,以找出他们的意思)