缘起:
使用dd读取一个大文件时,速度可达 100MB+/s, 但是cat读取大文件时,速度才达到 30MB/s,为何?
由于ceph块儿设备是从网络上读取数据,读取数据的效率和网络的性能由于直接关系,同时也和每次读取的块儿的大小有直接关系:
1 2 3 4 5 |
# dd if=/data2/bigfile bs=100M count=20 iflag=direct |pv >/dev/null 记录了20+0 的读入 136MiB/s] [ <=> ] 记录了20+0 的写出 2097152000字节(2.1 GB)已复制,16.5394 秒,127 MB/秒 1.95GiB 0:00:16 [ 120MiB/s] |
在块儿大小为100MB的情况下,读取速度可达到 120MB/s
1 2 3 4 5 |
# dd if=/data2/bigfile bs=1M count=3000 iflag=direct |pv >/dev/null 记录了3000+0 的读入.2MiB/s] [ <=> ] 记录了3000+0 的写出 3145728000字节(3.1 GB)已复制,42.9703 秒,73.2 MB/秒 2.93GiB 0:00:42 [69.8MiB/s] |
在块儿大小为1MB的情况下,读取速度可达到 70MB/s
1 2 3 4 5 |
# dd if=/data2/bigfile bs=64K count=3000 iflag=direct |pv >/dev/null 记录了3000+0 的读入.8MiB/s] [ <=> ] 记录了3000+0 的写出 196608000字节(197 MB)已复制,6.63725 秒,29.6 MB/秒 187MiB 0:00:06 [28.2MiB/s] |
在块儿大小为64KB的情况下,读取速度可达到 30MB/s; ,然而cat命令每次read的大小正好是64KB
针对这种情况,如果本机有较大内存的话,不妨先通过dd大块儿的方法使得文件被cache起来,然后再做其它类似cat的操作;
另外: 增加IO大小,到达底层之后,会变成多个IO请求,相当于底层同时又多个IO请求,实际上是相当于增加了队列深度。