Linux dd命令中dsync与fdatasync的区别【转】
在Linux系统中经常会使用dd命令来测试硬盘的写入速度,命令会涉及到两个参数:dsync与fdatasync,本文介绍一下其区别。
- dd if=/dev/zero of=/tmp/1Gbytes bs=4k count=256000 oflag=dsync
- dd if=/dev/zero of=/tmp/1Gbytes bs=4k count=256000 conv=fdatasync
相信上述两个在Linux系统上使用dd测试磁盘INPUT性能的命令各位都看过,甚至使用过。
两个都是往硬盘中写入1 Gbytes的数据,只是第一个的速度慢的要命。
使用dsync,dd会从/dev/zero中,每次读取4Kbytes数据,然后直接写入到硬盘当中,重复此步骤,直到共读取并且写入了1 Gbytes的数据。
使用fdatasync,dd会从/dev/zero中一次性读取1 Gbytes的数据,写入到磁盘的缓存中,然后再从磁盘缓存中读取,一次性写入到硬盘当中。
/dev/在内存当中,和缓存一样,读取速度都非常快,因此两种方式最终的读取速度对最终的写入速度无任何影响。
换种说法,就是此处不管有没有的硬盘缓存,对IO都不产生任何影响。
那也就是说,两种方式的主要差异就在于多步与一步。
为什么写入速度会有如此大的差异?
看完这个比喻,你就会明白了:
现在有两辆一模一样的车,最高行驶速度为20 M/s,加速度为5 M/s^2,分别为甲车,乙车,他们都要走直线的,1000 M的路程。
甲车每次只能走四米,达到四米就得刹车,乙车可以一次性走完一千米。
相信大家也清楚,甲车还没加速到最高速度,就得刹车,走完这一千米需要不少时间。
而乙车,可以一直加速到其所能达到的最大速率,走完这一千米,花的时间明显比甲少。
因此可以推断,使用dsync,以1 Gbytes为blocksize,次数为一的方式往硬盘中写入1 Gbytes的数据,结果将不会与dd
if=/dev/zero of=/tmp/1Gbytes bs=4k count=256000 conv=fdatasync有太大的差距。
转自
Linux dd命令中dsync与fdatasync的区别 - CSDN博客 http://blog.csdn.net/xiaobluesky/article/details/50706005
dd命令的conv=fsync,oflag=sync/dsync
dd
dd命令是一个非常强大的命令,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果。我们可以用它来测试磁盘的读写性能。之前一直以为他只能测试块设备,但是今天看到一个文章说他同时是可以测试文件系统的(IOzone也是可以测试文件系统跟块设备,但IOmeter是不能用来测试文件系统的)。
而对于dd命令,我们常用到的两个设备就是 /dev/null /dev/zero ,因为避免覆盖此文主题,所以对该特殊设备 见这里说明:http://blog.csdn.net/menogen/article/details/38060003
dd有有些参数是挺难理解的,今天用了两个小时才弄明白了设置conv=conv=fsync,oflag=sync/dsync,后两者比较好区分,前两者不好区分
我们知道 使用dd来测试硬盘读写速度只能提供一个大概的测试结果,而且是连续IO 而不是随机IO ,理论上文件规模越大,测试结果越准确。理论上bs越大,所测得性能越高
如何真正写磁盘
dd if=/dev/zero of=test bs=64k count=16k 这个是不准确的,因为命令结束的时候数据还没有真正写到磁盘上去,因为对磁盘的写,我们一般是先写到了缓存就返回了。
我们来看dd的帮助页面对于一些参数的解释
the FLAG 参数(完整的看手册哦,这里假设你是知道iflag跟oflag的)
-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.
-sync likewise, but also for metadata
the CONV参数
-fsync
Synchronize output data and metadata just before finishing. This forces a physical write of output 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 成功,并由操作系统决定缓存中的数据什么时候被写入磁盘
测试磁盘IO的dd语句
time dd bs=4k count=10k if=/dev/zero of=test oflag=dsync
转自
dd命令的conv=fsync,oflag=sync/dsync | 学步园 http://www.xuebuyuan.com/2163169.html
Linux dd命令中dsync与fdatasync的区别【转】的更多相关文章
- linux free命令中buffer与cache的区别
linux free命令中buffer与cache的区别 2012-05-15 个评论 收藏 我要投稿 linux free命令中buffer与cache的区别 ~$ ...
- linux dd命令实用详解
linux dd命令刻录启动U盘详解 dd命令做usb启动盘十分方便,只须:sudo dd if=xxx.iso of=/dev/sdb bs=1M 用以上命令前必须卸载u盘,sdb是你的u盘,bs= ...
- linux dd命令参数及用法详解---用指定大小的块拷贝一个文件(也可整盘备份)
linux dd命令参数及用法详解---用指定大小的块拷贝一个文件 日期:2010-06-14 点击:3830 来源: 未知 分享至: linux dd命令使用详解 dd 的主要 ...
- linux top命令中各cpu占用率含义
linux top命令中各cpu占用率含义 [尊重原创文章摘自:http://www.iteye.com/topic/1137848]0.3% us 用户空间占用CPU百分比 1.0% sy 内核空间 ...
- linux find命令中-print0和xargs中-0的用法
linux find命令中-print0和xargs中-0的用法. 1.默认情况下, find命令每输出一个文件名, 后面都会接着输出一个换行符 ('\n'), 因此find 的输出都是一行一行的: ...
- (转)linux top命令中各cpu占用率含义及案例分析
原文:https://blog.csdn.net/ydyang1126/article/details/72820349 linux top命令中各cpu占用率含义 0 性能监控介绍 1 确定应用类型 ...
- Linux shell命令中expr
在Linux shell命令中expr虽然不是很起眼,但是它的作用是非常大的!到目前为止,我个人看来最大的作用就是两个——四则运算和字符串的操作. 先说四则运算,在Shell中四则运算不能简简单单的加 ...
- linux dd命令实例讲解
转:http://blog.chinaunix.net/uid-28549627-id-3922282.html 提到linux 系统中的dd命令,各位技术博友大多都很熟悉,用法也是好多,今天主要跟大 ...
- linux dd命令详解
Linux-dd命令详解 dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 名称: dd 使用权限: 所有使用者dd 这个指令在 ...
随机推荐
- php实现文件上传,下载的常见文件配置
配置文件,php.ini uploadfile post_max_size 规定表单上传的最大文件:
- PAT 甲级 1096 Consecutive Factors
https://pintia.cn/problem-sets/994805342720868352/problems/994805370650738688 Among all the factors ...
- ESXi主机性能问题
服务器遇到一个问题 百度了下 基本发现是 四路的 windows 服务器的问题. 造成一些 性能降低. 然后查看了下几个虚拟机 的确是设置的4个虚拟插槽 根据百度的结果 要么改配置文件 要么改 这个四 ...
- Kivy 中文教程 实例入门 简易画板 (Simple Paint App):0. 项目简介 & 成果展示
本教程咪博士将带领大家学习创建自己的窗口部件 (widget).最终,我们完成的作品是一个简易的画板程序. 当用 kivy 创建应用时,我们需要仔细思考以下 3 个问题: 我们创建的应用需要处理什么数 ...
- Ubuntu 14.04 将一个sh文件制作成类似于windows下的可以双击执行的快捷方式
# 创建文件 touch test.desktop # 在test.desktop中写入如下内容 [Desktop Entry] Version=1.0 Type=Application Termin ...
- 【设计模式】—— 中介者模式Mediator
前言:[模式总览]——————————by xingoo 模式意图 使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合. 这个中介者常常起着中间桥梁的作用,使其他的对象可以利用 ...
- 【CF605E】Intergalaxy Trips(贪心,动态规划)
[CF605E]Intergalaxy Trips(贪心,动态规划) 题面 Codeforces 洛谷 有\(n\)个点,每个时刻第\(i\)个点和第\(j\)个点之间有\(p_{ij}\)的概率存在 ...
- mybatis与分布式事务的面试
mybatis的面试: https://www.cnblogs.com/huajiezh/p/6415388.html 本地事务与分布式事务: https://www.cnblogs.com/xcj2 ...
- valgrind使用指南
http://note.youdao.com/noteshare?id=5de9c049ccdb1defdc4368db83813dd3
- JAVA (字符串学习)
String类 String类是不可改变的,所以你一旦创建了String对象,那它的值就无法改变了. 如果需要对字符串做很多修改,那么应该选择使用StringBuffer&StringBuil ...