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

Java Discussion :

Nombre optimal de thread


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 119
    Par défaut Nombre optimal de thread
    Bonjour,

    J'ai une application que j'ai voulu optimiser avec des threads.
    En gros j'ai un certain nombre d'objet, et j'ai une fonction qui effectue un traitement d'environ 10secondes sur chacun de ces objets.

    J'ai décidé de threader le tout et donc mes objets sont dans une pile et j'ai N thread qui viennent faire un pop() sur la pile et font leur petite affaire dans leur coin.

    Au début je pensais qu'idéalement il fallait avoir autant de threads que de cœurs, pas un de plus, pas un de moins. J'ai donc mis 4 threads, j'ai pas eu de vrai gains de perf. J'ai tenté 2 et 8 threads, toujours pas de vrai gain.

    J'ai donc pété mon cable et j'ai mis 40 threads... et là, magie, temps de traitement divisé par 4 !
    J'ai donc encore plus pété mon câble et j'en ai mis 100... mais là le tas n'a pas aimé .

    Ma question est donc simple : comment qu'on calcule le nombre de threads optimal qu'il nous faut ?

    Dans mon cas, les thread font quelques requêtes HTTP, donc j'imagine que c'est ça qui explique qu'il soit plus rentable d'avoir plus de threads que de coeurs (le temps que la requête fasse l'aller retour, d'autres threads peuvent bosser)... m'enfin c'est qu'une supposition et je suis pas vraiment sûr de ce que je raconte.

    Voilà voilà, donc please éclairez my lanterne

    Thx !

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Citation Envoyé par Mopmop Voir le message
    Dans mon cas, les thread font quelques requêtes HTTP, donc j'imagine que c'est ça qui explique qu'il soit plus rentable d'avoir plus de threads que de coeurs (le temps que la requête fasse l'aller retour, d'autres threads peuvent bosser)... m'enfin c'est qu'une supposition et je suis pas vraiment sûr de ce que je raconte.
    !
    En effet si tu as plein d'I/O "bloquantes" dans les threads, cela pourrait tres bien expliquer ton gain.
    Dans le cas contraire, tu va finir pas avoir trop de thread qui se battent pour le processeur.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre émérite Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Par défaut
    Tu peux aussi faire un truc qui mesure si on peut ajouter un thread de plus

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Accessoirement, si tu veux vraiment optimiser tes traitements, fais en sorte que plusieurs instances de ton application puissent tourner en parallèle.

    En effet, il a été démontré que l'OS réparti mieux les ressources sur 4 JVM de taille moyenne que sur une seule JVM phagocytée...

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Mopmop Voir le message

    Ma question est donc simple : comment qu'on calcule le nombre de threads optimal qu'il nous faut ?
    Exactement comme tu l'a fait: par la mesure

  6. #6
    Membre émérite Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Par défaut
    Sinon comment les thread sont créés ?
    Avec cette ExecutorService.newCachedThreadPool
    Cela devrait engendré un pool de thread de la bonne taille en bouclant dessus pour lancer les thread.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 119
    Par défaut
    Citation Envoyé par BenWillard Voir le message
    Tu peux aussi faire un truc qui mesure si on peut ajouter un thread de plus
    Comment ? Je vois pas bien comment on peut juger dynamiquement si on peut ajouter un thread ou non...

    Citation Envoyé par sinok Voir le message
    Accessoirement, si tu veux vraiment optimiser tes traitements, fais en sorte que plusieurs instances de ton application puissent tourner en parallèle.

    En effet, il a été démontré que l'OS réparti mieux les ressources sur 4 JVM de taille moyenne que sur une seule JVM phagocytée...
    C'est trop compliqué pour que ça vaille le coup dans mon cas, mais c'est bon à savoir, j'y penserai si j'ai des gros problèmes d'optimisation.
    Citation Envoyé par tchize_ Voir le message
    Exactement comme tu l'a fait: par la mesure
    Le problème de la mesure en tâtonnant comme je l'ai fait c'est qu'à la fin j'ai le nombre optimal de thread pour MA machine... c'est pas portable comme méthode

    Citation Envoyé par NicoL__ Voir le message
    Sinon comment les thread sont créés ?
    Avec cette ExecutorService.newCachedThreadPool
    Cela devrait engendré un pool de thread de la bonne taille en bouclant dessus pour lancer les thread.
    Je fais un truc tout con :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for ( int i = 0 ; i < nombreDeThreads ; i++ )
                    new ThreadQuiGetInfos().start() ;
    et en avant la musique...
    Je connais pas les pool de threads, j'irai voir de ce côté à l'occasion.


    Ceci dit, je suis très content des performances de mon appli, donc je ne cherche pas à l'optimiser d'avantage, mais seulement à savoir comment rendre mon optimisation "portable".
    Pour l'instant je prévois de faire 10 threads par coeur disponible (valeur optimale pour moi), mais c'est plus un coup de poker qu'autre chose...

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Si t'as vraiment besoin d'adapter à l'hote, sache que ta valeur dépendra:
    de ton algorithme
    de la vitesse et la latence du réseau
    de la surcharge du serveur distant visé
    de la mémoire disponible
    des process en cours d'exécution.
    de la jvm

    Soit t'as plein de machine dispo et tu cherche un optimum général
    Soit tu prend une valeur à pif qui donne des bon truc chez toi
    Soit tu fait de la mesure en temps réel. Genre démarrer 10 thread, et ajouter 2 par deux en mesurant en continu le temps moyen de traitement. Quand ca commence à décroitre, tu "suppose" avoir atteind l'optimal.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 119
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Si t'as vraiment besoin d'adapter à l'hote, sache que ta valeur dépendra:
    de ton algorithme
    de la vitesse et la latence du réseau
    de la surcharge du serveur distant visé
    de la mémoire disponible
    des process en cours d'exécution.
    de la jvm

    Soit t'as plein de machine dispo et tu cherche un optimum général
    Soit tu prend une valeur à pif qui donne des bon truc chez toi
    Soit tu fait de la mesure en temps réel. Genre démarrer 10 thread, et ajouter 2 par deux en mesurant en continu le temps moyen de traitement. Quand ca commence à décroitre, tu "suppose" avoir atteind l'optimal.
    En effet il y a plein de facteurs qui entrent en jeu, donc je pense que le meilleur moyen est la mesure en continu... suivant les performances sur d'autres machine j'essayerai cette solution.

    Thx

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/08/2014, 01h56
  2. Classification, nombre optimal de classes
    Par nonoprig dans le forum MATLAB
    Réponses: 1
    Dernier message: 05/02/2008, 21h35
  3. Nombre maximum de threads
    Par fantomasmusic dans le forum Général Java
    Réponses: 7
    Dernier message: 30/06/2007, 20h14
  4. OutOfMemoryExceptions : nombre max de thread
    Par Invité dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 06/04/2007, 11h34
  5. [net][Sockets] Quel est le nombre maximal de threads?
    Par itsmii dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 06/05/2004, 10h48

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