Tomcat 中终止 http nio 连接的方法

Tomcat 中终止 http nio 连接的方法

我们有一个应用程序,它向用户发送消息,让用户通过其设备的 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
$

LWN 文章包含有关 SOCK_DESTROY 的信息

相关内容