sysbench fileio中file-block-size参数的作用及性能疑问
sysbench fileio 中
file-block-size 参数的作用解析 我的理解是否正确?
我在使用sysbench fileio测试系统性能时,对file-block-size参数的实际作用存疑。原本以为它对应文件系统块大小,但查看源码后发现它是文件系统块大小的上层封装。sysbench fileio读取文件的核心逻辑伪代码如下:
while current_pointer < file_leng: read_leng = min(file_block_size, file_leng - current_pointer) pread(fd, read_buf, read_leng, current_pointer) current_pointer += read_leng
这里sysbench调用的是文件系统提供的pread系统调用。当文件大小小于file-block-size时,该参数没有实际意义——因为每次读取长度都会被限制为文件剩余大小,而实际从磁盘加载到内存的字节数(即真正的IO块大小)是由文件系统甚至硬件决定的。
举个例子,假设文件系统块大小是4K:
- 当
file_block_size设为1K/2K/4K时,每个pread调用都会触发一次4K块的加载; - 当
file_block_size=1024K且单文件大小为1024K时,单次pread会请求读取1024K,但实际是加载256个4K块; - 当
file_block_size=1024K但单文件大小仅16K时,pread的读取长度会被限制为16K,实际加载4个4K块。
请问以上理解是否正确?
若理解正确,该参数实际调整的是什么?是否要保证file_size大于file_block_size?
如果我的理解没问题,那修改file-block-size参数到底在调整什么?是不是应该始终把单文件大小设得比file_block_size大?
不同读取方式的性能差异
另外,同样加载1024K数据,用256次4K的pread调用,和用1次1024K的pread调用,在吞吐量和延迟上会有差异吗?
我的测试场景与疑问
我使用的测试命令:
./sysbench --file-block-size=<file_block_size> --file-total-size=65536K --file_num=<file_num> --file-test-mode=rndrd --file-fsync-all=on --file-extra-flags=direct fileio <prepare/run/cleanup>
其中file_block_size取值包括1K、4K、16K、256K、1024K等;file_num取值为1、4、16…65536,对应单文件大小为65536K、16384K…1K。
测试结果显示:当file_block_size设为256K时,搭配16K大小的文件,延迟远低于搭配256K大小的文件。如果file_block_size是硬件加载单元的大小,这种情况不应该出现——毕竟我的ext2/ext3文件系统块大小是4K,那这个参数到底是什么?
内容的提问来源于stack exchange,提问作者ada liu
相关产品推荐
相关产品推荐

