Tomcat 7.0最大支持的活动WebSocket连接数是多少?

10

我正在开发一个游戏服务器,为了避免从头开始开发服务器,我使用了Tomcat 7.0,这样我就可以专注于游戏逻辑。

根据要求,我使用了WebSocket与客户端进行通信,但当许多客户端连接到服务器时,无法建立新连接,我怀疑已经达到了建立的连接数最大值。顺便说一句,Tomcat使用了APR连接器。

所以,我的问题是:

  1. Tomcat 7.0支持的活动WebSocket连接的最大数量是多少?
  2. 如何配置它。
  3. 是否有WebSocket的负载均衡解决方案,因为现在无法使用Apache和mod_jk进行负载均衡。

感谢您提供的任何帮助!

4个回答

15

要在Tomcat中达到最大的WebSocket连接,请进行以下配置更改。

  1. {CATALINA_HOME}/conf/server.xml

    <Connector connectionTimeout="-1" port="8080" 
           protocol="org.apache.coyote.http11.Http11NioProtocol" 
           redirectPort="8443" maxConnections="100000" acceptCount="300"/>
    
  2. 检查Tomcat部署的机器上可用的端口数量:

  3. $ cat /proc/sys/net/ipv4/ip_local_port_range
    

    将这个值从50更改为65535。

    $ sysctl -w net.ipv4.ip_local_port_range="500   65535"
    

以上的配置更改可以在一个2GB英特尔酷睿i5机器上允许约50k个活动连接,前提是服务器和客户端在不同的机器上运行。


这个问题困扰我们有一段时间了。将协议更改为NIO解决了问题。谢谢! - Bere
很高兴能帮到你,@Bere :) - Arijeet Saha
我不同意这个观点。并发的Web Socket连接并不依赖于TCP端口限制。您可以在同一端口上拥有尽可能多的连接,它的限制在于服务器可用的资源和线程数,这就成为服务更多请求的瓶颈,因此我们需要水平扩展以满足连接请求。 - Prateek Gupta

3
  1. 上限是你的服务器可以支持的TCP连接数。
  2. 默认强制限制取决于您使用的连接器 - 这是您未提供的信息。对于NIO和APOR / native,您需要增加maxConnections。对于bIO,您需要增加maxThreads。
  3. 这取决于您使用的负载均衡器 - 再次是您未提供的信息。

1
嗨,我正在使用APR连接器。 - Alanmars

0

WebSocket连接的总数取决于WebSocket服务器(在本例中为Tomcat实例)运行的操作系统允许的打开文件描述符的数量。在Unix机器上,我们有75000个文件描述符的硬限制,但我不确定Tomcat生成新套接字的能力是否有硬限制。


关于您的Websocket Apache处理程序,您可以使用以下插件来负载均衡websocket流量。http://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html - Robin Varghese

-1

对于您的前两个问题,我认为答案可以在Tomcat的conf文件夹(~/conf/server.xml)中的server.xml文件中找到。请查看Executor标签以及连接器的可用属性和参数,以下链接可能会对您有所帮助(我从server.xml文件的注释中提取了它们):

Tomcat Java HTTP Connector

正如文档所述,您可以使用连接器的属性或使用Executor并将其与连接器链接起来,请参阅连接器标记中executor属性的描述:

A reference to the name in an Executor element. If this attribute is set, 
and the named executor exists, the connector will use the executor, 
and all the other thread attributes will be ignored. Note that 
if a shared executor is not specified for a connector then 
the connector will use a private, internal executor 
to provide the thread pool.

另外,您可以覆盖Java AJP连接器的连接数:请参阅以下文档:

Java AJP Connector

对于您的最后一个问题,我认为如果现在无法使用复制和负载平衡工具,那么答案是尽快完成服务器内的工作,释放资源并使它们可用于其他客户端。


执行器与连接数无关,它只控制可用于处理这些连接的线程数。线程!=连接(这正是使用非阻塞IO的目的)。鉴于AJP不支持WebSocket,因此该链接无关紧要。 - Mark Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接