J'ai une machine SLES qui accumule TCP dans un état CLOSE_WAIT pour ce qui semble être éternel. Ces descripteurs finissent par aspirer toute la mémoire disponible. Pour le moment, j'ai 3037 de eux, mais il était beaucoup plus élevé avant un redémarrage rapide récemment.
Ce qui est intéressant, c'est qu'ils ne proviennent pas de connexions à des ports locaux auxquels je m'attends à avoir des processus d'écoute. Ils n'ont pas de PID associés et leurs temporisateurs semblent avoir expiré.
# netstat -ton | grep CLOSE_WAIT
tcp 176 0 10.0.0.60:54882 10.0.0.12:31663 CLOSE_WAIT off (0.00/0/0)
tcp 54 0 10.0.0.60:60957 10.0.0.12:4503 CLOSE_WAIT off (0.00/0/0)
tcp 89 0 10.0.0.60:50959 10.0.0.12:3518 CLOSE_WAIT off (0.00/0/0)
# netstat -tonp | grep CLOSE_WAIT
tcp 89 0 10.0.0.59:45598 10.0.0.12:1998 CLOSE_WAIT -
tcp 15 0 10.0.0.59:60861 10.0.0.12:1938 CLOSE_WAIT -
tcp 5 0 10.0.0.59:56173 10.0.0.12:1700 CLOSE_WAIT -
Je ne suis pas une ceinture noire en ce qui concerne la pile TCP ou la mise en réseau du noyau, mais la configuration TCP semble logique, car ces valeurs sont par défaut , par la page de manuel:
# cat /proc/sys/net/ipv4/tcp_fin_timeout
60
# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
Alors qu'est-ce qui donne? Si les temporisateurs ont expiré, la pile ne devrait-elle pas effacer automatiquement ces éléments? Je me donne effectivement un DoS à long terme à mesure que ces choses s'accumulent.
Non, il n'y a pas de délai d'expiration pour CLOSE_WAIT
. Je pense que c'est ce que le off
signifie dans votre sortie.
Sortir de CLOSE_WAIT
, l'application doit fermer explicitement le socket (ou quitter).
Voir Comment briser CLOSE_WAIT .
Si netstat
affiche -
dans la colonne de processus:
CLOSE_WAIT
indique que le client ferme la connexion mais que l'application ne l'a pas encore fermée, ou le client ne l'est pas. Vous devez identifier le ou les programmes qui rencontrent ce problème. Essayez d'utiliser
netstat -tonp 2>&1 | grep CLOSE
pour déterminer quels programmes détiennent les connexions.
Si aucun programme n'est répertorié, le service est fourni par le noyau. Il s'agit probablement de services RPC tels que nfs
ou rpc.lockd
. Les services d'écoute du noyau peuvent être répertoriés avec
netstat -lntp 2>&1 | grep -- -
À moins que les services RPC n'aient été liés à des ports fixes, ils se lieront à des ports éphémères comme vos connexions semblent le montrer. Vous pouvez également vouloir vérifier les processus et les montages sur l'autre serveur.
Vous pouvez peut-être lier vos services NFS à des ports fixes en procédant comme suit:
/etc/services
rpc.statd-bc 32763/udp # RCP statd broadcast rpc.statd-bc 32763/tcp rpc.statd 32764/udp # RCP statd écouter rpc.statd 32764/tcp rpc.mountd 32765/udp # RPC mountd rpc.mountd 32765/tcp rpc.lockd 32766/udp # RPC lockd/nlockmgr rpc.lockd 32766/tcp
--port 32763 --outgoing-port 32764
--port 32765