代码之家  ›  专栏  ›  技术社区  ›  kvista

最佳CPU利用率阈值

  •  4
  • kvista  · 技术社区  · 14 年前

    我已经构建了部署在Windows2003Server上的软件。该软件作为一项服务连续运行,它是唯一的应用程序在Windows框的重要性,我。一部分时间,它从互联网上检索数据,一部分时间,它对这些数据做一些计算。它是多线程的——我使用大约4-20个线程的线程池。

    我的问题是:我是否应该简单地尝试最大限度地利用CPU来获得最好的回报?直觉上,我不认为这是有意义的运行在100%的CPU;即使95%的CPU看起来也很高,就像我没有给操作系统足够的空间去做它需要做的事情一样。我不知道怎样才能找到最佳平衡。我猜我可以测量和测量,可能会发现最好的吞吐量是在CPU平均利用率为90%或91%等,但。。。

    你推荐什么?对于Windows上的多线程、混合负载(一些I/O、一些CPU)应用程序,什么是明智的、注重性能的利用率规则?

    5 回复  |  直到 14 年前
        1
  •  6
  •   Toby Daniel C. Sobral    14 年前

    是的,我建议100%的进程都是颠簸的,所以不希望看到进程一直这样运行。我一直以80%为目标,在利用率和峰值/特殊进程空间之间取得平衡。

    我过去使用的一种方法是缓慢地增加池的大小,并测量其影响(对CPU和IO等其他约束的影响),你永远不会知道,你可能会突然发现IO成为瓶颈。

        2
  •  4
  •   Rick    14 年前

    在这个i/o密集型工作负载中,CPU利用率应该无关紧要,因为您关心吞吐量,所以请尝试使用 hill climbing approach

    如果你添加了一个线程,它有帮助,添加另一个。如果你试了一根线,它会痛,就把它拔掉。

    最终这将稳定下来。

    如果这是一个基于.NET的应用程序,爬山被添加到.NET4线程池中。

    更新:

    同样关于.NET4,如果您可以将问题重新定义为Parallel.For或Parallel.ForEach,那么线程池将调整线程数以最大化吞吐量,这样您就不必担心这个问题。

    -里克

        3
  •  3
  •   Vinko Vrsalovic    14 年前

    而且你的负载是恒定的,你应该以100%的CPU利用率为目标,其他一切都是CPU的浪费。记住,操作系统处理线程,所以它确实能够运行,很难用一个行为良好的程序来饿死操作系统。

    但是如果你的负载是可变的,并且你期望你应该考虑的峰值,我会说80%的CPU是一个很好的使用阈值,除非你确切地知道负载将如何变化以及它将需要多少CPU,在这种情况下,你可以瞄准确切的数字。

        4
  •  1
  •   Nick Craver    14 年前

    如果你只是给你的线程一个低优先级,操作系统将完成剩下的工作,并采取周期,因为它需要做的工作。Server 2003(和大多数服务器操作系统)是 很擅长这个 ,无需自己尝试和管理。

        5
  •  0
  •   rscarter    9 年前

    我还使用80%作为目标CPU利用率的一般经验法则。正如其他一些人提到的,这为活动中的零星峰值留出了一些空间,并将有助于避免对CPU的冲击。

    以下是Weblogic工作人员关于这个问题的一点建议(较老但仍然相关): http://docs.oracle.com/cd/E13222_01/wls/docs92/perform/basics.html#wp1132942

    如果你觉得你的负载是非常均匀和可预测的,你可以把目标推得更高一点,但是除非你的用户群对周期性的慢响应特别宽容,并且你的项目预算非常紧张,否则我建议给你的系统添加更多的资源(添加一个CPU,使用一个有更多内核的CPU,等等)试图从现有平台中挤出另外10%的CPU利用率。