首页 > 解决方案 > fio中的顺序读写是什么意思?

问题描述

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

标签: linuxrustrust-tokiorio

解决方案


(我认为这只是一个编程问题,但它确实需要参考fio 的同步 ioengine 代码,该代码很容易阅读)

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 中的写入在发送到内核之前会累积在缓冲区中。你必须strace在你的 Rust 程序中查看实际发送的内容......
  • 根据你有多少 RAM,你可能只是在 Rust 和 fio 情况下对内核的页面缓存进行基准测试!
  • 你要计时哪一点代码?fio 尝试在每个 I/O 上收集数据,因此它比你的 Rust 程序做的工作更多。

如果是这样,我可以以这种方式在 fio 上对我的顺序读写进行基准测试吗?

你可以试试,但我对结果的有效性和有用性有疑问。

TLDR;太多的变量和假设使这个问题太模糊而无法很好地回答……也许缩小您未来问题的范围以帮助获得更好的答案?


推荐阅读