如何找出最佳线程数量?

时间:2010-10-29 06:25:10

标签: multithreading

我打算制作一个像网络连接这样的对等软件。通常我会为每个连接创建一个自己的线程来发送和接收数据,但在这种情况下有300-500 +连接,这意味着不断创建和销毁很多线程,这将是一个很大的开销我猜。并且制作一个顺序处理所有连接的线程可能会减慢一些事情。 (我对此不太确定。)

问题是:有多少线程可以处理这类问题?是否可以在软件中计算它,以便它可以决定在旧计算机上创建更少的线程,而不是那么多的资源和更多的新资源?

这是一个理论问题,我不想让它实现或依赖于语言。但是我认为很多人会建议像“只使用ThreadPool,它会处理类似的东西”所以让我们说它不会是.NET应用程序。 (我可能不得不在旧的Delphi项目中使用代码的其他部分,因此语言可能是Delphi或C ++,但还没有确定。)

5 个答案:

答案 0 :(得分:9)

了解负载下应用程序的性能是关键,正如在分析,测量和重新测试之前提到的那样。

作为一般指南Goetz谈论有

  

threads = CPU数量+ 1

用于CPU绑定应用程序,

  

CPU数量*(1 +等待时间/服务时间)

用于IO绑定上下文

答案 1 :(得分:2)

如果这是Windows(您确实提到过.Net?),那么您一定要使用I/O completion ports来实现。这是 最有效的Windows套接字I / O方式。在该文档链接上有一个特定于I / O的线程池大小讨论。

  

I / O最重要的属性   完成端口要仔细考虑   是并发值。该   完成端口的并发值   在使用时创建时指定   CreateIoCompletionPort通过   NumberOfConcurrentThreads参数。   该值限制了数量   与之关联的可运行线程   完成港口。当总数   与...相关的可运行线程   完成端口到达   并发值,系统块   任何后续的执行   与之相关的线程   完成端口直到数量   可运行的线程下降到   并发价值。

基本上,您的读取和写入都是异步的,并且由可以修改其大小的线程池提供服务。但是首先尝试使用默认值。

如何执行此操作的一个好的,免费的示例是the Free Framework。有一些问题,看看工作代码可以帮助你短路。

答案 2 :(得分:0)

  1. 使线程数可配置。
  2. 定位一些您希望支持的最常见配置。
  3. 获取一个好的性能分析器/仪器代码,然后使用不同的值1对所有不同类型的2进行严格测试,直到找到适合每种配置的最佳值。
  4. 我知道,这可能看起来像是一种不那么聪明的做事方式,但我认为在性能方面,通过测试对结果进行基准测试是真正了解其效果的唯一可靠方法

    编辑:+1链接由上面的paxDiablo作为评论发布的问题。它几乎是同一个问题,还有大量的信息,包括paxDiablo本人非常详细的回复。

答案 3 :(得分:0)

您可以根据安装中的CPU速度,内核和内存空间进行计算,并在某处设置一个常量,以告诉应用程序要使用多少线程。我想到了信号量和线程池。

我个人会将侦听套接字与发送套接字分开,并在运行时打开发送套接字而不是将它们作为守护进程运行;监听套接字可以作为守护进程运行。

多线程可能是它自己的头痛并引入了许多错误。最好的办法是让线程做一件事并在处理时阻止,以避免不希望的和不可预测的结果。

答案 4 :(得分:0)

每个CPU一个线程,处理几个(数百个)连接。