利用dd对硬盘读写的一次简单测试
目的
验证Linux上不同的IO方式及page cache对文件读写性能的影响
过程
Direct IO方式
执行前Page Cache/Buffer Cache统计
free -h
total used free shared buff/cache available
Mem: 3.6Gi 149Mi 3.2Gi 0.0Ki 195Mi 3.2Gi
Swap: 0B 0B 0B
Direct IO测试结果
dd if=/dev/zero of=zero.log bs=64K count=50K oflag=direct
51200+0 records in
51200+0 records out
3355443200 bytes (3.4 GB, 3.1 GiB) copied, 39.0018 s, 86.0 MB/s
执行后Page Cache/Buffer Cache统计
free -h
total used free shared buff/cache available
Mem: 3.6Gi 149Mi 3.2Gi 0.0Ki 195Mi 3.2Gi
Swap: 0B 0B 0B
默认方式:启动Page Cache,系统自动刷盘
执行前Page Cache/Buffer Cache统计
free -h
total used free shared buff/cache available
Mem: 3.6Gi 149Mi 3.2Gi 0.0Ki 195Mi 3.2Gi
Swap: 0B 0B 0B
默认方式测试结果
dd if=/dev/zero of=zero.log bs=64K count=50K
51200+0 records in
51200+0 records out
3355443200 bytes (3.4 GB, 3.1 GiB) copied, 21.7411 s, 154 MB/s
执行后Page Cache/Buffer Cache统计
free -h
total used free shared buff/cache available
Mem: 3.6Gi 147Mi 108Mi 0.0Ki 3.3Gi 3.2Gi
Swap: 0B 0B 0B
fsync方式
执行前Page Cache/Buffer Cache统计
free -h
total used free shared buff/cache available
Mem: 3.6Gi 149Mi 3.2Gi 0.0Ki 195Mi 3.2Gi
Swap: 0B 0B 0B
fsync测试结果
dd if=/dev/zero of=zero.log bs=64K count=50K conv=fsync
51200+0 records in
51200+0 records out
3355443200 bytes (3.4 GB, 3.1 GiB) copied, 28.6824 s, 117 MB/s
执行后Page Cache/Buffer Cache统计
free -h
total used free shared buff/cache available
Mem: 3.6Gi 148Mi 111Mi 0.0Ki 3.3Gi 3.2Gi
Swap: 0B 0B 0B
sync方式
执行前Page Cache/Buffer Cache统计
free -h
total used free shared buff/cache available
Mem: 3.6Gi 149Mi 3.2Gi 0.0Ki 195Mi 3.2Gi
Swap: 0B 0B 0B
sync测试结果
dd if=/dev/zero of=zero.log bs=64K count=50K oflag=sync
51200+0 records in
51200+0 records out
3355443200 bytes (3.4 GB, 3.1 GiB) copied, 63.7788 s, 52.6 MB/s
执行后Page Cache/Buffer Cache统计
free -h
total used free shared buff/cache available
Mem: 3.6Gi 147Mi 100Mi 0.0Ki 3.3Gi 3.2Gi
Swap: 0B 0B 0B
结论
经过简单比较,从消耗时间上sync > direct > fsync > 默认。理论上
- sync在每次往page cache写完数据块后还需要主动发起sync调用,将元数据和数据写到磁盘上,故消耗时间最长
- direct不需要经过page cache,直接将数据写到磁盘上,消耗时间依赖于磁盘调度和transfer time。至于direct为什么比fsync耗时长,并不完全清楚,猜测是由于fsync在最后主动刷盘前已经有部分数据通过pdflush内核线程刷到磁盘了,总体耗时平摊掉了。
- fsync在总体上往page cache写完数据块之前主动发起一次fsync调用,将元数据和数据写到磁盘上
- 默认方式是最快的,数据直接写到page cache即可返回。系统内核通过pdflush内核线程刷新磁盘。