aix比linux传输文件慢,AIX或LINUX使用time+dd测试硬盘读写速度

测试硬盘   写速度:time dd if=/dev/zero of=test.dbf bs=8k count=300000

其中/dev/zero是一个伪设备,它只产生空字符流,对它不会产生IO,所以,IO都会集中在of文件中,of文件只用于写,所以这个命令相当于测试磁盘的写能力。

输出的结果类似(因为一般更长测试时间更准确,所以可以设置count大一些):

300000+0 records in

300000+0 records out

real 0m36.669s

user 0m0.185s

sys 0m9.340s

所以写速度为:8*300000/1024/36.669=63.916M/s

测试硬盘  读速度:time dd if=/dev/sda1 of=/dev/null bs=8k

因为/dev/sdb1是一个物理分区,对它的读取会产生IO,/dev/null是伪设备,相当于黑洞,of到该设备不会产生IO,

所以,这个命令的IO只发生在/dev/sdb1上,也相当于测试磁盘的读能力

输出的结果类似:

448494+0 records in

448494+0 records out

real 0m51.070s

user 0m0.054s

sys 0m10.028s

所以sda1上的读取速度为:8*448494/1024/51.070=68.61M/s

补充:Windows下安装Cygwin也可以使用time和dd命令,而且输出结果中直接包含IO的时间和速度,有兴趣的朋友可以试一下,不过我测试下来的速度读写都只有40多M每秒,不知道是否是平台的原因,可能Cygwin的机制和Linux下还是有所不同吧。

解读dd命令

dd命令是一个非常强大的命令,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果。我们可以用它来测试磁盘的读写性能。之前一直以为他只能测试块设备,但是今天看到一个文章说他同时是可以测试文件系统的(IOzone也是可以测试文件系统跟块设备,但IOmeter是不能用来测试文件系统的)。

而对于dd命令,我们常用到的两个设备就是 /dev/null /dev/zero

-------------------------------------------------------------------------------

linux中特殊的设备(/dev/zeo,/dev/null,/dev/unrandom,/dev/random)

/dev/zero 与 /dev/null

我们平时在使用dd命令测试磁盘性能时候,时常见到 dd if=/dev/zero或者 dd of=/dev/null这样的写法。这是什么东西呢?

/dev/null

/dev/null看作"黑洞"。 它非常等价于一个只写文件。所有写入它的内容都会永远丢失。 而尝试从它那儿读取内容则什么也读不到。所以我们是不能从他那里读到数据的,所以在dd命令中当我们为了测试某个磁盘的读性能时候,就可以将of指定为/dev/null 这样相当从要测试的设备上读出的数据都填到了这个无底洞中。同时, /dev/null对命令行和脚本都非常的有用的。例如,当我们标准输出中有很多很多的无用信息时候而我们并不需要,这样就可以将输出重定向到/dev/null中:

禁止标准输出.    1 cat $filename >/dev/null

/dev/zero

像/dev/null一样, /dev/zero也是一个伪文件。 他产生连续不断的null的流(二进制的零流,而不是ASCII型的)。写入它的输出会丢失不见, 而从/dev/zero读出一连串的null也比较困难, 虽然这也能通过od或一个十六进制编辑器来做到。 /dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件。另一个应用是为特定的目的而用零去填充一个指定大小的文件,就像我们在用dd命令为了测试磁盘写性能时候,我们可以将if指定为/dev/zero这样,他就相当源源不断的向我们要测试的设备中写入数据。

/dev/random与/dev/unrandom

/dev/random和/dev/urandom是unix系统提供的产生随机数的设备,很多应用都需要使用random设备提供的随机数,比如ssh keys, SSL keys, TCP/IP sequence numbers等等。他们的区别在于,/dev/urandom生成的速度比/dev/random快。如果不能立即生成随机串,/dev/random会一直阻塞,有时会非常耗费CPU;/dev/urandom则会根据其他值立即生成一个随机串,不会阻塞。/dev/urandom生成的随机值没有/dev/random随机。大多数情况下,我们选用/dev/urandom

------------------------------------------------------------------------------

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慢一些吧。那么自己感觉如果只是写一次的话,两者应该是差别不大的,后来做了下小实验,证实确实是这样的。

8dde9df4f67e7e51bb491c3fb46e4a43.png

cd8d82c6d0cfb5e5f01eeb9818e70bb8.png

在第一个图中,我们只写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 成功,并由操作系统决定缓存中的数据什么时候被写入磁盘

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值