2010-02-20 112 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利用率。