我们有一个应用程序,它通过与他们的设备的 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 中的那些连接?或者另一种方法也不错。
从 4.5 开始,Linux 内核支持 SOCK_DESTROY 操作,允许销毁套接字(包括那些连接到 TCP/IP 连接的套接字),例如,使用
ss(8)
. 例如这里是一个 ssh 会话:看到与
ss
:终止连接:
被杀:
包含 SOCK_DESTROY 信息的 LWN 文章