dd命令的conv=fsync,oflag=sync/dsync

conv的参数有

1.sync

Pad every input block to size of 'ibs' with trailing zero bytes. When used with 'block' or 'unblock', pad with spaces instead of zero bytes.shell

2.fdatasync

Synchronize output data just before finishing. This forces a physical write of output data.数据库

3.fsync

Synchronize output data and metadata just before finishing.This forces a physical write of output data and metadata.缓存

flag的参数有

flag分为oflag和iflagasync

1.direct

2.dsync

Use synchronized I/O for data. For the output file, this forces a physical write of output data on each write. For the input file, this flag can matter when reading from a remote file that has been written to synchronously by some other process. Metadata (e.g., last-access and last-modified time) is not necessarily synchronized.测试

3.sync

Use synchronized I/O for both data and metadata.this

 

dsync跟sync比较好理解,前者是只同步写数据,sync同时写数据和元数据spa

可是感受dsync与 -fsync怎么感受有些同样? 网上的说法是  dd if=/dev/zero of=test bs=64k count=4k oflag=dsync 这个能够当成是模拟数据库插入操做,因此很慢,但仍是没太明白。操作系统

后来本身认真的抠了这英文用词, conv=fsync  Synchronize output data and metadata just before finishing 意思也就是在dd命令结束前同步data和metadata,那就是否是每一次写都同步一次咯,也就是若是咱们在dd命令中写了100次,他多是等到最后的时候才把他们同步到磁盘。而oflag=dsync是说Use synchronized
I/O for data. For the output file, this forces a physical write of output data on each write,注意这里边用词  a physical write of output data on each write,那就是他是每一次写都得等到这一次写写到了磁盘才进行下一个写,也就是若是咱们使用dd写100次,他每次写都是写到磁盘后才进行下一次写的。因此这样固然要比conv=fsync慢一些吧。那么本身感受若是只是写一次的话,二者应该是差异不大的,后来作了下小实验,证明确实是这样的。code

在第一个图中,咱们只写1块,而后使用oflag=sync与conv=fsync 测出来一个是32.1kb/s 一个是37.8kb/s 差异不大。可是下一个我写1000个,conv=fsync就明显的比oflag=dsync/sync快不少了,因此以为上面本身扣的英文的理解应该是正确的。ci

因此在用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如何绕开cache

若是要规避掉文件系统cache,直接读写,不使用buffer cache,需作这样的设置
iflag=direct,nonblock
oflag=direct,nonblock
iflag=cio
oflag=cio
direct 模式就是把写入请求直接封装成io 指令发到磁盘
非direct 模式,就把数据写入系统缓存,而后就认为io 成功,并由操做系统决定缓存中的数据何时被写入磁盘

 

 

$ dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
记录了4096+0 的读入
记录了4096+0 的写出
268435456字节(268 MB)已复制,48.6814 秒,5.5 MB/秒
$ dd if=/dev/zero of=test bs=8k count=256k conv=fdatasync
记录了262144+0 的读入
记录了262144+0 的写出
2147483648字节(2.1 GB)已复制,41.277 秒,52.0 MB/秒

咱们会发现第一行命令执行完,仅生成了 268 MB 的数据,用时却长达 48+ 秒。 
而第二行命令执行完,虽然生成了 2.1GB 的数据,比第一行命令生成的数据大的多,可是用时却只有 41+ 秒,反而用时少。 
为何呢? 

请注意下 oflag=dsync 参数,这个参数代表每当须要写数据时都会真正到写到磁盘上,等写到磁盘上以后,才会继续开始下一次数据写入。第一行命令要求反复写 4k 次数据,也就是说,会真正写磁盘 4k 次,用时长是理所固然的。 

而第二行命令,虽然总共要写 2.1 GB 的数据,可是因为使用的是 conv=fdatasync 参数,也就是说,当 dd 命令结束前,一次性把全部的数据写到磁盘上,所以写入速度很是快。 

咱们再作一个测试,仍是使用上面两个命令,参数相同,不一样的仅是 count 参数设置为 1,bs 设置为 256 MB。那么根据以前的说明,咱们能够推测,两次测试的结果应该是相近的。 

$ dd if=/dev/zero of=test bs=256MB count=1 oflag=dsync
记录了1+0 的读入
记录了1+0 的写出
256000000字节(256 MB)已复制,3.85186 秒,66.5 MB/秒
$ dd if=/dev/zero of=test bs=256MB count=1 conv=fdatasync
记录了1+0 的读入
记录了1+0 的写出
256000000字节(256 MB)已复制,4.23802 秒,60.4 MB/秒
相关文章
相关标签/搜索