Le code suivant est censé faire: 100.000 filsNPTL limite le nombre maximum de threads à 65528?
/* compile with: gcc -lpthread -o thread-limit thread-limit.c */
/* originally from: http://www.volano.com/linuxnotes.html */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#define MAX_THREADS 100000
int i;
void run(void) {
sleep(60 * 60);
}
int main(int argc, char *argv[]) {
int rc = 0;
pthread_t thread[MAX_THREADS];
printf("Creating threads ...\n");
for (i = 0; i < MAX_THREADS && rc == 0; i++) {
rc = pthread_create(&(thread[i]), NULL, (void *) &run, NULL);
if (rc == 0) {
pthread_detach(thread[i]);
if ((i + 1) % 100 == 0)
printf("%i threads so far ...\n", i + 1);
}
else
{
printf("Failed with return code %i creating thread %i (%s).\n",
rc, i + 1, strerror(rc));
// can we allocate memory?
char *block = NULL;
block = malloc(65545);
if(block == NULL)
printf("Malloc failed too :(\n");
else
printf("Malloc worked, hmmm\n");
}
}
sleep(60*60); // ctrl+c to exit; makes it easier to see mem use
exit(0);
}
Ceci est en cours d'exécution sur une machine 64 bits avec 32 Go de RAM; Debian 5.0 installé, tous les stocks.
- ulimit -s 512 pour maintenir la taille de la pile vers le bas
- /proc/sys/kernel/pid_max mis à 1000000 (par défaut, il plafonne à 32k sur PIDS).
- ulimit -u 1000000 pour augmenter les processus max (ne pense pas que cela importe du tout)
- /proc/sys/kernel/set threads-max à 1.000.000 (par défaut, il n'a pas été fixé à tous)
l'exécution de cette recrache les éléments suivants:
65500 threads so far ...
Failed with return code 12 creating thread 65529 (Cannot allocate memory).
Malloc worked, hmmm
Je ne suis certainement pas manquer de RAM; Je peux même lancer plusieurs de ces programmes tous en même temps et ils commencent tous leurs threads 65k.
(S'il vous plaît ne pas suggérer que j'essaie de ne pas lancer 100.000+ threads. Ceci est un simple essai de quelque chose qui devrait travail. Mon serveur basé epoll courant a environ 200k + connexions à tout moment et various papers suggère que les discussions juste peut être une meilleure option - Merci :))
'ulimit -s 512' définit en fait la taille minimale de la pile à 512 kilo-octets, et non pas 512 octets. Donc, avec 100 000 threads qui seraient presque 50 Go (cependant, ce n'est probablement pas le problème, car les piles sont allouées à la demande). – caf
Oui, j'ai essayé de le définir simplement à ulimit -s 1 et le résultat de 65528 threads est le même. Pareil si j'utilise ulimit -s 1024 d'ailleurs. – rekamso
Pouvez-vous confirmer avec strace (et patience) que l'appel final pthread_create (clone (2)?) Échoue réellement avec ENOMEM? Quelles sont les valeurs de, et que se passe-t-il si vous augmentez les fichiers '/ proc/sys /': 'vm/max_map_count',' kernel/pid_max' et 'kernel/threads-max'? – pilcrow