Performance 最佳CPU利用率阈值

Performance 最佳CPU利用率阈值,performance,multithreading,cpu,throughput,Performance,Multithreading,Cpu,Throughput,我已经构建了部署在Windows2003服务器上的软件。该软件作为一项服务持续运行,它是Windows box上对我来说唯一重要的应用程序。一部分时间,它从互联网上检索数据,另一部分时间,它对这些数据进行一些计算。它是多线程的——我使用大约4-20个线程的线程池 我不会对所有这些细节感到厌烦,但我只想说,随着我在池中启用更多线程,会发生更多并发工作,CPU使用率也会提高。(对带宽等其他资源的需求也是如此,尽管这与我无关——我有很多) 我的问题是:我是否应该简单地尝试最大限度地利用CPU,以获得最

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

我不会对所有这些细节感到厌烦,但我只想说,随着我在池中启用更多线程,会发生更多并发工作,CPU使用率也会提高。(对带宽等其他资源的需求也是如此,尽管这与我无关——我有很多)

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

我只是想知道这是否有一个好的经验法则???我不想假设我的测试将考虑工作负载的各种变化。我宁愿玩得安全一点,但不要太安全(否则我的硬件使用不足)


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

如果您只是简单地给线程一个较低的优先级,操作系统将完成其余的工作,并按需执行周期。Server 2003(和大多数服务器操作系统)在这方面非常出色,无需亲自尝试和管理。

假设除了操作系统在机器上运行之外,没有其他重要的东西:

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


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

在这个I/o密集型工作负载中,CPU利用率应该无关紧要,您关心吞吐量,所以请尝试使用,基本上尝试以编程方式注入/删除工作线程并跟踪完成进度

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

最终这将稳定下来

如果这是基于.NET的应用程序,则爬山已添加到.NET 4线程池中

更新:

爬山是一种基于控制理论的最大化吞吐量的方法,如果你愿意,你可以称之为试错法,但这是一种可靠的方法。一般来说,这里没有一个好的“经验法则”,因为开销和延迟变化太大,所以不可能进行概括。重点应该是吞吐量和任务/线程完成,而不是CPU利用率。例如,很容易将内核与粗粒度或细粒度同步绑定在一起,但实际上并不影响吞吐量

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


-Rick

是的,我建议100%的人都在挣扎,所以我不想看到进程一直这样运行。我一直以80%为目标,在利用率和峰值/临时进程空间之间取得平衡


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

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

以下是Weblogic工作人员关于这个问题的一点建议(较老但仍然相关):


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

如果你给线程正常的优先级,操作系统很可能也会这样做。你不想做的是给他们高优先级。我喜欢爬山的方法,但我特别寻找的是经验法则,而不是反复试验,我说过如果需要的话我可以这样做。@user277617:他说.NET 4线程池会自动为你做反复试验。这是非常有趣的,如果你是。