web-dev-qa-db-fra.com

Trop de connexions établies laissées ouvertes

J'ai un serveur (probablement très ancien) Centos 4.5 avec une personnalisation Java Application fonctionnant à l'intérieur.

J'ai trouvé que l'application se brisait après une certaine heure de fonctionnement et que c'était la manipulation de 1024 liaisons et essayant d'ouvrir une prise de plus en étant morte.

En fait, si je vérifie ulimit -n Je peux confirmer que c'est 1024, la demande est donc fermée car elle n'a plus de descripteurs de fichiers gratuits.

Ce qui me dérange, c'est qu'il y a des centaines de connexions apparemment inactives, dans un état "établi off", tous d'un nombre relativement petit d'IPS (environ 200) et qu'ils ont tendance à s'ajouter au fil du temps et que les clients se connectent, beaucoup comme ceux-ci que je vois courir netstat -nato:

tcp        0      0 ::ffff:10.39.151.20:10000   ::ffff:78.152.97.98:12059   ESTABLISHED off (0.00/0/0)
tcp        0      0 ::ffff:10.39.151.20:10000   ::ffff:78.152.97.98:49179   ESTABLISHED off (0.00/0/0)
tcp        0      0 ::ffff:10.39.151.20:10000   ::ffff:78.152.97.42:45907   ESTABLISHED off (0.00/0/0)

Je sais que ce n'est pas une attaque DOS, les connexions sont légitimes, mais il semble de ne pas se fermer après que les clients se connectent et effectuent une courte échange de données avec le serveur. En outre, le rythme est lent, car ils sont générés par 200 clients (comptage DIFFERENT IP) ..

Devrais-je enquêter sur un bogue d'application étrange (peut-être sur JRE 1.6) ou creuser dans la configuration du réseau Centos? Je n'ai aucune idée de ce que de plus à regarder ..

Merci d'avance, tout indice est apprécié!

5
Luke

Hypothèse 1: Votre application est derrière un pare-feu qui dépose des connexions TCP inactives après une durée donnée.

Lorsque le client tente d'utiliser cette connexion à nouveau, il ne constate pas que cela ne répond pas, le dépose un démarre un nouveau.

Pour le serveur, comme le TCP connexions ne disposent pas de minuterie de conservation, il n'y a aucun moyen de savoir que la connexion n'est pas valide et qu'elle restera ouverte indéfiniment.

Pour prouver: Faites une longue exécution TCPDump d'une connexion pour montrer qu'il devient inutilisé après une durée donnée.

Solution:

  • Changez le code pour utiliser Keepalive sur les sockets TCP et (éventuellement pour la meilleure performance) Définissez la minuterie Keepalive inférieure à la minuterie de pare-feu TCP-IDLE
  • Changez la minuterie de pare-feu TCP-IDLE à une valeur plus élevée au-delà de l'heure de ralenti fonctionnel maximale du client. Très probablement, cela constituera un cadre global sur le pare-feu. Votre administrateur de sécurité pourrait donc être légèrement réticent à le faire.
7
Zabuzzman