disk io performance

hdparm 测试

1
2
3
4
5
6
7
8
9
10
11
//测试硬盘缓存读取速度和读取速度
[root@10 mnt]# hdparm -Tt /dev/vdb
/dev/vdb:
Timing cached reads: 16760 MB in 2.00 seconds = 8389.10 MB/sec
Timing buffered disk reads: 388 MB in 3.00 seconds = 129.32 MB/sec

2秒钟读取了16760MB的缓存,约合8389.10 MB/sec;
在3.00秒中读取了388MB磁盘(物理读),读取速度约合129.32 MB/sec

-t 评估硬盘的读取效率
-T 评估硬盘快取的读取效率

dd测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
在使用前首先了解两个特殊设备
/dev/null 伪设备,回收站.写该文件不会产生IO
/dev/zero 伪设备,会产生空字符流,对它不会产生IO

//测试磁盘的IO写速度
1.没加关于操作系统"写缓存"的参数,默认"写缓存"启作用
[root@10 ops]# time dd if=/dev/zero of=./test.dbf bs=8k count=300000
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 5.97005 s, 412 MB/s

real 0m5.972s
user 0m0.050s
sys 0m2.464s

dd先把数据写的操作系统"写缓存",就完成了写操作.通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数,把"写缓存"中的数据刷入磁盘.因为"写缓存"起作用,你会测试出一个超级快的性能

2. 明确"写缓存"启作用,conv=sync
[root@10 ops]# time dd if=/dev/zero of=./test.dbf bs=8k count=300000 conv=sync
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 6.03335 s, 407 MB/s

real 0m6.035s
user 0m0.077s
sys 0m2.479s

conv=sync参数明确"写缓存"启作用,默认值就是conv=sync

3.明确"写缓存"启作用,conv=fsync
[root@10 ops]# time dd if=/dev/zero of=./test.dbf bs=8k count=300000 conv=fsync
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 9.83308 s, 250 MB/s

real 0m9.835s
user 0m0.058s
sys 0m2.625s

在9.835s里生成了一个2.5 GB文件,IO的写速度在250 MB/s
dd命令执行到最后会真正执行一次"同步(sync)"操作,这样算出来的时间才是比较符合实际使用结果的
conv=fsync 表示把文件的"数据""metadata"都写入磁盘(metadata包括size,访问时间st_atime & st_mtime等等),因为文件的数据和metadata通常存在硬盘的不同地方,因此fsync至少需要两次IO写操作

4.明确"写缓存"启作用,conv=fdatasync
[root@10 ops]# time dd if=/dev/zero of=./test.dbf bs=8k count=300000 conv=fdatasync
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 9.88476 s, 249 MB/s

real 0m9.887s
user 0m0.062s
sys 0m2.684s

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

5.明确"写缓存"启作用,oflag=dsync
[root@10 ops]# time dd if=/dev/zero of=./test.dbf bs=8k count=300000 oflag=dsync
300000+0 records in
300000+0 records out
2457600000 bytes (2.5 GB) copied, 371.456 s, 6.6 MB/s

real 6m11.458s
user 0m0.755s
sys 0m36.006s
oflag=dsync加入这个参数后,每次读取8k后就要先把这8k写入磁盘,然后再读取下面一个8k,一共重复300K次.这是最慢的一种方式


//测试磁盘IO读速度
[root@10 ops]# time dd if=/mnt/ops/test.dbf of=/dev/null bs=8k
3000000+0 records in
3000000+0 records out
24576000000 bytes (25 GB) copied, 91.6083 s, 268 MB/s

real 1m31.611s
user 0m0.484s
sys 0m15.326s


//测试磁盘IO读写性能
[root@10 ops]# time dd if=/dev/vdb of=./test.dbf bs=8k count=3000000 conv=fsync
3000000+0 records in
3000000+0 records out
24576000000 bytes (25 GB) copied, 278.723 s, 88.2 MB/s

real 4m38.726s
user 0m1.039s
sys 1m12.445s

[root@10 ops]# time dd if=/dev/vdb of=./test.dbf bs=8k count=3000000
3000000+0 records in
3000000+0 records out
24576000000 bytes (25 GB) copied, 274.808 s, 89.4 MB/s

real 4m35.634s
user 0m1.040s
sys 1m13.122s