【问题标题】:What's the maximum count of active websocket connections supported by tomcat 7.0tomcat 7.0 支持的最大活动 websocket 连接数是多少
【发布时间】:2014-07-07 09:06:45
【问题描述】:

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

根据需求,我使用websocket与客户端通信,但是当很多客户端连接到服务器时,无法建立新的连接,我怀疑建立的连接数已经达到最大数。顺便说一句,tomcat使用的是APR连接器。

所以,我的问题是:

  1. tomcat 7.0 支持的最大活动 websocket 连接数是多少。
  2. 如何配置。
  3. websocket的负载均衡有没有解决办法,因为apache和mod_jk现在不能用来做负载均衡了。

任何帮助将不胜感激,在此先感谢!

【问题讨论】:

    标签: tomcat websocket


    【解决方案1】:

    要在 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的机器上可用的端口数:

      $ 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 :)
    • 我不同意这一点。并发 Web 套接字连接不依赖于 TCP 端口限制。您可以在同一个端口上拥有尽可能多的连接,服务器上可用资源和线程的限制成为服务更多请求的瓶颈,因此我们需要水平扩展以满足连接请求。参考:stackoverflow.com/questions/17448061/…
    【解决方案2】:
    1. 上限是您的服务器可以支持的 TCP 连接数。
    2. 默认强制限制将取决于您使用的连接器 - 您未能提供的信息。对于 NIO 和 APOR/native,您需要增加 maxConnections。对于 bIO,你会想要增加 maxThreads。
    3. 这取决于您使用的负载平衡器 - 再次说明您未能提供的信息。

    【讨论】:

    • 嗨,我正在使用 APR 连接器。
    【解决方案3】:

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

    【讨论】:

    【解决方案4】:

    对于你的前两个问题,我认为答案可以在 tomcat (~/conf/server.xml) 的 conf 文件夹中的 server.xml 文件中找到,请参阅 Executor 标签以及连接器的可用属性和参数以下链接可能对您有所帮助(我从 server.xml 文件 cmets 中获取):

    Tomcat Java HTTP Connector

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

    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 的连接(毕竟这是使用非阻塞 IO 的重点)。鉴于 AJP 不支持 WebSocket,该链接无关紧要。
    猜你喜欢
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多