3

我们试图找出用于我们的 NServiceBus 服务的最佳线程数。我们在具有 2 个四核的机器上运行它。我们一直遇到队列备份问题。我们从 100 个线程开始,然后增加到 200 个,情况变得更糟。我们把它降到 75,然后是 50,它看起来甚至更好。是否有一些基于我们拥有多少 CPU 的最佳数字,或者我们应该使用一些经验法则来确定要运行的线程数?

4

1 回答 1

6

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

如果你有超过 8 个线程,那么你就有可能开始做 LESS 有用的工作,而不是更多。这是因为每次windows决定让一个当前不消耗核心的线程轮流做一些事情时,它需要存储一个正在运行的线程的状态,然后恢复即将运行的线程的旧状态-然后让线程继续下去。如果您有大量线程,您将花费大量时间在线程之间切换而无济于事。

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

显然,即使是我所描述的也过于简单化了。Windows 需要访问内核来做 OSy 的事情,所以即使你有 8 个内核,你的所有 8 个线程也不会总是运行,因为 Windows 线程正在轮流......然后你有 IO 线程等......

于 2012-10-19T13:53:26.000 回答