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

Threads & Processus C++ Discussion :

performance d'un pthread dans un pthread ?


Sujet :

Threads & Processus C++

  1. #1
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut performance d'un pthread dans un pthread ?
    Salutatations à toutes et à tous,

    je cherchais depuis un moment un souci de performance qu'on decouvrait sur une application qui utilise plusieurs pthreads.
    On avait des temps de création de contexte incompréhensible.

    Je viens d'en trouver la raison mais sans pour autant pouvoir l'expliquer.
    Je m'explique...

    La création de 10 000 pthreads depuis un process met 570ms sur ma machine (x86, linux ubuntu 12.04).
    Maintenant créons un pthread et lançons les 10 000 pthreads à partir de ce thread !
    Et c'est là que cela devient intéressant... On saute à 3300ms environ de temps de création !

    Quelqu'un aurait-il une piste à explorer pour expliquer ce phénomène ?

  2. #2
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Même bench lancé sur une architecture ARM et une POWERPC pour obtenir des résultats allant dans l'autre sens...
    Les deux cas lancé avec un linux non patché temps réel (pour rester comparable avec ubuntu).

    Du coup mes résultats x86 sont fortement remis en question...
    Le tout est d'arriver à les expliquer maintenant.
    Il y aurait une librarie pthread par architecture on pourrait mettre ça en devant mais là...

    Va falloir que je mette en place des tests sur système RT pour être sûr d'avoir des valeurs qui restent fixes.

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par transgohan Voir le message
    Même bench lancé sur une architecture ARM et une POWERPC pour obtenir des résultats allant dans l'autre sens...
    Les deux cas lancé avec un linux non patché temps réel (pour rester comparable avec ubuntu).

    Du coup mes résultats x86 sont fortement remis en question...
    Le tout est d'arriver à les expliquer maintenant.
    Il y aurait une librarie pthread par architecture on pourrait mettre ça en devant mais là...

    Va falloir que je mette en place des tests sur système RT pour être sûr d'avoir des valeurs qui restent fixes.
    Ce n'est pas dépendant de la librairie, mais de l'appel système sous-jacent, et du travail que doit faire l'OS pour s'y retrouver. Selon la configuration du kernel, du scheduler utilisé, et de plein d'autres paramètres, ça peut être long ou moins long.

    Si tu veux mieux comprendre ce qui se passe, c'est dans les sources du kernel qu'il faut aller voir, du coté de kernel/fork.c si ma mémorie est bonne (clone(), qui est l'appel système qui est utilisé pour créer un thread, appelle la fonction do_fork() avec les flags qui vont bien pour ne pas créer un nouveau processus). Le code est en apparence simple à suivre, mais il y a quelques subtilités ici et là.

    Ensuite, si tu veux vraiment comprendre ce qui ralentit la création des thread, il ne faut surtout pas hésiter à utiliser l'outil perf livré avec le kernel - il te permettra entre autre de faire un profiling en live du kernel.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #4
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Bon résultat de l'affaire... J'ai fini par tout faire tourner sur un OS temps réel.
    Et là les temps sont égaux.
    Note : cependant que si on désactive le swap on fait exploser les résultats.

    Comme je n'ai que des cibles finales temps réel je vais pas me casser la tête sur mon pauvre ubuntu... D'autant plus que c'est pas optimal pour les tests j'en conviens vu que j'ai plein de trucs qui tournent en parallèle.

    Mais c'est quand même marrant de voir ce genre de résultats...
    Car c'est pas un résultat de charge temporaire, j'ai tourné le script dans tous les sens et lancé le bench une petite vingtaine de fois et j'obtiens toujours les mêmes écarts.

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 17/05/2011, 11h49
  2. [AC-2003] Performances entre requêtes écrites dans le code ou à partir de l'interface
    Par lio33 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/10/2009, 16h24
  3. ajout d'un pthread dans autotool
    Par ikuzar dans le forum Débuter
    Réponses: 1
    Dernier message: 14/08/2009, 03h32
  4. [Performances] Séparer les tables dans plusieurs bases ?
    Par Seb33300 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 29/09/2007, 19h55

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