我有服务器和客户端(1000)服务器每秒通信。我在服务器上为每个客户端创建一个单独的线程。
我想知道的事情:
为每个客户端使用Thread是否是一个好主意(创建线程,当他们成功登录时)或是否有另一种方法可以提高服务器和客户端之间的通信效率?
使用Java编程的服务器和使用C
的客户端编程服务器规格:
64Bit TwelveCore AMD CPU 2xAMD Opteron™6174,
2,2 Ghz DDR3-RAM bis 128 GB ECC,reg。 (errorCorrected)
20 TB S-ATA II和6 TB SAS(HotSwap)HDD
谢谢
答案 0 :(得分:1)
理论上,您应该为每个客户端的请求进行单独的线程处理。 然而,实际上这不可能给出有限硬件资源的约束。限制硬件资源停止创建无限数量的线程并为每个请求创建单独的线程在操作系统要执行的任务方面是一项代价高昂的操作来管理这些线程。 要解决此问题,您应该考虑使用thread-pool来重用线程来为不同的客户端提供服务。如果您在服务器端使用Java,那么concurrency Java包(1.5以后)提供了创建和使用线程池的完整基础结构。有关详细信息,请参阅http://download.oracle.com/javase/tutorial/essential/concurrency/pools.html。
答案 1 :(得分:1)
您可以使用非阻塞NIO来共享线程之间的连接。最小数量为1;)如果您想使用Dispacher模型,我建议使用一个库来处理您的详细信息。例如网状。
在我已经完成的测试中,使用10,000个连接浪费大约1个核心。如果你有1000,我会指望你浪费大约一个核心的10%。我的观点是,虽然它的效率更高,但您的应用程序可能不值得对其进行重大更改以支持它。
答案 2 :(得分:1)
我建议您查看Java NIO(新I / O),您可以使用它来使您的服务器成为单线程(至少非常少的线程)。
以下是一些很好的例子:
http://www.exampledepot.com/egs/java.nio/NbServerSocket.html
http://www.exampledepot.com/egs/java.nio/AcceptSocket.html
http://www.exampledepot.com/egs/java.nio/NbServer.html