Bonjour,

Je vais vous expliquer un peu ma situation.

J'ai un serveur en Java (TCP, en Multithreading) d'MMORPG qui supporte jusqu'à 2000 joueurs simultanément sans vraiment aucun problème. Sachant que chaque client connecté (en TCP) a son propre thread. Bon ok c'est pas une bonne architecture, mais pour le moment elle me va très bien (avec un serveur 64 bits de 6-cœurs, assez puissant).

Dans mon code, j'ai une fonction static qui envoie les donnés à chaque client. Elle prends le PrintWriter du socket de chaque client, et écris dessus: (je résume dans cette fonction que j'ai simplifier):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
public static void send(Personnage player, String packet)
{
	PrintWriter out = player.get_socket().get_out();
	out.print((packet)+(char)0x00);
	out.flush();
}

Voila, cette fonction est appelée par n'importe quel thread (client) qui veut contacter un autre. Le seul problème que je rencontre avec cette fonction c'est dans:

out.print((packet)+(char)0x00);
out.flush();

Parmi les 2000 clients que j'ai, (soit 2000 threads et 2000 sockets) il y a un seul socket au hasard qui finit par planter en quelques sortes, et à chaque fois qu'on lui écris avec un print() ou flush() il met trop de temps. Donc tout les threads qui ont tenter de print() et flush() sur le printerWriter de ce client vont en quelques sorts sleep pour plusieurs minutes.


L'une de ces deux lignes (print/flush) mets des fois du temps pour finir. ça peut mettre des fois quelques minutes, entre 1 à 5 minutes, et des fois plus. J'ai pas arrêter de chercher l'origine de ce lag, mais je pense que c'est lié à l'os en lui même. J'ai windows server 2003 Et quand ce dernier atteins les 20Go dans la RAM (soit ~90% de sa RAM maximum) on commence à rencontrer des lags.
Par exemple si on ouvre un dossier, ou on clique sur poste de travaille, ou on ouvre une application (exemple: notepad), on doit attendre entre 10secondes à 120 secondes (voir plus) des fois pour que ça s'ouvre.

Je pense donc qu'il s'agit peut être de l'OS ? Bref, au lieu de me casser la tête pour chercher et vérifier le hardware avec mon hébergeur ou réinstaller l'OS etc, et finir par trouver que ça ne fix pas mon problème, j'ai décider de coder une class qui gère les packets d'une façon dynamique en plusieurs threads.

Une class qui s'apelle par exemple: Packet_Buffer, avec des methods genre:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
public void add_packet_to_liste(PrinterWriter envoyer_a_qui, String packet);
public void envoyer_1_packet_dans_la_liste(); // sera appelé par des threads dispo
et cette class aura à peu près 5 à 6 threads qui s'occuperont d'envoyer les packets aux clients.


Le seul problème que je rencontre maintenant c'est: Et si les 6 threads ont finit par tous planter en même temps sur le PrinterWriter.flush(), mon serveur va donc complétement planter pour plusieurs minutes..

Je cherche à savoir s'il existe une solution, peut être par exemple créer un autre thread unique qui tache à vérifier les 6 autres threads de la class, si l'un d'eux mets plus de 3 secondes, il le réinitialise ?

---
Bref ce n'est qu'une idée que j'ai en tête, je pense qu'elle est peut être pas la meilleur idée, vue comme je débute en Java, mais j'aimerais avoir l'avis de pro pour me conseiller et donner d'autres idées s'il vous plait, maintenant que vous êtes au courant de ma situation.

Ne me dites pas de refaire mon serveur avec du thread-pooling ou avec une biblio externe , je cherche juste une solution rapide et facile. J'ai pas le pouvoir ni le temps ni les compétences qu'il faut pour refaire le serveur à zéro.

Merci d'avoir lu en tout cas.