在磁盘上读取/写入文件时如何限制硬盘 I/O?

Posted

技术标签:

【中文标题】在磁盘上读取/写入文件时如何限制硬盘 I/O?【英文标题】:How to limit Hard Drive Disk I/O when reading/writing a file on disk? 【发布时间】:2019-11-22 13:28:46 【问题描述】:

我有几个 Rust 程序可以从一个文件中读取数据,执行一些操作,然后将数据写入另一个文件。 很简单,但我一直遇到一个大问题,因为我的程序使 HDD 最大 I/O 饱和,并且只能在没有其他进程在使用时执行。

更准确地说,我目前正在使用缓冲区大小为 64 KB 的 BufReader 和 BufWriter,这本身就可以尽快读取/写入文件。但是以 250MB/s 的速度读取并以 250MB/s 的速度同时写入会导致 HDD 可以管理的容量溢出。可以说我完全是为了速度和诸如此类的东西,但我意识到那些 Rust 程序从 HDD 中要求的资源过多,并且似乎被操作系统 (Windows) 停止以让其他进程和平工作。我正在读/写的文件一般都是几G

现在我知道我可以在磁盘上的每个读/写操作之间添加某种形式的 wait() 但是,我不知道如何找出我当前正在读/写的速度以及正在寻找的速度一个更优化的解决方案。另外,即使在阅读了文档之后,我仍然无法在 BufReader/BufWriter 上找到可以将 HDD I/O 操作限制为任意值(例如 100MB/s)的选项。

我查看了 sysinfo crate,但它似乎无助于找出 HDD 的当前和最大 I/O。

我是不是运气不好,我应该深入研究系统编程以找到解决方案吗?或者是否已经有一些东西可以教如何确定我对 HDD 的调用的优先级或简单地将我的调用限制为从 HDD 当前可用的 I/O 速率计算出的某个任意值?

【问题讨论】:

可能在这里有用:superuser.com/questions/136021/… 非常有趣,如果我理解正确的话,它非常类似于通过调用具有正确参数的 API 来设置的配置(对于那些想知道的人来说,这里有一个 rust 链接:docs.rs/ntapi/0.3.1/x86_64-pc-windows-msvc/ntapi/ntpsapi/…)。以这种方式优先考虑对 HDD 的 I/O 调用似乎是可行的,但我仍然不明白如何选择一个特定的速度,以便我可以从磁盘读取/写入而不打扰太多同时运行的其他进程. 【参考方案1】:

在阅读了有关该主题的更多内容后,除了尝试读取/写入大量数据并根据其性能进行计算之外,您似乎无法在程序执行期间找出 HDD 最大 I/O 速率并且只能猜测 HDD I/O 速率不能更高的常数。 (见https://superuser.com/questions/795483/how-to-limit-hdd-write-speed-for-chosen-programs/795488#795488)

但是,您仍然可以监控磁盘活动,并且使用之前猜到的数字,您可以更准确地使用wait(),而不是始终以恒定速度限制自己。 (这里是 Rust 的箱子:https://github.com/myfreeweb/systemstat)。

使用操作系统对进程进行优先级排序可能有点矫枉过正,因为我试图在其他进程之间切换并共享当时可用的任何资源。

【讨论】:

以上是关于在磁盘上读取/写入文件时如何限制硬盘 I/O?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取应用程序从文件系统读取/写入文件所花费的总时间?

如何优化mysql写入速

在磁盘读取或写入时ntoskrnl占用cpu,请问如何解决啊,谢谢

SQL Server磁盘I/O性能分析

在golang磁盘写入性能

苹果mac读取/写入/编辑ntfsU盘/硬盘,哪里可以下载ntfs for mac免费软件?