Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
613 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Nombre limite de pthread sous Linux?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Nombre limite de pthread sous Linux?

n°1501407
XK
Posté le 10-01-2007 à 17:25:02  profilanswer
 

Bonjour
 
J'ai créé une application qui utilise les "pthread". J'aurais souhaité lancer beaucoup de threads mais il semble que sous Linux le nombre est limité (histoire de taille de "stack" ) alors qu'il m'en aurai fallu 1000 à 2000 maximum (ce qui ne pose pas de problèmes sous Windows).
 
Comme je n'ai pas trouvé de moyen pour passer outre cette limitation, j'ai essayé de coder différement mon programme pour que les process soient exécutés par paquets et non tout d'un coup, je pensais de cette façon passer outre le problème.
 
Et bien il semble que le problème est ailleurs car, même en exécutant les thread 1 par 1 (a chaque fois le thread se termine correctement avec pthread_exit()), au bout de 303 ~ 305 pthreads exécutés, j'ai toujours thread_create() qui me renvoi l'erreur 12.
 
En regardant avec "top -H -p PID" je n'ai d'ailleurs qu'un seul thread simultanné ce qui montre que ce n'est pas le problème, mon programme est tout simplement limité au nombre de création de threads :heink:
 
Si vous avez une idée pour m'aider pour résoudre ce problème ce n'est pas de refus :hello:

mood
Publicité
Posté le 10-01-2007 à 17:25:02  profilanswer
 

n°1501477
XK
Posté le 10-01-2007 à 19:26:13  profilanswer
 

d'après vous c'est plutôt un problème de mon programme ou une limitation des pthread?

n°1501612
XK
Posté le 11-01-2007 à 10:03:12  profilanswer
 

Je viens de compiller un programme simple pour créer des pthread en boucle jusqu'à ce que pthread_create() renvoi une erreur.
A chaque fois au 303ème thread il est impossible d'en créer de nouveaux.
Ce nombre est fixe que les threads restent actifs ou se terminent directement.
Que faire?? :??:

n°1501660
Taz
bisounours-codeur
Posté le 11-01-2007 à 12:05:15  profilanswer
 

si tu sais ce que tu fais tu peux diminuer la taille des piles des threads. c'est une limitation 32bits.
 
Mais ça à l'air un peu bourrin ton truc. Tu ferais certainement mieux de travailler avec un pool de threads.
 
 
Q(uant à ta remarque sur windows, on y croit très fort, sans ordonnanceur O(1) ça doit pas consommer de ressources du tout)

n°1501661
Taz
bisounours-codeur
Posté le 11-01-2007 à 12:05:52  profilanswer
 

XK a écrit :

A chaque fois au 303ème thread il est impossible d'en créer de nouveaux.


303 * 8MB
 
CQFD

n°1501955
XK
Posté le 12-01-2007 à 09:19:06  profilanswer
 

Pour ne pas avoir à modifier la pile des threads j'ai changé le fonctionnement de mon programme : les threads se ferment après leur exécution, c'est le processus père qui les recréés pour recommencer leur tâche.
 
Après avoir créé chaque thread je le détache avec "pthread_detach(thread_id)" pour que celui-ci libère les ressources automatiquement une fois terminé. Comme les threads se terminent rapidement ça laisse de la place aux autres ce qui me permet de créer le nombre de threads voulu.
 
