stdev.p和stdev.s的区别(深入理解 linux磁盘顺序写、随机写)

一、引言
在数据写入过程中,随机写和顺序写是两种常见的写入方式。随机写会导致磁头频繁更换磁道,从而影响效率;而顺序写则让磁头几乎无需换道或换道时间极短。本文将详细探讨这两种写入方式的差异以及相关的内核调用机制。
二、随机写与顺序写的差异
1. 随机写:随机写是指数据写入时,磁头需要频繁更换磁道以定位到不同的写入位置。这种写入方式会导致磁头移动距离增加,从而增加了寻道时间,降低了整体写入效率。随机写还可能导致数据碎片化,进一步影响存储性能。
2. 顺序写:与随机写相反,顺序写是指数据按照顺序写入磁盘。在这种写入方式下,磁头几乎不需要更换磁道,或者换道时间很短。顺序写具有较高的写入效率,且有助于减少数据碎片化,提高磁盘的整体性能。
三、内核调用
1. 随机写的内核调用:在随机写的情况下,操作系统需要处理大量的磁盘I/O请求,并根据请求的位置调度磁头进行读写。这涉及到复杂的调度算法和磁盘管理策略。
2. 顺序写的内核调用:对于顺序写,由于数据写入的位置是连续的,内核可以更有效地处理I/O请求,减少调度开销,提高写入性能。一些操作系统还针对顺序写进行了优化,以提高写入效率。
二、环境准备
三、fio简介
通过fio测试,我们能够了解读写过程中的状态。我们需要关注fio输出报告中的几个关键指标:
slat:指的是从I/O提交到实际执行I/O的时长(Submission latency)
clat:指的是从I/O提交到I/O完成的时长(Completion latency)
lat:指的是从fio创建I/O到I/O完成的总时长
bw:吞吐量
iops:每秒I/O的次数
四、同步写测试
1. 同步随机写
我们使用fio作为测试工具,为了观察系统调用,我们采用strace工具。测试随机写入的命令如下:
bash
strace -f -tt -o /tmp/randwrite.log -D fio -name=randwrite -rw=randwrite
-direct=1 -bs=4k -size=1G -numjobs=1 -group_reporting -filename=/tmp/test.db
提取关键信息:
(1)clat,平均时长约56ms
(2)lat,平均时长约56ms
(3)bw,吞吐量,大约在52M左右
再来看内核调用信息:
每次随机写入前,都会通过lseek定位当前的文件偏移量。
2. 同步顺序写
使用同样的方法测试顺序写:
bash
strace -f -tt -o /tmp/write.log -D fio -name=write -rw=write
-direct=1 -bs=4k -size=1G -numjobs=1 -group_reporting -filename=/tmp/test.db
可以看到:
吞吐量提升至70M左右
再来看一下内核调用:
由于顺序写,无需反复定位文件偏移量,所以能够专注于写操作。
五、slat指标
从上述测试,我们在fio的测试报告中,并没有发现slat的身影,那是因为上述都是同步操作。对于同步I/O来说,由于I/O提交和I/O完成是一个动作,所以slat实际上就是I/O完成的时间。
异步顺序写,将同步顺序写的命令添加-ioengine=libaio:
bash
fio -name=write -rw=write -ioengine=libaio -direct=1 -bs=4k -size=1G -numjobs=1 -group_reporting -filename=/tmp/test.db
可以看到,slat指标出现,lat近似等于slat + clat之和;并且换成异步io之后,吞吐量得到了极大的提升,120M左右。
fio应该作为磁盘的基线工具,拿到机器(物理机或者云机器)都应该第一时间对机器的磁盘做一个基线测试,做到心中有数。本文所有的测试,都是绕开了缓存,在实际应用中需要将缓存的影响考虑进去。
老男孩IT,致力于分享最有用的IT干货。我们热切期待与您一同成长,共同追求卓越!如果您给我们发送后台私信并输入数字“1”,我们将赠送给您一份珍贵的礼物——包含超过5000G的学习资源大礼包(其中包括实用培训视频、精选软件和内部学习资料)。让我们一起携手,让IT学习变得更加轻松简单!。
