【发布时间】:2020-04-09 18:10:55
【问题描述】:
我需要复制一组文件,每个文件的大小从 1MB 到 700MB 不等。复制每个文件后,我需要根据 md5sum.txt 中的条目验证每个文件的校验和。
我想优化这个任务,因此通过在多个线程之间分配负载来评估性能。结果并不如预期。我原以为复制和验证所花费的时间会随着线程数的增加而减少,但实际花费的时间却增加了。
我修改了这个链接https://stackoverflow.com/a/22285532/1568395分享的ThreadPool源码,实现了线程池。
应用程序的源代码可以在这里找到 https://github.com/saai63/ThreadPool
不同线程数的结果如下图,
根据我的阅读,可能的原因可能是所有任务现在都是 IO 绑定任务,因此所有线程都将在 IO 操作上被阻塞,因此无法并行运行,因为这里的共享资源是 HDD。我也了解硬盘控制器试图通过减少寻道时间来优化磁盘访问。磁盘喜欢顺序访问模式,任何并发访问都会破坏这种模式,从而导致大文件的延迟。
这是延迟的唯一原因还是还有其他一些因素?为什么时间会随着线程数的增加而增加?
【问题讨论】:
-
线程池不是数据并行技术。它们是数据并行化代码使用的低级功能,但本身不提供任何东西。您可以创建 5 个“工作人员”,每个工作人员处理 1/5 的文件。这些工作人员可以从该池中获取他们的线程,但最终,数据分区和工作人员将加快速度。但是,您不会获得 5 倍的性能提升
-
@PanagiotisKanavos :我没想到时间会减少“n”倍,但至少比通过单线程实现的要好。看到的结果是反直觉的,因此是查询。
标签: linux multithreading hard-drive