Par contre cette méthode consomme largement plus de ressources CPU et est plus lente que si les threads restent actifs et n'ont pas besoin d'êtres réexécutés à chaque fois... pas top pour du pseudo TR :(


Message édité par XK le 12-01-2007 à 09:21:35
n°1502005
Taz
bisounours-codeur
Posté le 12-01-2007 à 11:29:35  profilanswer
 

UN POOL DE THREADS :o
 
sinon ne detach pas, mais fasi préférentiellement des pthread_join

n°1502092
XK
Posté le 12-01-2007 à 14:08:40  profilanswer
 

Aurais tu des liens avec des exemples simples de création de pool avec les pthread?
 
Je cherche actuellement mais rien de bien sympatique pour l'instant...

n°1502096
Taz
bisounours-codeur
Posté le 12-01-2007 à 14:18:49  profilanswer
 

http://en.wikipedia.org/wiki/Thread_pool_pattern
 
la seule implémentation en C que je connaisse c'est dans la glib http://developer.gnome.org/doc/API [...] Pools.html

n°1502146
tbp
Posté le 12-01-2007 à 15:10:03  profilanswer
 

En dehors du fait que la creation de threads est affreusement lente sous win32, que le scheduler peine à la tache et que comme remarqué précedement il s'agit surtout d'une mauvaise approche, (je ne retrouve pas la discussion initiale) http://uwsg.iu.edu/hypermail/linux [...] /1581.html
 
 

mood
Publicité
Posté le 12-01-2007 à 15:10:03  profilanswer
 

n°1502189
Emmanuel D​elahaye
C is a sharp tool
Posté le 12-01-2007 à 16:21:15  profilanswer
 

tbp a écrit :

En dehors du fait que la creation de threads est affreusement lente sous win32,

C'est prouvé ou c'est encore une de ces légendes urbaines dont Internet se fait l'écho régulièrement ?
Windows XP Processeur Céléron M80 (un brouette,quoi...)

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include "ed/inc/chro.h"
  5. void *task (void *p)
  6. {
  7.    return NULL;
  8. }
  9. int test (unsigned long *nb)
  10. {
  11.    int err = 0;
  12.    unsigned long i;
  13.    pthread_t *pt = malloc (sizeof *pt * *nb);
  14.    if (pt != NULL)
  15.    {
  16.       for (i = 0; !err && i < *nb; i++)
  17.       {
  18.          err = pthread_create (pt + i, NULL, task, NULL) != 0;
  19.       }
  20.       *nb = i;
  21.       for (i = 0; i < *nb; i++)
  22.       {
  23.          pthread_join (pt[i], NULL);
  24.       }
  25.       free (pt), pt = NULL;
  26.    }
  27.    return err;
  28. }
  29. int main (void)
  30. {
  31.    chro_s *ch = chro_create ();
  32.    if (ch != NULL)
  33.    {
  34.       chro_start (ch);
  35.       {
  36.          unsigned long nb = 100000;
  37.          test (&nb);
  38.          chro_stop (ch);
  39.          {
  40.             unsigned long ms;
  41.             chro_elapsed (ch, &ms);
  42.             printf ("%lu pthread_create() in %lu ms hence %.2fus/thread", nb, ms,
  43.                     (1000.0 * ms) / nb);
  44.          }
  45.       }
  46.       chro_delete (ch), ch = NULL;
  47.    }
  48.    return 0;
  49. }


le code manquant est ici :  
 
http://mapage.noos.fr/emdel/clib.htm
Module CHRO
 
Ca donne :  


100000 pthread_create() in 11375 ms hence 113.75us/thread
Press ENTER to continue.


Ce qui ne me parait pas d'une lenteur extrême, création, et suppression synchrone incluse...

Message cité 1 fois
Message édité par Emmanuel Delahaye le 12-01-2007 à 18:34:43

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1502205
tbp
Posté le 12-01-2007 à 16:32:30  profilanswer
 

Emmanuel Delahaye a écrit :

C'est prouvé ou c'est encore une de ces légendes urbaines dont Internet se fait l'écho régulièrement ?


On peut bien prouver tout et son contraire avec un micro-benchmark idoine.
Mais justement sur lklm, dans la discussion initiale, il y avait des benchs comparatifs avec win32 sur les temps de creation. Le résultat étonnant étant que malgré le coté specifique des threads win32, c'était presque aussi couteux que de lancer un process plein et entier.
 
De toute façon cela reste très théorique puisqu'il est difficile de justifier la création dynamique de milliers de threads et que le scheduler de xp, par exemple, est particulierement attardé.

n°1502285
Emmanuel D​elahaye
C is a sharp tool
Posté le 12-01-2007 à 17:35:32  profilanswer
 

tbp a écrit :

et que le scheduler de xp, par exemple, est particulierement attardé.


Encore une affirmation gratuite ?

 

Je sais que c'est très branché d'affirmer "Microsoft çaÿ le Mal" tel un mantra moderne, mais je préfère les faits avérés.

 

Message cité 1 fois
Message édité par Emmanuel Delahaye le 12-01-2007 à 17:37:54

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1502389
tbp
Posté le 12-01-2007 à 20:44:14  profilanswer
 

Emmanuel Delahaye a écrit :

Encore une affirmation gratuite ?


Sauf que j'ai sous le coude, entre autre, un rtrt ou tout est distribué (avec une friction minimale et mesurable, dynamiquement) depuis la création du kD-tree jusqu'au rendu, sur linux & windows, 32 et 64 bit.  
Il se trouve aussi que je l'ai écrit.  
J'ai donc une assez bonne idée des acrobaties qu'il faut faire pour arriver à un résultat décent (mesurable) par exemple sur une machine NUMA (= k8) tournant sous xp (ou plus précisement xp32 qui n'est que partiellement NUMA aware).  
 
Comme je ne crois pas que discuter de l'importance de la localité des données ou des details d'implémentation de méchanismes wait-free soit particulierement pertinent pour l'initiateur, et que d'autre part tu me cours un peu j'en resterais la.

n°1502428
tbp
Posté le 12-01-2007 à 22:40:12  profilanswer
 

Je n'avais pas remarqué ton edit, avec ce fabuleux bout de code. Je veux dire donner des leçons et tester le temps de création de threads sous win32 en utilisant les pthreads, il faut l'oser. Mais tu l'as fait.
 
Linux: 32760 pthread_create() in 960.367203 ms hence 29.32us/thread
xp: 32760 pthread_create() in 69842.000008 ms hence 2131.93us/thread
 
Soyons charitable et limitons un peu plus, parce que visiblement ça s'écroule...
 
xp: 10000 pthread_create() in 2118.000031 ms hence 211.80us/thread
 
Serait-il possible que ce magnifique noyau xp s'emmele un peu les pinceaux sur un bi-processeur ou l'exercice a, contrairement à ta machine, enfin un peu de chance de chatouiller le scheduler? On le dirait.
 
Note:
a) je n'ai pas la patience d'attendre les 100000 sur xp
b) il aurait fallu ammender le source pour dépasser les 32760 sur linux, et c'étais hors de propos
c) avant que de tirer des conclusions il vaut mieux savoir ce que l'on teste vraiment
d) les pthreads sur windows, dans un bench, c'te blague.
 

