2011-12-22 1 views
1

J'ai écrit l'application serveur Java, il peut accepter 3800-4000 connexions réseau simultanément et la charge CPU/réseau est faible (< 40%) Mais après ce seuil, il rejette nouveau connexion ou l'accepter en tuant un ancien, donc le nombre de connexions en direct est d'environ 3800-4000 (le nombre varie). Quelqu'un peut-il me donner au moins un indice sur ce qui peut être un goulot d'étranglement ici - mon logiciel lui-même, la configuration de l'OS ou CPU/NAT (indépendamment du fait qu'ils disent qu'ils sont chargés moins de 40%)?Le serveur réinitialise les nouvelles connexions mais la charge du processeur/réseau est faible

CPU: 4-coeur (un noyau est chargé 50%, autres 3-25%) Environnement: Amazon EC2, Windows Server 2003 R2

Edit: utilisation de la mémoire est inférieure à 500 Mb JRE est 32bit, 1.6.0_30 MaxUserPort est réglé sur 65534

+1

Avez-vous regardé votre utilisation de la mémoire? –

+0

Quelle version de Java? Architecture 32 ou 64 bits? –

+0

L'utilisation de la mémoire est inférieure à 500 Mo JRE est 32 bits, 1.6.0_30 – Rage

Répondre

0

Je pense que vous êtes limité par le nombre de ports dynamiques locaux, qui se situe autour de 4000 sur win *. Il y a un certain nombre de paramètres dans le registre Win * qui peuvent également limiter le nombre de connexions simultanées. Voir this article pour la liste.

+0

Merci pour l'article, mais si vous vouliez dire [HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ Tcpip \ Paramètres] MaxUserPort qui est 5000 par défaut - je l'ai mis à 65534 avant de démarrer le serveur. J'ai essayé d'autres paramètres - mais cela n'a pas changé le résultat global – Rage

+0

J'ai remarqué que vous utilisez Java 1.6.0_30. Avez-vous essayé de regarder votre serveur via VisualVM? Quelque chose d'intéressant là-bas? – mazaneicha

0

il rejette nouvelle connexion

correcte. Une fois la file d'attente du backlog TCP remplie, aucune autre connexion ne sera acceptée. Windows émettra un RST, d'autres plateformes ignoreront simplement la demande entrante. Dans le premier cas, le client obtiendra une «connexion refusée», dans le second cas, le client obtiendra «connexion expirée».

ou l'accepter en tuant ancien

Je ne l'ai jamais vu que, dans plus de 20 ans de mise en réseau. Quels sont les symptômes qui vous ont amené à cette conclusion?

+0

Je fais un test de stress de mon logiciel sever et j'exécute plusieurs processus sur la machine client (avec des centaines de connexions au serveur à l'intérieur de chacun d'entre eux). Lorsque le nombre total de connexions est d'environ 3800 et que j'exécute un nouveau processus client, le nombre de threads des anciens processus diminue. J'ai donc conclu le serveur réinitialiser les anciennes connexions (nombre de threads tué ~ nombre de threads nouvellement créés dans le nouveau processus). Oui, peut-être que je me suis trompé ici, parce que je n'ai pas vu d'erreur liée à la connexion, seuls les threads comptent. – Rage

+0

En fait, j'obtiens 'Connection reset', pas 'Connection refused'. – Rage

Questions connexes