Tomcat

在Tomcat中殺死http nio連接的方法

  • June 30, 2016

我們有一個應用程序,它通過與他們的設備的 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 會話:

$ 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
$

包含 SOCK_DESTROY 資訊的 LWN 文章

引用自:https://serverfault.com/questions/785908