Назад | Перейти на главную страницу

Способ убить соединения http nio в Tomcat

У нас есть приложение, которое отправляет сообщения пользователям для доступа к нашему серверу (Apache tomcat) через HTTPS-соединение со своими устройствами. Проблема в том, что это пользовательское приложение поддерживает соединение (или открыто) на нашем сервере 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» службы.

Поскольку наша система знает, что эти соединения больше не должны быть активными (мы знаем, что у нас может быть проблема либо в приложении для телефона, либо на нашем сервере)

Итак, мой вопрос, не убивая кота, есть ли способ убить эти соединения в коте? Или другой способ тоже подойдет.

Начиная с версии 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