小编Abd*_*ood的帖子

为什么使用 O_DIRECT 标志时读取速度更快?

我在 SSD 中复制了一个 10GB 的文件,使用 fio 命令进行基准测试,其读取带宽约为 3.3GB/s。这是参考: https: //cloud.google.com/compute/docs/disks/benchmarking-pd-performance

我使用“sync; echo 3 > /proc/sys/vm/drop_caches”清除了缓存。之后,我尝试每次使用系统调用 open() 和 read() 以 3MB 的小块读取文件。如果我打开没有 O_DIRECT 和 O_SYNC 的文件,它会给我大约 1.2GB/s 的带宽。但是,如果我使用 O_DIRECT 和 O_SYNC,它会提供大约 3GB/s 的带宽。即使 O_DIRECT 也没有真正使用页面缓存,两次都会清除缓存。

我的问题是为什么 O_DIRECT 提供正常的 IO 带宽,而没有 O_DIRECT 我无法获得它。由于从 IO 到页面缓存的数据带宽为 3.3GB/s,从页面缓存到用户缓冲区的带宽假设约为 7GB/si。该管道还应提供正常的 3.3GB/s。为什么速度比较慢?

我每次都会读新的 3MB。我没有重用数据,因此缓存并不是很有用。但是管道应该是受IO约束的,为什么不呢?

CPU 为 Intel(R) Xeon(R) Silver 4214 CPU @ 2.20GHz。我不确定 DRAM 的速度。但问题是,如果我多次重新读取相同的 3MB,那么我会获得约 8GB/s 的带宽。我想这应该是 DRAM 带宽。因为linux可以使用所有的空闲RAM作为页面缓存。

更新

我尝试了启用和不启用 O_DIRECT 的 fio 命令并记录了 iostat。

使用这个 fio 命令。“fio --name=read_throughput --directory=$TEST_DIR --numjobs=1 --size=10G --time_based --runtime=30s …

linux bandwidth read-only benchmark fio

5
推荐指数
1
解决办法
785
查看次数

标签 统计

bandwidth ×1

benchmark ×1

fio ×1

linux ×1

read-only ×1