我们正试图找出用于NServiceBus服务的最佳线程数。我们在具有2个四核的机器上运行它。我们一直遇到队列备份问题。我们从100个线程开始,然后将其撞到200,事情变得更糟。我们支持它降至75,然后是50,它似乎更好。是否有一些最佳数量取决于我们拥有多少CPU或一些经验法则来确定要运行的线程数?
答案 0 :(得分:6)
您运行的每个线程都附加了一个开销。如果你有2个四核,那么你一次可以运行8个线程。每个线程都将消耗一个核心。
如果你有超过8个线程,那么你有可能开始做有用的工作,而不是更多。这是因为每次windows决定给其中一个当前不占用核心的线程做一些需要存储其中一个正在运行的线程的状态,然后恢复即将运行的线程的旧状态 - 然后让线程去做吧。如果你有大量的线程,你将花费大量的时间在线程之间进行切换而不做任何有用的事情。
如果你有一堆线程被阻塞等待IO(例如一条消息完成写入磁盘以便可以得到它)那么你可能能够运行比你拥有内核更多的线程并且仍能得到一些东西有用的完成,因为许多线程将坐等待其他东西完成。这是一个复杂的主题,并没有“我应该使用多少线程”的真正答案。一个好的经验法则是每个核心都有一个线程,如果你想获得更多的吞吐量,那么尝试使用它。在真实条件下进行测试是找到最佳位置的唯一真正方法。您可能会发现只需要一个线程来处理消息,并且一半时间线程被阻塞等待消息进入....
显然,即使我所描述的内容过于简单。 Windows需要访问内核来执行操作系统的事情,所以即使你有8个内核,你的所有8个线程都不会一直在运行,因为Windows线程正在转向...那么你有IO线程等....