美文网首页
dd 测试磁盘I/O

dd 测试磁盘I/O

作者: 华阳_3bcf | 来源:发表于2018-12-24 16:30 被阅读0次

前言

对于磁盘的读写测试,专业的工具是benchmark,它包含了很多方面(最大/小/平均传输速度,访问时间,爆发率,顺序读/写,随机读/写,每次写入大小等)。但使用这个软件有一定的学习成本,通常大家也没有这么严格的要求。

另一个工具hdparm也可以粗略的了解磁盘性能。

这里介绍Linux 中,使用自带的 dd 命令来测试磁盘顺序读写能力。

先熟悉两个特殊的设备

  • /dev/null:回收站、无底洞。
  • /dev/zero:产生字符。

基本命令

dd if=/path/to/file1.txt of=/path/to/file2.txt

# dd if=/nfs/httpcore-4.4.5.jar of=/log/test
639+1 records in
639+1 records out
327373 bytes (327 kB, 320 KiB) copied, 0.0153607 s, 21.3 MB/s

参数解释:

if : input file

of: output file

这个命令的意思就是从一个文件写入另一文件,返回耗时和速度。

测试磁盘写能力

dd if=/dev/zero of=/path/to/file count=2048k conv=fsync

# dd if=/dev/zero of=/log/text.txt count=2048k conv=fsync
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 32.2659 s, 33.3 MB/s

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

conv=fsync 加入这个参数后,dd命令执行到最后会真正执行一次“同步(sync)”操作,这样算出来的时间才是比较符合实际使用结果的。(如果没有这个参数,只是写缓存,速度快很多。)

bs=512Bytes, 这是默认值,表示每次写入多大的块。

count=2048k, 写入多少次,这个例子中bs*count = 1GB,也就是写入1GB的数据来测试。

更进一步,是否使用conv=fsync参数的对比结果:

# dd if=/dev/zero of=/log/test.bs count=2048k
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.35353 s, 201 MB/s
# dd if=/dev/zero of=/log/test.bs count=2048k conv=fsync
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 32.0992 s, 33.5 MB/s
# dd if=/dev/zero of=/log/test.bs bs=64k count=16k
16384+0 records in
16384+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.76879 s, 1.4 GB/s
# dd if=/dev/zero of=/log/test.bs bs=64k count=16k conv=fsync
16384+0 records in
16384+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 36.5617 s, 29.4 MB/s

看到1.4 GB/s的数字,就明白了磁盘IO数据不可能这么高,这个测试的结果没有参考性。因为命令结束的时候数据还没有真正写到磁盘上去,对磁盘的写,我们一般是先写到了缓存就返回了。

相关参数解释:

  • conv=fsync 表示把文件的“数据”和“metadata”都写入磁盘(metadata包括size、访问时间st_atime & st_mtime等等),因为文件的数据和metadata通常存在硬盘的不同地方,因此fsync至少需要两次IO写操作

  • conv=fdatasync 表示只把文件的“数据”写入磁盘,fsync 与fdatasync相差不大。

  • oflag=dsync 每个block size都单独写一次磁盘,使用同步I/O,去除caching的影响,这是最慢的一种方式,可以当成是模拟数据库插入操作。

  • oflag=direct,nonblock 避掉文件系统cache,直接读写,不使用buffer cache

测试磁盘读能力

dd if=/dev/sda of=/dev/null bs=4k

# dd if=/dev/sda of=/dev/null bs=4k
^C1581701+0 records in
1581700+0 records out
6478643200 bytes (6.5 GB, 6.0 GiB) copied, 90.2666 s, 71.8 MB/s

/dev/sda是一个物理分区,对它的读取会产生IO,/dev/null是伪设备,相当于黑洞,of到该设备不会产生IO,所以,这个命令的IO只发生在/dev/sda上,也相当于测试磁盘的读能力。(Ctrl+c终止测试)

另一种办法:用大文件来测试读速度

  1. 生成大文件:
# dd if=/dev/zero of=/roy/io.file bs=1024M count=50 
  1. 读取大文件,测试速度
# dd if=/roy/io.file if=/dev/null bs=1024M
26+0 records in
26+0 records out
27917287424 bytes (28 GB, 26 GiB) copied, 201.534 s, 139 MB/s

发现读文件速度比之前测试快一倍,这是因为测试文件还不够大,建议测试文件的大小要远远大于内存的容量!!!

测试同时读写能力

dd if=/dev/sda of=/testrw.db bs=4k

# dd if=/dev/sda of=/testrw.db bs=4k
^C2496549+0 records in
2496548+0 records out
10225860608 bytes (10 GB, 9.5 GiB) copied, 186.158 s, 54.9 MB/s

在这个命令下,一个是物理分区,一个是实际的文件,对它们的读写都会产生IO(对/dev/sda是读,对/testrw.db 是写),假设它们都在一个磁盘中,这个命令就相当于测试磁盘的同时读写能力。

参考链接

相关文章

  • dd 测试磁盘I/O

    前言 对于磁盘的读写测试,专业的工具是benchmark,它包含了很多方面(最大/小/平均传输速度,访问时间,爆发...

  • Linux 磁盘I/O基础知识总结

    本文用于对一些基础磁盘I/O知识的总结。 目录索引 磁盘I/O那些事 总结思维导图 磁盘I/O学习笔记 磁盘I/O...

  • I/O请求的队列指标

    当磁盘I/O请求的数量超过I/O设备的处理能力时,或者当磁盘调度算法需要累计一定的I/O请求时,都会导致I/O请求...

  • I/O请求的队列指标

    当磁盘I/O请求的数量超过I/O设备的处理能力时,或者当磁盘调度算法需要累计一定的I/O请求时,都会导致I/O请求...

  • I/O查看

    网络 I/O:sar -n DEV 1 CPU I/O: vmstat 1 磁盘 I/O : sar -d 1

  • Linux性能优化实战——磁盘I/O调优

    前言 本文基于文件系统和磁盘I/O工作原理,通过典型I/O问题分析,总结磁盘I/O调优的一般套路。 问题描述:文件...

  • Hadoop3 YARN集群中的磁盘I / O调度设计详解1

    问题导读 1.磁盘IO实现共享,使用的是什么原理技术? 2.如何描述磁盘I / O资源? 3.磁盘I / O资源中...

  • 使用fio测试磁盘I/O性能

    前言 fio是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync...

  • 聊聊JAVA中的I/O

    I/O即为输入输出的意思,在实际应用中的I/O操作主要是针对磁盘或者网络。磁盘的I/O主要是针对文件读写,而网络I...

  • 内存高排查

    1 测试工具 清理系统缓存 dd 作为一个磁盘和文件的拷贝工具,经常被拿来测试磁盘或者文件系统的读写性能,模拟磁盘...

网友评论

      本文标题:dd 测试磁盘I/O

      本文链接:https://www.haomeiwen.com/subject/vnpzkqtx.html