Tomcat
在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 中的那些連接?或者另一種方法也不錯。
從 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 $