问题描述
fio (https://fio.readthedocs.io/en/latest/fio_doc.html#cmdoption-arg-readwrite) 中的顺序读写是否对应于下面的 Rust 代码片段?
let mut file = File::open("10G.img").unwrap();
let mut writer = Openoptions::new()
.truncate(true)
.create(true)
.write(true)
.open(format!("Traditional_way.img.{}",i))
.unwrap();
let mut buf = [0u8; 1024 * 1024];
let mut r = file.read(&mut buf).unwrap();
while r > 0 {
writer.write_all(&buf[0..r]).expect("write file error");
r = file.read(&mut buf).unwrap();
}
如果是这样,我可以通过这种方式在 fio 上对我的顺序读写进行基准测试吗?
请注意,10G.img
是一个 10 GB 大小的文件,我们要读取和写入另一个文件位置
fio --name=readandwrite --ioengine=sync --filename=/home/user/Desktop/examples/10G.img --iodepth=1 --rw=readwrite --bs=1024k --direct=0 --numjobs=1 --runtime=10 --time_based=1
解决方法
(我认为这只是一个编程问题,但它确实需要引用易于阅读的 fio's sync ioengine code)
fio 中的顺序读写是什么意思?
这意味着 fio 将尝试执行顺序读取 ;-) 究竟会发生什么取决于您传递给 fio 的选项和您使用的 ioengine。
fio (https://fio.readthedocs.io/en/latest/fio_doc.html#cmdoption-arg-readwrite) 中的顺序读写是否对应于下面的 Rust 代码片段?
也许但不幸的是,您没有为此问题提供具体的 fio 作业文件,因此随机的 Stack Overflow 路人无法给出明确的“是”或“否”。取决于命令行选项/作业文件,它们可能相似也可能非常不同。我将倾向于不,因为:
- 您的写入缓冲区中有哪些数据?默认情况下,fio 将使用伪随机数据进行写入,这样您就不会得到虚假的基准测试结果 - 数据全为零的基准测试写入是一种特殊情况,可能会从根本上扭曲基准测试。这是因为一些存储堆栈有零检测,其他有压缩等。
- 您是否知道 Rust 程序执行的文件截断可能(取决于文件系统)导致文件稀疏?从稀疏文件中读取可能异常快并扭曲基准,因为文件系统可以通过仅读取元数据而不必真正读取文件内容来回复大量零。默认情况下,fio 在进行读取时会尝试在 Linux 上预分配文件,这样它就不会遇到这种特殊的陷阱...
- 仅查看您的代码,我们不知道您的读写在 Rust 中具有什么样的批处理方式。您可能会发现 Rust 中的写入在发送到内核之前已累积在缓冲区中。您必须在 Rust 程序中执行类似
strace
的操作才能查看实际发送的内容... - 根据您拥有多少 RAM,您可能只是在 Rust 和 fio 情况下对内核的页面缓存进行基准测试!
- 您打算编写哪一段代码? fio 尝试在每个 I/O 上收集数据,因此它比您的 Rust 程序做的工作更多。
如果是这样,我可以通过这种方式在 fio 上对我的顺序读写进行基准测试吗?
你可以试试,但我对结果的有效性和有用性有疑问。
TLDR;太多的变量和假设使这个问题过于模糊而无法很好地回答...也许可以缩小您未来问题的范围以帮助获得更好的答案?