
写入速度:
时间dd if = / dev / zero of = test.dbf bs = 8k count = 300000
/ dev / zero是伪设备,它仅生成一个空字符流,不生成IO,因此IO将集中在file的of中,该file的仅用于写入,因此此命令相当于测试磁盘的写容量。
输出结果相似(因为通常更长的测试时间更准确,因此您可以将计数设置为更大):
300000 + 0条记录
300000 + 0条记录
真实0m36.669s
用户0m0.185s
sys 0m9.340s
所以写速度是:8 * 300000/1024/36.669 = 63.916M / s
阅读速度:

时间dd if = / dev / sda1 of = / dev / null bs = 8k
因为/ dev / sdb1是一个物理分区,从中读取将生成IO,而/ dev / null是伪设备,等效于黑洞。当设备不生成IO时,此命令的IO仅出现在/ dev / sdb1上,这相当于测试磁盘的读取容量
输出类似:
448494 + 0条记录在
448494 + 0记录了
真实0m51.070s
用户0m0.054s
sys 0m10.028s
因此sda1上的读取速度为:8 * 448494/1024/51.070 = 68.61M / s
dd
dd命令是一个非常强大的命令。对于某些相对较低级别的问题,使用dd命令通常可以得到意外的结果。我们可以使用它来测试磁盘的读写性能。我一直以为他只能测试块设备,但是今天我看到一篇文章说,他可以同时测试文件系统(IOzone也可以测试文件系统和块设备,但是IOmeter不能用于测试文件系统)。

对于dd命令,两个常用的设备是/ dev / null / dev / zero。为避免涉及本文的主题,请参阅此处的特殊设备说明:
dd的某些参数很难理解。今天花了两个小时才能弄清楚conv = conv = fsync,oflag = sync / dsync的设置。后两个比较好区分,前两个不容易区分
我们知道,使用dd来测试硬盘的读写速度只能提供大致的测试结果,它是连续IO而不是随机IO。从理论上讲,文件大小越大,测试结果越准确。理论上,bs越大,测量的性能越高
如何真正写入磁盘
dd if = / dev / zero of = test bs = 64k count = 16k这是不准确的,因为在命令结束时实际上并未将数据写入磁盘,因为我们通常在到达磁盘时首先写入磁盘缓存,它将返回。
让我们看一下dd帮助页面中一些参数的说明
FLAG参数(有关完整信息,请参见手册,此处假设您知道iflag和oflag)
-dsync
对数据使用同步I / O。对于输出文件,这会强制在每次写入时对输出数据进行物理写入。对于输入文件,当从已由其他进程同步写入的远程文件中读取时,此标志可能很重要。元数据
(例如,上次访问时间和上次修改时间)不一定要同步。
-sync同样,但也适用于元数据

CONV参数
-fsync
在完成之前同步输出数据和元数据。这将强制对输出数据和元数据进行物理写入
Dsync和sync可以更好地理解。前者仅同步写入数据,而sync同时写入元数据
但是dsync和-fsync感觉如何?说法是dd if = / dev / zero of = test bs = 64k count = 4k oflag = dsync这可以看作是模拟的插入操作,因此它很慢,但仍不清楚。
稍后,我仔细地选择了这个英语术语conv = fsync在完成操作之前同步输出数据和元数据,这意味着在dd命令结束之前同步数据和元数据,因此每次编写时是否同步?也就是说,如果我们在dd命令中写了100次,他可能会等到最后一次将它们同步到磁盘上。并且oflag = dsync表示使用同步
数据的I / O。对于输出文件,这会强制在每次写入时对输出数据进行物理写入,请注意单词在每次写入时均对输出数据进行物理写入,也就是说,每次他写入时都要等到下一次写入磁盘时,也就是说,如果我们使用dd写入100次,则每次他写入磁盘时,都会执行下一次写入。因此,这当然比conv = fsync慢。因此,我觉得如果只编写一次,则两者之间应该没有什么区别。后来,我做了一个小实验,确认确实如此。
在第一张图片中,我们仅写入1个块,然后使用oflag = sync和conv = fsync来测量一个为32.1kb / s,另一个为37.8kb / s。没有什么区别。但是下一个我写的1000,conv = fsync显然比oflag = dsync / sync快得多,所以我认为对上述英语推论的理解应该是正确的。
因此,在使用dd进行读取或写入时,如果需要将数据写入磁盘,则应注意自己的使用情况

dd if = / dev / zero of = test bs = 64k count = 16k是不准确的
如果dd if = / dev / zero of = test bs = 64k count = 16k conv = fsync更准备,他将在dd结束前写入磁盘,
并且dd if = / dev / zero of = test bs = 64k count = 4k oflag = dsync或sync是每次写入磁盘一次,因此您实际上可以听到磁盘弹出的声音。
dd如何绕过缓存
如果要避免文件系统缓存,直接读写,不使用缓冲区缓存,则需要进行此设置
iflag = direct,nonblock
oflag = direct,nonblock
iflag = cio
oflag = cio
直接模式是将写请求直接封装到io命令中,然后将其发送到磁盘
在非直接模式下,将数据写入系统缓存,然后将io视为成功,然后操作系统确定何时将缓存中的数据写入磁盘
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/dianqi/article-336613-1.html
希望抓住机会
放在衣柜的抽屉里
表示农民老了只能喝水了