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 :

Socket, PThreads et communication client -> serveurs


Sujet :

Réseau C

  1. #1
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut Socket, PThreads et communication client -> serveurs
    Bonjour,

    Je suis en train de réaliser une application cliente qui se connecte à plusieurs serveurs.
    Pour chaque connexion à établir ( définie dans un fichier de configuration ), je stocke toutes les informations la concernant dans une structure ( descripteurs de fichiers, buffers, paramètres, ...) . A chaque connexion correspond un thread.

    L'application contient donc 2 tableaux de taille identique :
    - l'un contient les threads,
    - l'autre contient des pointeurs vers les structures correspondantes.

    De la sorte, il me semble que les informations ne peuvent pas se croiser.

    Lorsque je n'utilise qu'un serveur, ça passe. Par contre, dès que je passe à 2, les performances chutent. Les données transmises sont pourtant de taille minimale ( de l'ordre de quelques octets ).

    J'aimerais donc savoir si quelqu'un a déjà rencontré un problème similaire et pourrait éventuellement m'aider ou orienter mes recherches.

    Merci par avance.
    "Il est plus facile de décomposer un problème en ses éléments, forcément plus simples, que de le traiter en sa totalité." (R. Descartes)

    Freelance iOS

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Sans voir un code minimal ce sera difficile de trancher...

    - Que fait vraiment l'application ?
    - Quelle est la fréquence des envois ?
    - Les données sont-elles communes ou est-ce que chaque thread fait des choses séparément ?
    - Si c'est bien séparé, y-a-t-il un avantage à utiliser des threads ?
    - Si y a des choses communes, y-a-t-il des mutex/sémaphores ?

    Jc

  3. #3
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut
    Citation Envoyé par fearyourself
    Sans voir un code minimal ce sera difficile de trancher...
    Désolé, c'est confidentiel ( boulot ).

    Citation Envoyé par fearyourself
    - Que fait vraiment l'application ?
    Elle envoie une requête vers le serveur qui envoie par la suite une ou plusieurs réponse(s). Les réponses sont ensuite écrites sur un PTY. Les données sont de taille variable.

    Citation Envoyé par fearyourself
    - Quelle est la fréquence des envois ?
    Elle est variable. Les données peuvent être envoyées depuis plusieurs serveurs simultanément.

    Citation Envoyé par fearyourself
    - Les données sont-elles communes ou est-ce que chaque thread fait des choses séparément ?
    Les seules données communes sont les informations de débogage.

    Citation Envoyé par fearyourself
    - Si c'est bien séparé, y-a-t-il un avantage à utiliser des threads ?
    Avec les fork(), il y a des problèmes de portabilité.
    "Il est plus facile de décomposer un problème en ses éléments, forcément plus simples, que de le traiter en sa totalité." (R. Descartes)

    Freelance iOS

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par FloMo
    Elle envoie une requête vers le serveur qui envoie par la suite une ou plusieurs réponse(s). Les réponses sont ensuite écrites sur un PTY. Les données sont de taille variable.
    Il est simplement possible que tu satures le réseau avec tes réponses. Si tu fais deux applications séparées qui se connectent en même temps, est-ce que tu constates le même problème ?


    Jc

  5. #5
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut
    J'ai essayé en faisant un fork(). Les données sont bien séparées. J'ai des performances inférieures.

    Cependant, je me suis rendu compte que lorsque j'utilise un client vers plusieurs serveurs, c'est toujours le dernier qui a les pires performances.
    Par exemple, pour une lecture qui dure 2 secondes en temps normal, il faudra 6 secondes au dernier serveur ( selon l'ordre de création des threads, à partir de la lecture d'un fichier de configuration ).

    J'ai bien vérifié les fuites mémoire éventuelles. Tout malloc() ou calloc() a son free(). Je n'y comprend plus rien.
    "Il est plus facile de décomposer un problème en ses éléments, forcément plus simples, que de le traiter en sa totalité." (R. Descartes)

    Freelance iOS

  6. #6
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut
    Pour les échanges de données, j'utilise 2 select() : un pour les lecteurs, qui remplit un buffer, l'autre pour les écriture qui écrit éventuellement le contenu du buffer.

    Serait-il judicieux de créer un thread par tentative de lecture ou d'écriture et de le détacher de manière à accélérer les traitements ?
    En gros, cela donnerait :

    - Puis-je lire ( select() + test buffer ) ?
    - Si oui, je bloque l'accès au descripteur grâce à un mutex,
    - Je lis,
    - Je débloque le mutex.

    - Puis-je écrire (select() + test buffer ) ?
    - Si oui, je bloque l'accès au descripteur grâce à un mutex,
    - J'écris,
    - Je débloque le mutex.

    Je me demande si le laps de temps entre les traitement sera plus long ou plus court que la demande de création de thread ?
    "Il est plus facile de décomposer un problème en ses éléments, forcément plus simples, que de le traiter en sa totalité." (R. Descartes)

    Freelance iOS

  7. #7
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut
    Une question : est-ce que le fait d'ajouter des mutexes pour gérer mes messages sur stderr, stdout et varlog peut être bénéfique ?
    "Il est plus facile de décomposer un problème en ses éléments, forcément plus simples, que de le traiter en sa totalité." (R. Descartes)

    Freelance iOS

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par FloMo
    Une question : est-ce que le fait d'ajouter des mutexes pour gérer mes messages sur stderr, stdout et varlog peut être bénéfique ?
    Je ne sais pas si utiliser des mutex va aider mais cela se tente. Par contre, un mutex sert à limiter l'accès à une zone de code donc oui c'est possible de faire ce que tu veux.

    Jc

  9. #9
    Membre expérimenté
    Avatar de FloMo
    Homme Profil pro
    Freelance iOS
    Inscrit en
    Juillet 2004
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Freelance iOS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 726
    Points : 1 511
    Points
    1 511
    Par défaut
    Les mutexes sont en effet inutiles. Par contre, j'ai remarqué un comportement étrange...
    Quand je lance 2 instances de mon programme exécutant chacune une tâche d'écoute - transmission des données, j'ai exactement les mêmes symptômes, à savoir :
    - deux connexions aux serveurs séparées : pas de problème,
    - deux connexions aux serveurs avec léger différé : ça passe, mais c'est lent,
    - deux connexions aux serveurs simultanés : très lent, voir plantage.

    De plus, ce développement se passe sous SCO.

    Merci pour vos réponses.
    "Il est plus facile de décomposer un problème en ses éléments, forcément plus simples, que de le traiter en sa totalité." (R. Descartes)

    Freelance iOS

Discussions similaires

  1. RMI / communication client vers serveur
    Par FooFighters dans le forum Java EE
    Réponses: 0
    Dernier message: 06/05/2015, 19h02
  2. [EJB] communication client swing/serveur ejb
    Par afrikha dans le forum Java EE
    Réponses: 10
    Dernier message: 24/06/2008, 14h45
  3. communication client serveur avec les sockets
    Par timtima dans le forum Linux
    Réponses: 2
    Dernier message: 07/11/2007, 10h23
  4. Socket - Problème de communication client/serveur
    Par Arkinou dans le forum Réseau
    Réponses: 4
    Dernier message: 31/05/2007, 15h01
  5. Socket:Envoyer du texte d'un serveur vers tout les clients
    Par cedm78 dans le forum Web & réseau
    Réponses: 7
    Dernier message: 01/08/2002, 16h40

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