我有一个 IO 密集型、受 GPU 限制的进程,需要从本地硬盘驱动器的文件夹中读取随机文件。当该进程单独运行时,我获得约 30 MB/s 的稳定吞吐量,但当有两个竞争进程时,总吞吐量降至仅 7 MB/s。
当有两个程序时,如何才能最大化吞吐量?延迟不是问题。
每个文件的大小在 1-20 MB 左右,进程在独立的 GPU 上运行,占用的 CPU 非常少。如果我同时启动一个 GPU 和一个纯 IO 进程,可以观察到相同的效果。
可用的调度程序之间没有区别:deadline、cfq 和 noop。我还尝试将读取截止时间增加到 5 秒,没有任何变化。
机器详细信息:
- Fedora Linux 内核为 4.16.7-200.fc27.x86_64
- i7-4770 CPU @ 3.40GHz
- 32 GB 的 RAM,其中 20 GB 由正在运行的进程占用。
- 交换已启用,但是是空的。
- 该驱动器是 WDC WD2003FYYS-0、2TB,但如果我将所有内容移至其他驱动器,我会看到同样的情况。
- cat big_file > /dev/null 的吞吐量接近 100 MB/s,因此两者都有带宽。
- 全部数据大约有500GB。
更多信息:
- 我将文件移至另一个速度更快、未用于其他用途的驱动器,并使用了压缩。总体吞吐量略有改善。
- 为其中一个进程赋予最大 I/O 优先级可使性能提高 10%。
- 运行
iostat -x 1
显示,运行一个进程时利用率约为 87%,运行两个进程时利用率约为 100%。 - 这些进程正在读取随机文件。如果我只有一个进程,它可以提供每个进程所能消耗的两倍以上的吞吐量。
答案1
cfq
对这些数据磁盘使用shceduler,并将slice_async
和设置slice_sync
为相当高的值(例如 500)以及slice_idle
大约 20。您可能还需要将fifo_expire_async
和fifo_expire_sync
分别增加到大约 4000。(请参阅https://unix.stackexchange.com/a/41831/20336了解详情)。
这个想法是让每个进程每次能够完全控制设备 0.5 秒,这样在磁盘的不同区域之间进行搜索就不会占用所有的时间。
如果您负担得起,最好的选择是购买一个可以保存数据的优质 SSD 驱动器。对于随机读取性能,我建议使用三星 860 EVO 系列,因为 2018 年似乎是成本和性能之间最佳的平衡。如果价格不是问题,那就选择市场上最大的英特尔傲腾 SSD。