闲来没事,恰好手头有几种不同类型的主机,可以有机会测试比较不同主机之间的磁盘I/O。Linux下测试磁盘最常用的莫过于dd命令了,使用dd命令时由于使用的参数不同,结果也会有区别。一般有这几种方式测试磁盘的速度(写速度),如果要测试磁盘读速度,将if参数设定为磁盘上的物理文件且将of参数设定为设备/dev/null:
1 | $ dd if=/dev/zero of=out.file bs=512K count=2048 |
1、大多数文件系统的默认I/O操作都是缓存I/O,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。dd命令不指定oflag或conv参数时默认使用缓存I/O,不同类型的机器测试结果如下:
国内某云服务商的vps,自己平时用来瞎折腾的服务器,我的blog就放在上面的:
国外云服务商搬瓦工的vps,买个国外的vps平时自己用来科学上网,上面就跑了个shadowsocks服务:
公司某线上服务器,8块SAS盘组的RAID10:
2、用oflag=direct指定采用直接I/O操作。直接I/O的优点是通过减少操作系统内核缓冲区和应用程序地址空间的数据拷贝次数,降低了对文件读取和写入时所带来的CPU的使用以及内存带宽的占用。很明显,直接I/O会增加磁盘读写的次数,读写测试结果如下:
国内某云服务商的vps:
国外云服务商搬瓦工的vps:
公司某线上服务器(速度只有缓存I/O的1/10,可以判断目前这台机器的磁盘读写非常频繁):
3、用oflag=dsyns参数,dd在执行时每次都会进行同步写入操作,可能是最慢的一种方式了,因为基本上没有用到写缓存(write cache)。读写测试结果如下:
国内某云服务商的vps:
国外云服务商搬瓦工的vps:
公司某线上服务器:
4、用oflag=syns参数,与上者dsyns类似,但同时也对元数据(描述一个文件特征的系统数据,如访问权限、文件拥有者及文件数据块的分布信息等。)生效,dd在执行时每次都会进行数据和元数据的同步写入操作。
5、使用conv=fdatasync参数,dd命令执行到最后会真正执行一次“同步(sync)”操作,将所有还没有写入到磁盘的缓存内容写入磁盘,这样算出来的数度才是比较符合实际的。读写测试结果如下:
国内某云服务商的vps:
国外云服务商搬瓦工的vps:
公司某线上服务器:
6、使用conv=fsync参数,与上者fdatasync类似,但同时元数据也一同写入。 以上可以看出,因为测试数据还和当前的系统环境、系统负载、磁盘测试时磁盘已有的读写任务等有关,用dd命令测试磁盘时不一定是磁盘真实的读写速度。但是可以大致判断机器目前的磁盘读写速度。