宇宙主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

欧基零壹微头条IP归属甄别会员请立即修改密码
查看: 12252|回复: 14

[疑问] dd命令里 oflag=dsync 和 conv=fdatasync 有什么不同?

[复制链接]
发表于 2011-11-3 13:09:06 | 显示全部楼层 |阅读模式
我们都是用oflag=dsync来测的, 可我看老外论坛里他们都是用 conv=fdatasync 来测的
可测试的结果大相径庭啊
我某个VPS, 用oflag=dsync 来测, 速度只有1.03 MB/s, 可是用conv=fdatasync来测, 能高达 150MB/s, 好夸张的差别!
这两个参数到底分别代表什么意思呢? 哪种能真实代表读写速度呢?

[ 本帖最后由 雪花烂饼子 于 2011-11-3 13:10 编辑 ]
发表于 2011-11-3 13:10:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2011-11-3 13:10:18 | 显示全部楼层
不折腾这些
发表于 2011-11-3 13:10:34 | 显示全部楼层
单词不同
发表于 2011-11-3 13:11:16 | 显示全部楼层
小白答疑:

应该是 测试的 类型不同。
发表于 2011-11-3 13:11:33 | 显示全部楼层
发表于 2011-11-3 13:11:58 | 显示全部楼层
在大多数的unix/linux对磁盘io的写操作都是通过缓存来完成的,基本的原理如下:当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。 我们称之为延迟写,极大的减少了写磁盘的次数。
但是在没写特殊的应用中我们需要实时的将应用层数据写入到磁盘上 特别是一些高可靠性要求的系统中 数据需要及时的写入磁盘 即便是瞬时系统故障 数据也可以安全恢复,于是就有了sync、fsync和fdatasync函数。但在功能上 这三个函数又略有区别:

     sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数。这就保证了定期冲洗内核的块缓冲区。

    fsync函数只对由文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。fsync可用于数据库这样的应用程序,这种应用程序需要确保将修改过的块立即写到磁盘上。

    fdatasync函数类似于fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性。

     这里需要特别说明一下的是 目前glibc中fdatasync函数的实现已经和fsync一摸一样了:

   

/* Synchronize at least the data part of a file with the underlying
   media.  */
int
fdatasync (int fildes)
{
  return fsync (fildes);
}
 楼主| 发表于 2011-11-3 13:12:28 | 显示全部楼层
原帖由 qun 于 2011-11-3 13:10 发表
单词不同


不仅仅是单词不同哦, 测试结果相差十万八千里, 但两个参数, 都确实把 test 写到硬盘里了!
 楼主| 发表于 2011-11-3 13:15:11 | 显示全部楼层
原帖由 汉陈帝国 于 2011-11-3 13:11 发表
在大多数的unix/linux对磁盘io的写操作都是通过缓存来完成的,基本的原理如下:当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重 ...


肿么不见 dsync 呢?
 楼主| 发表于 2011-11-3 13:21:08 | 显示全部楼层
汗啊, 给你们加分都加不上, 说我的来路不正,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宇宙主机交流论坛

GMT+8, 2024-10-30 15:20 , Processed in 0.059816 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表