我們試圖找出用於我們的NServiceBus服務的最佳線程數。我們正在使用2個四核心的機器上運行它。我們一直在隊列備份方面遇到問題。我們從100個線程開始,然後將它碰到200,事情變得更糟。我們把它降低到了75,然後是50,似乎更好。根據我們有多少CPU或者我們應該使用哪些經驗法則來確定要運行的線程數,是否有一些最佳數字?最佳線程數NServiceBus
3
A
回答
6
您運行的每個線程都會附加一個開銷。如果你有2個四核心,那麼你將能夠在任何時候精確地運行8個線程。每個線程將消耗一個核心。
如果你有超過8個線程,那麼你就有機會開始做更少的有用工作,而不是更多。這是因爲每當Windows決定給當前沒有使用內核的線程做一些事情時,它需要存儲正在運行的線程之一的狀態,然後恢復即將運行的線程的舊狀態 - 然後讓線程去處理它。如果你有大量的線程,你將花費大量的時間,只是在線程之間切換,並且什麼都不做。
如果你有一堆被阻塞的等待IO的線程(例如一條消息寫完成寫入磁盤以便它可以到達),那麼你可能能夠運行比你有更多的線程,但仍然可以得到作爲一些有用的線程將會等待其他事情的完成。這是一個複雜的主題,「我應該使用多少個線程」沒有真正的答案。一個很好的經驗法則是每個核心都有一個線程,然後嘗試和玩一下,如果你想獲得更多的吞吐量。在真實條件下進行測試是找到甜蜜點的唯一真正方法。你可能會發現你只需要一個線程來處理這些消息,並且線程被阻塞的時間只有一半,等待消息進入......
很明顯,即使我所描述的過於簡單化了。 Windows需要訪問內核來執行OSy的事情,所以即使你擁有8個內核,你的8個線程中的所有8個線程也不會總是在運行,因爲Windows線程正在輪到你...然後你有IO線程等...
相關問題
- 1. 最佳線程數
- 2. 最大輸出的最佳線程數
- 3. Java確定最佳線程數的最佳方式
- 4. 叉/加入:最佳的線程數
- 5. 多線程最佳實踐
- 6. 多線程最佳實踐
- 7. Delphi線程最佳實踐
- 8. 多線程CQRS與NServiceBus
- 9. python線程 - 將參數傳遞給線程的最佳方式
- 10. NServiceBus處理程序中的多線程
- 11. iOS線程 - 回調最佳實踐
- 12. ASP.net中的多線程最佳方法
- 13. J2EE和J2ME最佳在線教程
- 14. 多線程UI的最佳途徑?
- 15. Java UDP多線程的最佳實踐
- 16. java中的多線程最佳實踐
- 17. 多線程的最佳方式
- 18. 最佳線程同步隊列
- 19. Java線程會話的最佳實踐
- 20. 最佳實踐來使用線程
- 21. 線程循環,以最佳的方式
- 22. 多任務的最佳線程策略
- 23. android中的最佳線程池大小
- 24. 多線程的最佳方式?
- 25. 暫停線程的最佳方法?
- 26. ASP.NET和多線程最佳實踐
- 27. 管理線程的最佳方法?
- 28. 應用程序中的最佳線程數應該是多少?
- 29. 在CUDA代碼中查找最佳塊數和線程數
- 30. 如何確定使用超線程多核CPU時的最佳Java線程數
除此之外,你的NServiceBus代碼正在做的任何工作都將發揮作用。如果消息處理程序依賴於引入鎖定和其他爭用的數據庫,那麼增加線程數會增加死鎖,使更多消息失敗並且必須重試。答案總是取決於個人應用程序。 –