Nous avons un serveur java fonctionnant sous linux sur un port spécifique qui accepte des connexions persistantes pour des milliers et des milliers d'utilisateurs. Récemment, nos clients n'ont pas pu se connecter avec une erreur de temporisation. Nous pensons que le trafic devient trop élevé, mais notre journal java montre en fait que peu de personnes sont connectées par seconde.
Nous soupçonnons que cela pourrait être que trop de gens essaient en même temps et qu'ils sont fondamentalement abandonnés au niveau du système d'exploitation et donc le programme java n'a jamais vraiment la chance d'accepter la connexion? Existe-t-il une sorte de connexion à Linux qui peut montrer à quelqu'un qui essaie de toucher un socket?
iptables -I INPUT -p tcp --dport some_port -m state --state NEW
. Notez que sauf si vous êtes intéressé par les détails de chaque tentative de connexion, l'omission-j LOG
évite de spammer le fichier journal du système avec de nombreuses données inutiles.Quand j'ai des problèmes de réseau vraiment désagréables, j'ai tendance à déclencher le wirehark . Pour moi, il n'y a pas de meilleur outil de diagnostic de réseau quand je dois passer aux détails. Et ne vous inquiétez pas si vous ne pouvez pas l'installer sur la boîte source ou de destination; vous pouvez exécuter
tcpdump -w
pour écrire des données de paquets dans un fichier au début et / ou au point de terminaison, et alimenter le fichier en wirehark sur une autre boîte à votre convenance.la source
tcpdump -nS dst port <some port>
Ce serait bien de voir précisément ce que vos threads Java obtiennent au niveau du socket. En même temps, vous voudriez corréler cela avec les informations du réseau OS. Jetez un œil à AppFirst. Ils peuvent faire ce genre de chose.
la source
affiche les connexions actuellement établies.
Comparez cela avec vos
ulimit
paramètres actifs , et bien sûr avec le nombre maximum de connexions que votre application Java peut gérer.la source