si suppone Il seguente codice per fare 100.000 discussioni:NPTL limita le filettature massime a 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);
}
Questo è in esecuzione su un computer a 64 bit con 32 GB di RAM; Debian 5.0 installato, tutto disponibile.
- ulimit -s 512 per mantenere la dimensione dello stack giù
- /proc/sys/kernel/pid_max impostato su 1.000.000 (per impostazione predefinita, tappi fuori a 32K PID).
- ulimit -u 1000000 per aumentare processi massimi (non credo che questo importa affatto)
- /proc/sys/kernel/threads-max set a 1.000.000 (per impostazione predefinita, non è stato fissato a tutti)
l'esecuzione di questo sputa fuori il seguente:
65500 threads so far ...
Failed with return code 12 creating thread 65529 (Cannot allocate memory).
Malloc worked, hmmm
non sto di certo a corto di RAM; Posso persino lanciare molti altri di questi programmi tutti in esecuzione contemporaneamente e tutti iniziano i loro thread da 65k.
(Si prega di astenersi dal suggerire, non provo a lanciare 100.000 discussioni. Questo è semplice test di qualcosa che dovrebbe. Il mio attuale server di epoll basata lavoro ha circa 200k + connessioni in ogni momento e various papers suggerirebbe che le discussioni solo potrebbe essere un'opzione migliore. - Grazie :))
'ulimit -s 512' sets effettivamente la dimensione minima stack 512 kilobyte, non 512 byte. Quindi con 100.000 thread che sarebbero quasi 50 GB (tuttavia, questo probabilmente non è il problema, poiché gli stack sono allocati alla domanda). – caf
Sì, ho provato a impostarlo su ulimit -s 1 e il risultato di 65528 thread è lo stesso. Lo stesso se uso ulimit -s 1024 per quella materia. – rekamso
Puoi confermare con strazi (e pazienza) che la chiamata finale pthread_create (clone (2)?) Fallisce effettivamente con ENOMEM? Quali sono i valori di, e cosa succede se aumenti i file '/ proc/sys /': 'vm/max_map_count',' kernel/pid_max' e 'kernel/threads-max'? – pilcrow