【发布时间】:2017-05-18 02:58:09
【问题描述】:
向一个在 IO 上花费 50% 等待时间的程序添加更多内核会有所收获吗?我得到了完全 IO 绑定和 CPU 绑定的琐碎案例,但我不完全确定每个线程花费部分时间等待 IO 的情况。
我的直觉是,通过添加内核,每个线程现在都有更多的 IO 争用。所以现在每个线程可能会花费大约 60% 的时间来等待 IO。所以结果是净中性甚至净负。
编辑
Threads: Fast IO - Slow CPU
Threads: Balanced IO and CPU
这些是一些简单情况的示例图,我试图了解添加线程/内核如何影响 IO 等待时间。
我看到的一件有趣的事情是任务 IO 时间和任务 CPU 之间的比率决定了额外线程的有用性。例如,如果 IO = 10ms 和 CPU = 40ms,那么总任务时间 = 50ms。 50ms/10ms = 5,因此这种情况可能会受益于 5 个线程,但可能不会再提高性能。
这是正确的吗?
【问题讨论】:
-
嗯,当然。如果程序有一个线程在 I/O 上花费 50%,那么添加另一个线程可以使其速度提高一倍。一个的 IO 等待时间将与另一个的计算时间重叠。添加第三个线程并不会使其更快。
-
@HansPassant 我有点困惑。如果我有 10 个线程/内核在运行并且它们都花费 50% 的时间在等待 IO 上会怎样?将线程/内核加倍到 20 是否意味着执行时间会减少一半,但更多的内核将无济于事?
-
那么得出的正确结论是基准测试中存在错误或有人试图完成他的家庭作业。你必须自己思考,做功课的意义。
-
@HansPassant - 该评论是不必要的。我没有做作业,我试图理解一些事情。我是并发新手,所以求助于 stackoverflow 之类的地方。我已经进行了基准测试来测试这一点,但我仍在尝试了解底层机制以使我的理解更加完整。
-
我很明确,如果这不是家庭作业,那么基准就被打破了。因此,如果您需要帮助,请向我们展示基准代码。其他任何事情都只是在浪费大家的时间。
标签: multithreading concurrency io