Delphi 5 et threads en nombre
Bonjour,
Me voici confronté a un problème de thread...
J'ai fait un petit serveur a partir des composants TServerClientWinsocket.
Ce serveur de fonctionnais plutot pas mal jusqu'au jour ou je me suis retrouvé avec plus de 2000 connectés.
On dirais qu'il n'est pas possible de creer plus de 2000 threads :bug:
En effet je créé un thread pour chacun des connectés. :cry:
J'ai pas forcément choisi la bonne solution a ce moment la mais je n'imaginais pas dépasser les 500 connectés simultanément.
Voici donc mes questions :
Comment depasser cette limite de 2000 threads ? (je ne sais pas par quoi ni comment elle est fixée)
D'autre par j'utilise les directives suivantes :
{$A+,B-,C+,D+,E-,F-,G+,H+,I+,J+,K-,L+,M-,N+,O-,P+,Q+,R+,S-,T-,U-,V+,W+,X+,Y+,Z1}
{$MINSTACKSIZE $00004000}
{$MAXSTACKSIZE $00100000}
{$IMAGEBASE $00400000}
{$APPTYPE GUI}
Il semblerais que quand je joues avec ces valeurs le nombre de threads maximum pouvant etre créé change (le hic c'est que je depasse jamais 2000)
Dans l'idéal je souhaiterais repousser la limite des threads a l'espace mémoire de ma machine. Au pire j'aimerais bien repousser cette limite au moins a 5000 voir 10 000.
Merci de votre aide qui me sortira d'un mauvais pas ^^
PS : Je vous fait grace du contexte qui est un peu plus compliqué que ca...
Pool de threads et tout un tas de choses ignobles pour faire quelques calculs prédictifs...
Que fait ce petit serveur ^^
Voila grosso modo ce que ce serveur fait :
Y a en frontal un Thread pool servant a gerer les connections socket.
Ce thread pool augmente son nombre de threads de traitements selon l'activitée du processeur et du nombre de connections.
Ces threads sont spécialisés dans le traitement des données entrantes.
D'autre part il y a un autre thread pool qui lui se charge d'ecrire les données résultantes vers les différents clients. (ce pool est géré de la meme manière que le frontal)
Jusque la rien de bien méchant. A ceci pret que mon nombre de client a augmenté (ce de manière exponentielle)
Ce qui fait que grosso modo je me retrouve avec pas moins de 10 000 socket...
D'autre part apres avoir recu des données d'un client je les passe a une 3 eme série de threads qui eux vont s'occuper de vérifier la cohérence des calculs fait par le client par rapport a ceux du serveur pour résoudre les soucis.
Les calculs faits par le serveur sont eux gérés par un 4eme pool de threads...
Voila a peu pres comment le code veut fonctionner ^^
Maintenant je me retrouve a devoir augmenter le nombre de threads du pool frontal ainsi que du pool sortant pour conserver de la réactivité.
Ce qui fait que j'ai fini par atteindre cette fameuse limite de 2000 dont j'aimerais bien me passer ^^.
Je dois avouer que réarchitecturer ce code reviendrais a me jetter par la fenetre...
Le pire dans tout ca c'est que pour optimiser un peu le tout j'avais choisis une machine avec plusieurs processeurs physiques histoire que la gestion des threads ne bouffe pas trop de temps par rapport a l'execution du thread lui meme...