IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Server multi client conception


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut Server multi client conception
    Bonjour,

    N'étant pas expert sur le développement d'application serveur à forte charge, je vous porte une réflexion autour du concept d'un serveur vers plusieurs milliers de clients.

    A l'heure actuelle, j'ai un serveur pouvant accepter plusieurs clients.
    J'ai choisi de n'utiliser qu'un seul thread pour gérer l'ensemble de mes clients connectés par le biais d'un liste chainée. Chaque nouvelle connexion crée un élément supplémentaire dans ma liste et chaque déconnexion en retire un.
    Ensuite, j'utilise le couple select()/FD_ISSET() en parcourant ma liste chainée pour déterminer quel client envoi un message.

    Ma réflexion :
    Je vais avoir une montée en charge sur le nombre de clients, plusieurs milliers sur un seul serveur, à l'heure actuelle j'en ai une centaine max.
    La solution déjà mise en place (une liste chainée dans un seul thread) n'ira pas, le temps pour parcourir la liste chainée avec un FD_ISSET() pour déterminer quel client envoi un msg n'est pas viable avec plusieurs milliers de clients.

    J'envisage une solution utilisant une dizaine de threads dédiés aux sockets clientes.
    Chaque thread gère alors une liste chainée de 1000 sockets max (1000x10 = 10000 clients max pour l'application).
    Un nouveau thread gère la répartition des clients sur la 10aine de thread dédiées aux sockets clientes.

    Cette architecture réponds à mon besoin, mais comment auriez-vous fait pour manager 10000 clients (ou plus) sur un seul serveur ?

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Deja, j'utiliserai des tableaux plutot que des listes chainees, mais c'est un avis perso (il y a des pour et des contre dans les deux cas).

    Apres, ca depend de l'activite : est-ce qu'elle est faible, ou bien est-ce que tu recois des donnees en permanence partout ? Et que fais-tu des donnees ?

    Si tu recois des donnees en permanence et que tu dois les stocker, alors un thread pour 1000 connexions est probablement insuffisant.
    Si tu recois 2 donnees toutes les 10 minutes, et que tu dois juste les analyser pour je ne sais quoi, alors un thread pour 1000 connexions est plus que suffisant.

    Enfin, une fois que tu auras ton archi de thread, en utiliser 5 ou 50, ca ne demandera pas beaucoup d'adaptation.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2012
    Messages : 82
    Points : 132
    Points
    132
    Par défaut
    Bonjour,

    Je pense que les listes chainées seront plus avantageuses sur la gestion des ajouts et des suppressions d'éléments par rapport à un tableau.

    Par exemple s'il doit supprimer la case 500 de son tableau de 1000 après il doit décaler tout son tableau, alors que s'il utilise les listes chainées il a juste à manipuler 2 pointeurs dans le cas d'une liste doublement chainée.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    Deja, j'utiliserai des tableaux plutot que des listes chainees, mais c'est un avis perso (il y a des pour et des contre dans les deux cas).
    J'ai pris la liste chainée pour la raison évoquée par DrDarko.
    Apres, ca depend de l'activite : est-ce qu'elle est faible, ou bien est-ce que tu recois des donnees en permanence partout ? Et que fais-tu des donnees ?

    Si tu recois des donnees en permanence et que tu dois les stocker, alors un thread pour 1000 connexions est probablement insuffisant.
    Si tu recois 2 donnees toutes les 10 minutes, et que tu dois juste les analyser pour je ne sais quoi, alors un thread pour 1000 connexions est plus que suffisant.
    L'activité peut être soutenue par moment, même si le débit peut être considéré comme faible. Les clients peuvent être connecté assez longtemps, sans émettre en permanence, d'où cette quantité de connexions simultanées possible (10000).
    Il y a stockage dans une base de données via un autre thread dédié

    Enfin, une fois que tu auras ton archi de thread, en utiliser 5 ou 50, ca ne demandera pas beaucoup d'adaptation.
    Oui ca c clair

    Merci pour vos réponses

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Je fais la chose suivante :
    J'ai un tableau de potentielles sockets. La cellule 0 contient la master socket (la connexion principale), et les autres cellules les id des sockets ouvertes. Les cases vides contiennent -1 (id non valable pour une socket).
    Je parse mon tableau a coup de FD_ISSET, et je traite si le resultat est positif.
    Si j'arrive a une cellule contenant -1, je sais que j'ai atteint la fin du tableau.
    Je n'ai plus qu'a intervertir les dernieres cellules du tableau avec les cases des sockets qui ont ete fermees, s'il y en a (3 ecritures d'entier en acces direct : -1 lors de la fermeture, copie du numero de la socket, puis -1 dans la derniere case).
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Enfin, une fois que tu auras ton archi de thread, en utiliser 5 ou 50, ca ne demandera pas beaucoup d'adaptation.
    C'est pas utile avec son architecture d'avoir beaucoup plus de thread que de cores.

    Plutot que select ou poll, il arrive un moment ou il faut envisager d'utiliser des choses specifiques a la plateforme (/dev/poll sous Solaris, epoll sous Linux, il me semble que certains BSD ont quelque chose de dimilaire) qui evite une recherche en O(N) pour trouver le fd sur quoi il y a de l'activite.

    Une autre piste est de n'avoir qu'une thread qui fait le select mais passe les fd sur lesquels il faut agir aux autres threads, comme ca il y a moins de risque que toute l'activite se passe sur les fd d'une thread donnee en gardant les autres bloquees sur le select.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Je fais la chose suivante :
    J'ai un tableau de potentielles sockets. La cellule 0 contient la master socket (la connexion principale), et les autres cellules les id des sockets ouvertes. Les cases vides contiennent -1 (id non valable pour une socket).
    Je parse mon tableau a coup de FD_ISSET, et je traite si le resultat est positif.
    Si j'arrive a une cellule contenant -1, je sais que j'ai atteint la fin du tableau.
    Je n'ai plus qu'a intervertir les dernieres cellules du tableau avec les cases des sockets qui ont ete fermees, s'il y en a (3 ecritures d'entier en acces direct : -1 lors de la fermeture, copie du numero de la socket, puis -1 dans la derniere case).

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Plutot que select ou poll, il arrive un moment ou il faut envisager d'utiliser des choses specifiques a la plateforme (/dev/poll sous Solaris, epoll sous Linux, il me semble que certains BSD ont quelque chose de dimilaire) qui evite une recherche en O(N) pour trouver le fd sur quoi il y a de l'activite.
    Exactement le genre de chose que je cherche, je vais jeter un oeil à epoll
    C'est bien la recherche O(N) qui me gène le plus.

    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Une autre piste est de n'avoir qu'une thread qui fait le select mais passe les fd sur lesquels il faut agir aux autres threads, comme ca il y a moins de risque que toute l'activite se passe sur les fd d'une thread donnee en gardant les autres bloquees sur le select.
    Effectivement, très intéressant, je me note ça dans un coin


  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2011
    Messages : 19
    Points : 33
    Points
    33
    Par défaut
    epoll : parfait dans mon cas, j'ai fait une petit implémentation pour voir hier et ca va le faire.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Généralités] De la conception d'un projet multi-client
    Par cladoo dans le forum WinDev
    Réponses: 5
    Dernier message: 20/06/2012, 15h18
  2. Server multi clients
    Par jbarreau-mainson dans le forum Réseau
    Réponses: 6
    Dernier message: 18/03/2009, 16h19
  3. Server multi-client en udp
    Par blurp2 dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 16/04/2007, 09h50
  4. Création d'un Serveur Multi Client
    Par N*E*R*D dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/03/2004, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo