【问题标题】:At what point do short sleeps increase CPU util rather than reduce it什么时候短睡眠会增加而不是减少 CPU 利用率
【发布时间】:2014-11-27 04:27:43
【问题描述】:

我正处于一个程序的设计阶段,该程序将有 10-30 个线程,其中每个线程将处理许多小信息块。

我可以选择每个块休眠 5 毫秒或根本不休眠。我应该选择能减少 CPU 负载的那个。

通常我会休眠以降低 CPU 利用率,但我担心由于上下文切换,许多 5 毫秒的休眠可能会导致 CPU 利用率增加而不是减少。

是否已经对短睡眠和上下文切换对 CPU 利用率的权衡进行了研究?

【问题讨论】:

  • 这当然取决于你的 CPU,它们的数量,以及你的操作系统,但是这些线程真的除了计算什么都不做吗?例如没有 I/O?如果他们要执行系统调用,我会完全省略睡眠,让他们全速前进。操作系统会应付。您可以考虑降低他们的优先级。
  • EJP,在我所描述的系统部分中将没有 I/O - 这将是纯计算。我会考虑降低他们的优先级。
  • 如果一台运行在 1GHz 的计算机每个时钟周期可以运行一次操作,那就是 5ms 内的 500 万次操作。您可以在这段时间内进行很多次上下文切换!
  • 请记住,Sleep(1) 可能与 Sleep(10) 等待相同的时间,具体取决于计时器分辨率。
  • 假设你有固定的工作要做,休眠意味着你将占用 CPU 的时间更长,并且无法利用系统没有其他工作要做的时间段。这只是一个的想法,你应该拒绝它。

标签: java c multithreading architecture cpu-usage


【解决方案1】:

睡觉是不得已的选择。相反,请查看并发 API 中的工具,尤其是 Queues,它允许您将任务置于睡眠状态,直到消息到达它应该执行的操作。

或者查看Akka,它允许您轻松构建一个系统,其中几个线程处理数千条消息。这里的主要缺点是你必须围绕 Akka 设计你的系统——这真的不是你可以轻易改造的东西。

如果您主要关心的是速度,请查看像“Single Producer/Consumer lock free Queue step by step”或LMAX Disruptor这样的阻塞免费算法。

相关:

【讨论】:

    【解决方案2】:

    我测试过了。有趣的是,我开始看到 3 毫秒睡眠的好处,之后每增加一个毫秒,我就会显着增加。

    测试是在英特尔酷睿 i3-4130 上运行 30 个线程完成的。每个线程创建一个包含 1000 个字符串的数组列表,每个字符串是用 commons lang 随机生成的,长度为 1000 个字符。

    线程然后在洗牌和排序列表之间交替。

    免责声明:这是在一个桌面 cpu 上进行的一组简短测试 - 不是研究。

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 2019-08-10
      • 2022-01-22
      • 2019-07-23
      • 1970-01-01
      • 2018-01-21
      相关资源
      最近更新 更多