n°1502621
XK
Posté le 13-01-2007 à 21:07:48  profilanswer
 

Pour ma part sous windows je n'avais pas utilisé les pthread, il y a peu être une différence de performances?
 
Il t'est possible de lancer 32760 pthread sous linux grace aux 64bits?

n°1502636
Taz
bisounours-codeur
Posté le 13-01-2007 à 22:12:59  profilanswer
 

et pas que de les lancer

n°1503489
tbp
Posté le 16-01-2007 à 10:15:40  profilanswer
 

XK a écrit :

Pour ma part sous windows je n'avais pas utilisé les pthread, il y a peu être une différence de performances?


L'API win32/64 n'a absolument rien à voir avec la sémantique POSIX, donc oui on s'attendrait à ce qu'un bench de création de thread utilise le mode natif.
Mais mon argument initial était que d'une part que le coût de création d'un process ou d'une thread sont du même ordre (malgré la distinction claire) et d'autre part que le scheduler ne tient pas le choc.
 

XK a écrit :

Il t'est possible de lancer 32760 pthread sous linux grace aux 64bits?


Nan.
De toute façon, je ne saurais trop insister sur le fait, comme d'autres l'ont déjà fait, que cette approche est inneficace et injustifiable; elle rend la tache extremement difficile pour le scheduler contrairement à un pool synchronisé sur un machin (ou le systeme a une chance de prédire la charge).

n°1505191
XK
Posté le 19-01-2007 à 16:59:32  profilanswer
 

Si mon approche est mauvaise, peu être pourrais-tu me dire comment tu aborderais le problème?
 
J'ai un réseau avec 1000 machines (ça va grandir). Je dois superviser en pseudo temps réel l'état réseau des machines, en leur envoyant un ping toutes les secondes depuis un seul poste sur lequel se trouve mon application.
 
Mon application est en Java, mais l'interface sous-traite la fonction ping à un programme en C pour un souci d'efficacité (le ping sous Java j'ai essayé mais je ne suis pas du tout convaincu). L'avantage d'avoir Java n'est pas la portabilité sur n'importe quelle machine car dans mon cas celle-ci sera soit sous Windows, soit sous Linux. Donc il me faut juste un programme en C pour les 2 plateformes.
 
Sous Windows j'y suis allé franco : je passe en paramètre au programme C les centaines d'adresses IP, le programme créé un thread (natif) pour chaque adresse, chaque thread effectue un Ping par l'intermédiaire de la bibliothèque M$ et écrit le résultat du ping, lu par l'interface Java qui l'affiche dans la GUI. Les threads restent vivants entre chaque ping, ils s'endorment seulement une seconde après chaque résultat.
Le programme C utilise même pas 1% de l'UC et les résultats sont pratiquement instantanés toutes les secondes comme prévu. :love:  
 
Sous Linux j'ai essayé de procéder de la même manière. J'ai utilisé des pthread et, quand il n'arrive plus a en créer, il fait une petite pause avant de recommencer. Chaque thread forge son paquet à partir de l'adresse IP qui lui a été attribué. Une fois le résultat affiché, le thread meurt. Quand tous les thread "fils" sont morts, le thread pricipal les relance, ils vont donc recréer leur paquets pour faire un ping puis afficher leur résultat et de nouveau mourir...
En dehors d'utiliser plus d'UC, cette technique est bien plus lente et ne permet pas de réactualiser l'état de chaque machine toutes les secondes. C'est pourquoi il me faudrait procéder différemment, peu être avec un pool de thread comme énoncé précédemment?
 
J'espère avoir été clair et précis, merci de me donner votre opinion :jap:

n°1505200
Taz
bisounours-codeur
Posté le 19-01-2007 à 17:20:12  profilanswer
 

fping
snmp
cacti
smokeping
NIH


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Nombre limite de pthread sous Linux?

 

Sujets relatifs
[Java] Problème TableModel sous Linux uniquement[UNIX/LINUX] test d'existence de fichiers d'apres l'extension
Libérer la mémoire et fonction recvfrom[C] Des accolades "just pour le fun" ?
[SQL/Oracle] Transformer nombre jour en dateProbleme de compilation librairie pthread
[PHP] nombre d'octets de fichier ouvert avec file_get_contents[C] Générer un nombre aléatoire
compter le nombre de cliclimite d'une table ?
Plus de sujets relatifs à : [C] Nombre limite de pthread sous Linux?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR