Bonjour à tous.
Je suis dans le cadre d'un process qui accepte une grande quantité de connections socket persistente (plus de 2000). Ce process devra gerer tout un tas de chose de façon continu et independament des clients connectés. En plus de ça, bien sur il devra gerer les clients et leurs interractions les uns avec les autres.
J'ai donc choisis d'eviter de bosser avec des thread qui m'obligeraient à gerer des mutex ou autres semaphores qui sont souvent source de galere. D'autre part je prefere eviter de creer 2000 thead si 2000 clients. Je suis donc sur un seul process, mais j'ai prevu la possibilité d'en lancer d'autre identiques et qu'ils soient tous liés les un aux autre via INET_UNIX socket pour permettre la com entre client si besoin.
Reste à savoir comment gerer les evenements socket. Actuellement je suis partis sur des sockets non bloquant sur une boucle qui fait ceci :
traitements divers necessitant plus ou moins de passages dans la boucle
accept() sur le socket
boucle sur tous les clients pour faire :
recv() // si <0 rien à lire, si ==0 deco du client sinon lire message et traiter
send() si ya qq chose à envoyer (avec gestion de buffer plein etc..)
Ma boucle générale fait une pause avec usleep de 500 µsec (en dessous je bouffe du cpu) moins le temps passé à traiter la passe. Donc à vide mon cpu tourne à 1% et en pleine charge il tournera à 100%.
Le defaut c'est que d'une part je ne lis/accept/send les messages que toutes les 500µsec au mieux (mais bon ça à la rigueur c'est pas grave). Mais surtout que je suis obligé de parcourir la liste de tous mes clients pour faire le recv non bloquant.
Si je me tourne vers poll() je suis obligé de parcourir tous les fd (ce qui revient à parcourir tous les clients et à faire un recv). Ensuite d'apres le fd qui à un event, je dois retrouver mon objet client associé (eventuellement table de hash ?).
L'idéal aurait été de ne pas avoir à boucler sur tous les clients ou tous les fd pour savoir si ya ou non un event.
J'aimerai avoir votre avis là dessus.
Merci à tous.
Partager