2010-02-20 177 views
4

我构建了在Windows 2003服务器上部署的软件。该软件作为一项服务持续运行,它是我对Windows重要的唯一应用程序。部分时间,它从互联网检索数据,部分时间是对数据进行一些计算。它是多线程的 - 我使用大约4-20个线程的线程池。最佳CPU利用率阈值

我不会与所有这些细节感到厌烦,但我只想说,我在池中使更多的线程,多并发工作时,和CPU使用量的上升。 (就像需要其他资源,如带宽,虽然这不关心我 - 我有很多)

我的问题是这样的:我应该只是试图最大限度地使用CPU,以获得最佳的爆炸我的降压?直觉上,我认为以100%的CPU运行是没有意义的;即使95%的CPU看起来很高,几乎就像我没有给操作系统足够的空间去做它需要做的事情。我不知道确定最佳平衡的正确方法。我猜测我可以测量和测量,并且可能发现最佳吞吐量是在CPU平均利用率为90%或91%等情况下达到的,但是...

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

你有什么建议?对于Windows上的多线程,混合负载(某些I/O,某些CPU)应用程序,使用哪种性能优化的智能规则?

回答

2

是的,我建议100%的颠簸所以不希望看到运行像所有的时间过程。我一直力求达到80%,以在峰值/临时流程的利用率和空间之间取得平衡。

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

1

如果你简单地给你的线程低优先级,操作系统将完成剩下的,并且它需要做的工作感到周期。 Server 2003(和大多数服务器操作系统)是非常好,在这个,无需自己尝试和管理它。

+2

如果您给线程正常的优先级,操作系统很可能也会这样做。你不想做的就是给予他们高度优先。 – 2010-02-20 12:00:31

3

假设没有别的重要的,但在OS上运行的机器上:

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

但是,如果你的负载是可变的,你希望你应该考虑的山峰,我会说80%的CPU是一个很好的阈值而使用,除非你确切地知道这将如何改变负荷,这将多少CPU需求在这种情况下,您可以瞄准确切的数字。

4

CPU使用率不应该在此我没关系/ O密集型工作负载,你关心的吞吐量,所以尽量使用hill climbing approach基本上尝试以编程方式注入/移除工作线程和轨道完工进度...

如果您添加一个线程,并帮助,添加另一个。如果你尝试一个线程,它会伤害删除它。

最终这会稳定。

如果这是一个基于.NET应用程序,爬坡加入到.NET线程池4。

UPDATE:

爬山是控制理论为基础的方法来最大化的吞吐量,你可以把它叫做试错,如果你想要的,但它是一个完善的办法。一般来说,在这里没有一个好的“经验法则”,因为开销和延迟差异很大,所以不可能推广。重点应该是吞吐量&任务/线程完成,而不是CPU利用率。例如,通过粗略或细粒度的同步很容易地将内核挂起,但实际上并没有改变吞吐量。

关于.NET 4,如果您可以将您的问题重新构造为Parallel.For或Parallel.ForEach,那么线程池将调整线程数以最大化吞吐量,因此您不必担心这一点。

-Rick

+0

我使用爬山的方法,但我特别寻找经验法则,而不是审判和错误,我说我可以做,如果我需要的话。 – kvista 2010-02-20 18:11:20

+0

@ user277617:他在说.NET 4线程池为你自动执行试验和错误。如果你是这样,这非常有趣。 – 2010-02-20 18:17:10

0

我也使用80%作为目标CPU使用率的一般规则。正如其他一些人所提到的那样,这为活动中的零星尖峰留下了一些空间,并有助于避免在CPU上发生颠簸。

这里是一个小(较老,但仍然具有现实意义)建议从对这个问题的Weblogic的船员:http://docs.oracle.com/cd/E13222_01/wls/docs92/perform/basics.html#wp1132942

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