Java多线程网络,好还是坏?

Java多线程网络,好还是坏?,java,multithreading,sockets,Java,Multithreading,Sockets,我运行多个游戏服务器,我想开发一个自定义应用程序来管理它们。基本上所有游戏服务器都将连接到应用程序以交换数据。我不希望这些数据丢失,所以我认为最好使用TCP。我研究过网络,了解它是如何工作的,但是我对cpu的使用有一个疑问。更多的服务器正在增加,在未来几个月内,它可能达到100-200台左右,并将根据需要继续增长。每台服务器的新线程会占用大量cpu吗?这样做是个好主意吗?有没有人对此有什么建议?谢谢 您应该看看非阻塞io。使用阻塞io时,每个套接字将消耗1个线程,并且系统中的线程数是有限的。即使

我运行多个游戏服务器,我想开发一个自定义应用程序来管理它们。基本上所有游戏服务器都将连接到应用程序以交换数据。我不希望这些数据丢失,所以我认为最好使用TCP。我研究过网络,了解它是如何工作的,但是我对cpu的使用有一个疑问。更多的服务器正在增加,在未来几个月内,它可能达到100-200台左右,并将根据需要继续增长。每台服务器的新线程会占用大量cpu吗?这样做是个好主意吗?有没有人对此有什么建议?谢谢

您应该看看非阻塞io。使用阻塞io时,每个套接字将消耗1个线程,并且系统中的线程数是有限的。即使你能创造1000+,这也是一个值得怀疑的方法


使用非阻塞io,您可以使用单个线程为多个套接字提供服务器。这是一种更具可扩展性的方法+您可以控制在任何给定时刻运行的线程数量。

您应该了解非阻塞io。使用阻塞io时,每个套接字将消耗1个线程,并且系统中的线程数是有限的。即使你能创造1000+,这也是一个值得怀疑的方法

使用非阻塞io,您可以使用单个线程为多个套接字提供服务器。这是一种更具可伸缩性的方法+您可以控制在任何给定时刻运行的线程数量

更多的服务器正在增加,在未来几个月内,它可能达到100-200台左右,并将根据需要继续增长。每台服务器的新线程会占用大量cpu吗?这样做是个好主意吗

这是一个标准的答案,提醒远离100个线程和NIO解决方案。然而,需要注意的是,NIO方法的实现要复杂得多。从代码的角度来看,将与服务器连接的交互隔离到单个线程有其优点

除了堆栈内存外,现代操作系统可以用很少的开销来分叉1000个线程。如果您确定自己的比例因子(即,您不会达到10k连接或其他),并且您拥有核心内存,那么我会说每个TCP连接的线程可以非常好地工作。我已经非常成功地运行了1000个线程的应用程序,并且没有看到由于上下文切换而导致的性能下降,而以前的处理器/内核就是这种情况

更多的服务器正在增加,在未来几个月内,它可能达到100-200台左右,并将根据需要继续增长。每台服务器的新线程会占用大量cpu吗?这样做是个好主意吗

这是一个标准的答案,提醒远离100个线程和NIO解决方案。然而,需要注意的是,NIO方法的实现要复杂得多。从代码的角度来看,将与服务器连接的交互隔离到单个线程有其优点


除了堆栈内存外,现代操作系统可以用很少的开销来分叉1000个线程。如果您确定自己的比例因子(即,您不会达到10k连接或其他),并且您拥有核心内存,那么我会说每个TCP连接的线程可以非常好地工作。我已经非常成功地运行了1000个线程的应用程序,并且没有看到由于上下文切换而导致的性能下降,而以前的处理器/内核就是这种情况。

这里有点宽泛。好吧,试试看。多线程网络是一个很好的东西。只要你有足够的内存和一个相当新的*nix内核,100个线程的性能应该会很好。我们运行的线程比这多得多。每个套接字线程不是一个可扩展的模型,不。CPU比网络快得多,一个线程可以跟上许多客户端计算机。当您只有几个连接时,每个连接一个线程有利于简化。它可能仍然适用于100-200,但这已经进入了需要切换到非阻塞IO以提高性能的范围。这不是关于@Affe的线程数,而是关于代码复杂性和维护。这里有点宽泛。好吧,试试看。多线程网络是一个很好的东西。只要你有足够的内存和一个相当新的*nix内核,100个线程的性能应该会很好。我们运行的线程比这多得多。每个套接字线程不是一个可扩展的模型,不。CPU比网络快得多,一个线程可以跟上许多客户端计算机。当您只有几个连接时,每个连接一个线程有利于简化。它可能仍然适用于100-200,但这已经进入了需要切换到非阻塞IO以提高性能的范围。这与@Affe的线程数无关,而与代码复杂性和维护有关。创建多个线程也会消耗大量内存,因为每个线程都有一个堆栈(在使用Oracle Java的Windows上,默认大小为2 MB)。因此,例如,对于所有这些线程的堆栈,1000个线程=2 GB的内存。创建多个线程也会消耗大量内存,因为每个线程都有一个堆栈(在使用Oracle Java的Windows上,默认大小为2 MB)例如,对于所有线程的堆栈,1000个线程=2 GB内存。