最佳线程数NServiceBus

最佳线程数NServiceBus,nservicebus,Nservicebus,我们正试图找出用于NServiceBus服务的最佳线程数。我们在一台有两个四核的机器上运行它。我们在队列备份方面遇到了问题。我们从100个线程开始,然后猛增到200个,情况变得更糟。我们把价格降到了75英镑,然后降到了50英镑,这似乎更好。是否有一些基于我们拥有多少CPU的最佳数字,或者我们应该使用一些经验法则来确定要运行的线程数?您运行的每个线程都有一个附加的开销。如果您有2个四核,那么您将能够在任何时间运行8个线程。每个线程将消耗一个内核 如果你有超过8个线程,那么你就有可能开始做一些不太有

我们正试图找出用于NServiceBus服务的最佳线程数。我们在一台有两个四核的机器上运行它。我们在队列备份方面遇到了问题。我们从100个线程开始,然后猛增到200个,情况变得更糟。我们把价格降到了75英镑,然后降到了50英镑,这似乎更好。是否有一些基于我们拥有多少CPU的最佳数字,或者我们应该使用一些经验法则来确定要运行的线程数?

您运行的每个线程都有一个附加的开销。如果您有2个四核,那么您将能够在任何时间运行8个线程。每个线程将消耗一个内核

如果你有超过8个线程,那么你就有可能开始做一些不太有用的工作,而不是更多。这是因为,每当windows决定让当前未使用内核的线程执行某项操作时,它都需要存储其中一个正在运行的线程的状态,然后恢复即将运行的线程的旧状态,然后让线程执行该操作。如果你有大量的线程,你将花费大量的时间在线程之间切换,而什么都不做

如果有一堆线程被阻止等待IO(例如,一条消息将完成写入磁盘,以便可以获取),那么您可能可以运行比内核更多的线程,并且仍然可以完成一些有用的任务,因为许多线程将坐在那里等待其他任务完成。这是一个复杂的问题,对于“我应该使用多少线程”没有真正的答案。一个很好的经验法则是,每个核心都有一个线程,如果您想获得更高的吞吐量,可以尝试使用它。在真实条件下测试它是找到最佳点的唯一真实方法。您可能会发现,您只需要一个线程来处理消息,而该线程在等待消息传入时有一半时间被阻塞


显然,即使是我所描述的也过于简单化了。Windows需要访问内核才能执行OSy操作,因此即使您有8个内核,您的8个线程也不会始终运行,因为Windows线程正在轮换。。。还有IO线程等等……

除此之外,您的NServiceBus代码所做的任何工作都将发挥作用。如果消息处理程序依赖于数据库,这会引入锁定和其他争用,那么增加线程数将增加死锁,使更多消息失败并必须重试。答案总是取决于单个应用程序。