前言
对于磁盘的读写测试,专业的工具是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终止测试)
另一种办法:用大文件来测试读速度
- 生成大文件:
# dd if=/dev/zero of=/roy/io.file bs=1024M count=50
- 读取大文件,测试速度
# 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 是写),假设它们都在一个磁盘中,这个命令就相当于测试磁盘的同时读写能力。
网友评论