读写硬盘的线程数是多少?

Posted

技术标签:

【中文标题】读写硬盘的线程数是多少?【英文标题】:How many threads for reading and writing to the hard disk? 【发布时间】:2011-07-16 08:37:05 【问题描述】:

我正在开发一个应用程序,用于收集包含硬盘驱动器所有文件的列表 然后它确实将文件写入硬盘。

我想问:执行此任务的最佳并发线程数是多少?

我的意思是我应该有多少线程来读取硬盘而不制作硬盘 变慢,因为有太多线程同时读取它。

谢谢!

【问题讨论】:

这个进程必须是多线程的有什么具体原因吗? serverfault.com/questions/826163/… 【参考方案1】:

首先,我说一个!

这实际上取决于要读取的数据是否需要复杂的计算才能进行详细说明。在这种情况下,可以方便地实例化多个线程来处理不同的磁盘数据;但这只有在同一系统上有多个 CPU 时才方便。

否则,多个线程会使 HDD 承受不必要的压力:来自不同线程的并发读取将发出 seek 操作以读取文件块 (*),从而引入可能会减慢系统,取决于读取的文件数和文件的大小。

按顺序读取文件。

(*) 操作系统确实尝试按顺序存储相同的文件块以加快读取操作。发生磁盘碎片,因此非顺序碎片需要查找操作,这需要更多时间来尊重同一位置的读取操作。尝试并行读取多个文件,会导致一堆seek,因为单个文件块是连续的,而多个文件块可能不连续。

【讨论】:

哇,谢谢大家的回答。这是我关于 *** 的第一个问题,我印象深刻。 虽然大多数答案都说每个磁盘一个操作,但我想补充一点,使用当前的 SSD 您可以同时使用多个操作而不会影响 IO 读取的性能/写。【参考方案2】:

永远不要同时处理 IO 密集型操作。因为磁盘探测会浪费大量时间在不同线程/文件之间切换。

如果IO操作中有几个线程怎么办?并发产生操作,单线程执行。我们有一个容器,比如ConcurrentQueue<T>(或自己编写的线程安全队列),有10个线程,将从这些文件中读取1.txt 2.txt ... 10.txt。您将“读取请求”同时放入队列中,另一个线程处理所有请求(打开 1.txt,获取您想要的内容,然后继续 2.txt),磁盘探针不会忙于线程之间的切换/文件在这种情况下。

【讨论】:

你应该在 SSD 中添加 EXCEPT ;) @hdkrus 是的 SSD 不同。但是应用程序不应该依赖于它的部署位置。所以推荐生产者-消费者模式。【参考方案3】:

一个线程。如果您同时读取和写入,并且您的目标是与源不同的磁盘,那么 2 个线程。我会补充一点,如果您正在对文件进行其他操作(例如解压缩),则可以在第三个线程上完成解压缩部分。

举一些例子(我忽略了连接点,重解析点......)

C: 到 C: 1 线程总数 C: 到 D: 相同的物理磁盘,不同的分区:1 个线程总计 C: 到 D: 不同的物理磁盘: 2 Thread TOTAL

我正在假设磁盘一次可以执行一项操作,并且每次它“多任务”在不同的读/写之间切换时都会降低速度。机械磁盘有这个问题(但技术上 NCQ 可以提供帮助)。固态硬盘我不知道(但我知道如果您尝试一次执行 2 个操作,U 盘会非常慢)

我已经搜索过你是如何做到的...我没有找到任何“特定”示例,但我有一些指向 Windows API 的链接,你可以从那里开始:

显示卷路径: http://msdn.microsoft.com/en-us/library/cc542456%28VS.85%29.aspx

GetVolumePathName:http://msdn.microsoft.com/en-us/library/aa364996(v=VS.85).aspx

GetVolumeInformationByHandleW http://msdn.microsoft.com/en-us/library/aa964920(v=VS.85).aspx

【讨论】:

这可以推断吗?如果我同时读取 10 个文件和写入 10 个文件,线程数应该是多少? @Sanjeevakumar 假设您从 C: 复制到 C:(不考虑连接点...),总共 1 个线程。您从 C: 复制到 D:,但在同一个磁盘(2 个分区)上,1 个线程。您从 C: 复制到 D:,两个物理磁盘:2 个线程。 @xanatos 我读了这个答案***.com/questions/38973929/… 它说如果我从主内存中的缓冲区读取并写入磁盘(有关详细信息,请参阅问题)我可以并行执行写入,所以我如果我使用多线程(在 4 核上超过 2 个线程),可以获得更好的性能。但如果我理解正确,你说的正好相反。我在 Windows 上,你能推荐一个解释如何写入磁盘的来源吗?操作系统真的只使用一个线程来写入磁盘 :O 吗?谢谢 @lads 您引用的回复是关于一个非常基本的 C++ 问题。在他写的其中一篇文章中,此外,旋转盘式硬盘驱动器越来越少,SSD 没有定位问题,这正是我 5 年前给出的例外: 我不知道的固态硬盘【参考方案4】:

我会说一个线程就足够了。 CPU 可能能够运行许多线程,但硬盘驱动器的速度比 CPU 低许多数量级。即使运行更多线程使 I/O 请求更快(我不确定),它也不会使硬盘驱动器实际上读得更快。它甚至可能会减慢速度。

【讨论】:

【参考方案5】:

如果它来自单个 HDD,那么您希望最大限度地减少寻道时间。所以只用一个线程来读写磁盘。

【讨论】:

【参考方案6】:

许多答案都与硬盘驱动器的数量有关。请记住,它还取决于控制器的数量。有时,两个 HDD 由一个控制器管理。 另外:同一硬盘上的两个分区不是两个硬盘!

【讨论】:

【参考方案7】:

正如“C#”标签所暗示的,我假设您正在编写一个托管应用程序来执行磁盘 I/O。

在这种情况下,我猜测用户级托管线程的数量无关紧要,因为它们不是实际执行磁盘 I/O 的线程。

据我所知,来自用户级托管线程的磁盘 I/O 请求将在内核级 APC 队列中排队,Windows I/O 线程将处理它们。

所以,我想说在 APC 队列中排队的磁盘 I/O 请求的频率将与您的问题更相关。

我还没有看到任何允许将任何用户任务绑定到 Windows I/O 线程的 .NET 线程 API。但是,请注意,我的回答是基于以下链接Windows I/O threads vs. managed I/O threads 中的相对旧信息。

如果有人更了解当前的 Windows 7 线程池模型与链接中的信息不同,请也分享信息以教育我。

另外,您可能会发现以下链接有助于理解 windows 文件 I/O 操作:Synchronous and Asynchronous I/O

【讨论】:

以上是关于读写硬盘的线程数是多少?的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 支持的最大并发线程数是多少

cpu的多少线程是啥意思啊?

springboot内置tomcat并发多少

如何查看weblogic11并发

线程数是啥

4核8线程虚拟机分配多少