2012-10-19 34 views
3

我們試圖找出用於我們的NServiceBus服務的最佳線程數。我們正在使用2個四核心的機器上運行它。我們一直在隊列備份方面遇到問題。我們從100個線程開始,然後將它碰到200,事情變得更糟。我們把它降低到了75,然後是50,似乎更好。根據我們有多少CPU或者我們應該使用哪些經驗法則來確定要運行的線程數,是否有一些最佳數字?最佳線程數NServiceBus

回答

6

您運行的每個線程都會附加一個開銷。如果你有2個四核心,那麼你將能夠在任何時候精確地運行8個線程。每個線程將消耗一個核心。

如果你有超過8個線程,那麼你就有機會開始做更少的有用工作,而不是更多。這是因爲每當Windows決定給當前沒有使用內核的線程做一些事情時,它需要存儲正在運行的線程之一的狀態,然後恢復即將運行的線程的舊狀態 - 然後讓線程去處理它。如果你有大量的線程,你將花費大量的時間,只是在線程之間切換,並且什麼都不做。

如果你有一堆被阻塞的等待IO的線程(例如一條消息寫完成寫入磁盤以便它可以到達),那麼你可能能夠運行比你有更多的線程,但仍然可以得到作爲一些有用的線程將會等待其他事情的完成。這是一個複雜的主題,「我應該使用多少個線程」沒有真正的答案。一個很好的經驗法則是每個核心都有一個線程,然後嘗試和玩一下,如果你想獲得更多的吞吐量。在真實條件下進行測試是找到甜蜜點的唯一真正方法。你可能會發現你只需要一個線程來處理這些消息,並且線程被阻塞的時間只有一半,等待消息進入......

很明顯,即使我所描述的過於簡單化了。 Windows需要訪問內核來執行OSy的事情,所以即使你擁有8個內核,你的8個線程中的所有8個線程也不會總是在運行,因爲Windows線程正在輪到你...然後你有IO線程等...

+0

除此之外,你的NServiceBus代碼正在做的任何工作都將發揮作用。如果消息處理程序依賴於引入鎖定和其他爭用的數據庫,那麼增加線程數會增加死鎖,使更多消息失敗並且必須重試。答案總是取決於個人應用程序。 –