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.
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和iflag
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.
dsync跟sync比较好理解,前者是只同步写数据,sync同时写数据和元数据
但是感觉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慢一些吧。那么自己感觉如果只是写一次的话,两者应该是差别不大的,后来做了下小实验,证实确实是这样的。
在第一个图中,我们只写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如何绕开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/秒
dd命令的conv=fsync,oflag=sync/dsync的更多相关文章
- Linux dd命令中dsync与fdatasync的区别【转】
在Linux系统中经常会使用dd命令来测试硬盘的写入速度,命令会涉及到两个参数:dsync与fdatasync,本文介绍一下其区别. dd if=/dev/zero of=/tmp/1Gbytes b ...
- dd命令的高级应用
dd是Linux上的一个常用的命令.例如:dd if=/1.txt of=/tmp/2.txt (其中, if代表input file:of代表output file, 命令的结果就是将根目录 ...
- 交换分区 在dd命令执行期间 top 其消耗系统约14%的cpu,而mem占比约为0
[资源不友好代码] from pyltp import * d_dir = '/usr/local/ltp_data_v3.4.0/' def gen_one_sentence_part(paragr ...
- dd命令笔记
dd命令 用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换 参数 if=FILE 指定输入源文件, 缺省为标准输入, < if=input file > iflag=FLAGS 指 ...
- Linux 中用 dd 命令来测试硬盘读写速度
dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. dd 命令通用语法格式如下: dd if=path/to/input_file ...
- Linux下使用DD命令测试磁盘读写速度
dd是Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换,所以可以用来测试硬盘的读写能力~ 几种常见的DD命令,先看一下区别~ dd bs=6 ...
- linux dd命令实例讲解
转:http://blog.chinaunix.net/uid-28549627-id-3922282.html 提到linux 系统中的dd命令,各位技术博友大多都很熟悉,用法也是好多,今天主要跟大 ...
- 使用 dd 命令进行硬盘 I/O 性能检测
使用 dd 命令进行硬盘 I/O 性能检测 作者: Vivek Gite 译者: LCTT DongShuaike | 2015-08-28 07:30 评论: 1 收藏: 6 如何使用dd命令测 ...
- 【转】dd命令详解及利用dd测试磁盘性能
dd命令详解及利用dd测试磁盘性能 linux下dd命令详解 名称: dd 使用权限: 所有使用者 manpage 定义: convert and copy a file 使用方式: dd [op ...
随机推荐
- python 列表的递归求和
def list_sum(num_List): : ] else: ] + list_sum(num_List[:]) print(list_sum([, , , , ]))
- Input Size VS Time Complexity
2018-05-01 11:10:54 本文介绍了输入数据规模和时间复杂度上限的关系,可以通过数据规模推算使用算法的类型. < 10: O(n!) permutation < 15: O( ...
- 使用扩展方法(Chapter3 P39-41)
namespace LanguageFeatures { public class ShoppingCart { public List<Product> Products { get; ...
- java中进行四舍五入
在oracle中有一个很好的函数进行四舍五入,round(), select round(111112.23248987,6) from dual; 但是java的Number本身不提供四舍五入的方法 ...
- pycharm 教程(一)安装和首次使用
PyCharm 是我用过的Python编辑器中,比较顺手的一个.而且可以跨平台,在 mac 和 windows 下面都可以用,这点比较好. 首先预览一下 PyCharm 在实际应用中的界面:(更改了P ...
- 毒害一代Java程序猿的HttpClient
前言 2016年以来,越来越多Android开发者使用Retrofit作为HTTP请求框架.原因其一,Google发布Android 6.0 SDK (API 23) 抛弃了HttpClient:其二 ...
- 2019年微信小程序1月TOP100榜单
- ANSI的Escape序列屏幕控制码
http://blog.csdn.net/lano2088/article/details/51985563 https://www.cnblogs.com/pied/p/4175641.html h ...
- 阿里云windows时间同步服务地址
偶然发现的, 记录一下 ntp1.aliyun.com
- 宏使用 Tricks
人为地定义一些"无意义"的宏(宏名本身有意义),以起到提升代码程序的可读性. 1. IN/OUT 指定参数用于输入还是输出: #define IN #define OUT void ...