我目前在Tomcat 9上有一个用Java 8内置的Web应用程序。此应用程序通过javax.websockets + ServerEndpoint使用Websockets,并与Javascript客户端连接。
当我对该服务器进行压力测试时,如果打开的Websockets的数量达到2000,则服务器将停止处理请求,直到某些Websocket连接关闭并将计数降至2000以下。内存,文件句柄或CPU限制,并且由于它可以快速处理实际事务,因此在停止时队列中基本上没有任何内容。就我的Web应用而言,当连接数为2000时,它甚至没有收到请求。
服务器使用APR本机作为其HTTP连接器,更多使用默认设置。我曾尝试调整maxConnections和maxThreads,但它们似乎对此没有影响。该服务器是AWS上的单个EC2实例。
除了这两个可能控制最大套接字数的参数外,我在Tomcat文档中什么都没有看到。这是我们连接器的条目
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="1000" scheme="https" SSLEnabled="true"
SSLCertificateFile="conf/cert.crt"
SSLCertificateKeyFile="conf/nopasskey.pem"
SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
/>
我在这里错过了什么吗?还有其他选项可以控制最大允许的网络套接字吗?
注意:我只是想澄清一下,当达到此限制时,用户仍然可以连接到服务器。但是,它们的连接似乎被放在某种等待队列中进行处理,而不是仅以2000个连接的方式移交给Web应用程序。这样一来,用户仍然可以连接,但是在将连接分配给Web应用之前,他们不会得到响应。
答案 0 :(得分:0)
我完全看了一下,但是有一个条目重定向到APR连接器。该重定向实际上并不起作用,因为 redirectPort 参数仅对特定触发器上的重定向有效。
如果此连接器支持非SSL请求,并且请求为 收到需要SSL的匹配项 运输,Catalina会自动将请求重定向到 这里指定的端口号。
将APR连接器设置为主连接器并且不重定向它之后,我的配置选项开始按预期工作。以前,它使用的是HTTP / 1.0连接器(又名NIO)。