Linux操作系统硬盘访问是否为缓冲区模式
当进行常见的性能测试时,在Linux操作系统下,建议指定硬盘的访问模式为DirectIO。
Linux操作系统存在内核缓冲区,在Linux的I/O缓存机制中,操作系统会将I/O的数据缓存在页缓存(page cache)中,即数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间,即BufferedIO。而DirectIO,数据直接在用户地址空间的缓冲区和硬盘之间直接进行传输,不需要页缓存的支持。
当使用Vdbench工具或dd命令等进行性能测试时,如果不指定DirectIO,则默认为BufferedIO。Linux默认的页缓存页面大小为4KB,如果指定的I/O大小为大于4KB的I/O,会出现如下现象:
- 在内核缓冲区主机会做I/O拆分,而在块设备层又会对小I/O进行合并,主机CPU资源开销较大。
- 对于多并发的场景,小I/O无法确保在块设备层完全合并为大I/O写入硬盘,改变了指定的I/O模型,并可能会导致硬盘的带宽性能无法达到最大。
指定硬盘访问模式为DirectIO的方法如下:
- 对于Vdbench测试,需要在“sd”中将“openflags”设置为“o_direct”。
sd=default,openflags=o_direct,threads=32
- 对于dd命令。
- 测试写性能时,需要设置“oflag”为“direct”。
dd if=/dev/zero of=/testw.dbf bs=4k oflag=direct count=100000
- 测试读性能时,需要设置“iflag”为“direct”。
dd if=/dev/sdb of=/dev/null bs=4k iflag=direct count=100000
- 测试写性能时,需要设置“oflag”为“direct”。