我们有一个应用程序,它向用户发送消息,让用户通过其设备的 HTTPS 连接访问我们的服务器 (Apache tomcat)。问题是这个用户应用程序在我们的 Tomcat 服务器中保持连接处于活动状态 (或打开状态)。
为了解决这个问题,我们配置了连接器,maxThreads="2700"
并connectionTimeout="20000"
<Connector port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true"
maxThreads="2700" scheme="https" secure="true"
keystoreFile="********" keystorePass="*****"
clientAuth="false" sslProtocol="TLS" connectionTimeout="20000"
ciphers="[lots of ciphers here]"/>
问题是我们的服务器处于繁忙状态,我们甚至无法访问管理器页面。上次我们可以访问它,管理器页面的 http-nio-8443 部分是:
"http-nio-8443"
Max threads: 2700 Current thread count: 1356 Current thread busy: 1354
Keeped alive sockets count: 1 Max processing time: 46426 ms Processing time: 6766.788 s
Request count: 73225 Error count: 1415 Bytes received: 17.77 MB Bytes sent: 12.28 MB
下面是所有已连接客户端的列表,其中包含其连接的详细信息。它们在本节中以服务“S”标记
因为我们的系统知道这些连接不应该再存在(我们知道我们可能在手机应用程序或服务器中存在问题)
所以,我的问题是,不终止 tomcat 是否有办法终止 tomcat 中的这些连接?或者另一种方法也不错。
答案1
从 4.5 开始,Linux 内核支持 SOCK_DESTROY 操作,允许销毁套接字(包括连接到 TCP/IP 连接的套接字),例如使用ss(8)
。例如,这是一个 ssh 会话:
$ set | grep SSH_CLIENT
SSH_CLIENT='127.0.0.1 52266 22'
$
查看与以下内容的联系ss
:
# ss dst 127.0.0.1:52266
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 0 127.0.0.1:ssh 127.0.0.1:52266
终止连接:
# ss --kill dst 127.0.0.1:52266
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 0 127.0.0.1:ssh 127.0.0.1:52266
殺亡:
$ packet_write_wait: Connection to 127.0.0.1 port 22: Broken pipe
$