我打算制作一个像网络连接这样的对等软件。通常我会为每个连接创建一个自己的线程来发送和接收数据,但在这种情况下有300-500 +连接,这意味着不断创建和销毁很多线程,这将是一个很大的开销我猜。并且制作一个顺序处理所有连接的线程可能会减慢一些事情。 (我对此不太确定。)
问题是:有多少线程可以处理这类问题?是否可以在软件中计算它,以便它可以决定在旧计算机上创建更少的线程,而不是那么多的资源和更多的新资源?
这是一个理论问题,我不想让它实现或依赖于语言。但是我认为很多人会建议像“只使用ThreadPool
,它会处理类似的东西”所以让我们说它不会是.NET应用程序。 (我可能不得不在旧的Delphi项目中使用代码的其他部分,因此语言可能是Delphi或C ++,但还没有确定。)
答案 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链接由上面的paxDiablo作为评论发布的问题。它几乎是同一个问题,还有大量的信息,包括paxDiablo本人非常详细的回复。
答案 3 :(得分:0)
您可以根据安装中的CPU速度,内核和内存空间进行计算,并在某处设置一个常量,以告诉应用程序要使用多少线程。我想到了信号量和线程池。
我个人会将侦听套接字与发送套接字分开,并在运行时打开发送套接字而不是将它们作为守护进程运行;监听套接字可以作为守护进程运行。
多线程可能是它自己的头痛并引入了许多错误。最好的办法是让线程做一件事并在处理时阻止,以避免不希望的和不可预测的结果。
答案 4 :(得分:0)
每个CPU一个线程,处理几个(数百个)连接。