我已经建立的软件,我在Windows部署2003服务器。该软件作为一个持续服务,这是对重要的Windows中对我来说唯一的应用程序。部分时间,它从互联网上检索数据,并在部分时间是在做对数据的一些计算。它是多线程 - 我用大致4-20线程的线程池

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

我的问题是:我应该简单地试图最大程度的发挥CPU来为我的降压最好的爆炸?直观地说,我不认为这是有道理的,在100%的CPU运行;甚至95%的CPU看起来很高,几乎就像我不会给OS太多的空间做它需要做的。我不知道,以确定最佳的平衡的正确途径。我猜我可以测量和测量,并可能会发现吞吐量以90%或91%等一个CPU平均利用率achived但最好...

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

你有什么建议?什么是智能,性能志同道合的利用了多线程,混合负载(一些I / O,CPU部分)应用程序在Windows规则?

有帮助吗?

解决方案

是的,我建议100%的颠簸所以不希望看到进程中运行一样,所有的时间。我一直瞄准80%得到了利用尖峰和房间之间的平衡/特设的过程。

我已经在过去使用的方法是慢慢杀青池的大小和测量的影响(包括对CPU和其他限制,如IO),你永远不知道,你可能会发现,突然IO成为瓶颈

其他提示

CPU利用率不应该的问题在这个I / O密集型工作负载,你关心的吞吐量,那么请尝试使用的爬坡方法和基本编程尝试注入/移除工作线程和跟踪完工进度...

如果您添加一个线程,它可以帮助,再添一个。如果你尝试一个线程,它伤害删除它。

最终,这将趋于稳定。

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

更新:

爬山是控制理论为基础的方法来最大化的吞吐量,你可以把它叫做试错,如果你想要的,但它是一个完善的办法。一般情况下,没有一个很好的“经验法则”,在这里跟随,因为开销和延迟变化很大,它不是真的有可能一概而论。重点应放在吞吐量和任务/线程完成,而不是CPU的利用率。例如,它是很容易用粗或细颗粒的同步很容易地挂芯但实际上没有使吞吐量的差异。

另外,关于.NET 4,如果你可以重新塑造你的问题,因为一个或的Parallel.For然后Parallel.ForEach线程池将调整线程最大化吞吐量的号码,这样你就不必对这种担心。

-Rick

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

和你的负载是恒定的,你的目标应该是100%的CPU利用率,其他一切都是CPU的浪费。还记得OS手柄的线程,以便它确实能够运行,这是很难用一个很乖的程序饿死OS。

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

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

我也用80%的作为一般原则进行的拇指对目标的CPU利用率。正如一些人所说,这让一些余量为活动零星尖峰,将有助于在CPU上避免抖动。

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

如果您觉得您的负载非常均匀且可预测你可能推动这一目标高一点,但除非你的用户群是非常宽容的周期性的缓慢反应和你的项目预算是令人难以置信的紧张,我建议增加更多的资源,您的系统(添加CPU,使用具有多个核等一CPU)上制作一个冒险的举动来尝试挤出另外10%的CPU利用率出现有的平台。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top