El siguiente código se supone que hace 100.000 hilos:NPTL tapa los hilos máximos en 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);
}
Esto se ejecuta en una máquina de 64 bits con 32 GB de RAM; Debian 5.0 instalado, todo el stock.
- ulimit -s 512 para mantener el tamaño de la pila hacia abajo
- /proc/sys/kernel/pid_max ajustado a 1.000.000 (de forma predeterminada, los casquillos a cabo a 32k PIDS).
- ulimit -u 1000000 para aumentar los procesos de Max (no creo que esto es importante en todos)
- /proc/sys/kernel/conjunto de hilos-max y 1.000.000 (de manera predeterminada, no ha sido configurada en absoluto)
la ejecución de este escupe lo siguiente:
65500 threads so far ...
Failed with return code 12 creating thread 65529 (Cannot allocate memory).
Malloc worked, hmmm
Desde luego, no estoy quedando sin memoria rAM; Incluso puedo lanzar varios más de estos programas que se ejecutan todos al mismo tiempo y todos comienzan sus hilos de 65k.
(Por favor, abstenerse de sugerir que no trato de lanzar 100.000 hilos. Esto es simple prueba de algo que debe trabajo. Mi servidor actual basado en epoll tiene aproximadamente 200 k + conexiones en todo momento y various papers sugeriría que las discusiones solo podría ser una mejor opción. - Gracias :))
'ulimit -s 512' realmente establece el tamaño mínimo de pila a 512 kilobytes, no 512 bytes. Entonces, con 100,000 hilos sería casi 50GB (sin embargo, este no es el problema, ya que los stacks están asignados por demanda). – caf
Sí, he intentado configurarlo simplemente como ulimit -s 1 y el resultado de 65528 hilos es el mismo. Lo mismo si uso ulimit -s 1024 para ese asunto. – rekamso
¿Puede confirmar con strace (y paciencia) que la llamada final pthread_create (clone (2)?) En realidad falla con ENOMEM? ¿Cuáles son los valores de y qué ocurre si aumenta los archivos '/ proc/sys /': 'vm/max_map_count',' kernel/pid_max' y 'kernel/threads-max'? – pilcrow