¿Número máximo de subprocesos por proceso en Linux?
¿Cuál es la cantidad máxima de subprocesos que puede crear un proceso en Linux?
¿Cómo (si es posible) se puede modificar este valor?
Linux no tiene un límite de subprocesos separados por proceso, solo un límite en la cantidad total de procesos en el sistema (los subprocesos son esencialmente procesos con un espacio de direcciones compartido en Linux) que puede ver así:
cat /proc/sys/kernel/threads-max
El valor predeterminado es el número de páginas de memoria/4. Puedes aumentar esto como:
echo 100000 > /proc/sys/kernel/threads-max
También hay un límite en la cantidad de procesos (y, por lo tanto, subprocesos) que un solo usuario puede crear; consulte ulimit/getrlimit
para obtener detalles sobre estos límites.
Es INCORRECTO decir que LINUX no tiene un límite de subprocesos separados por proceso.
¡Linux implementa la cantidad máxima de subprocesos por proceso indirectamente!
number of threads = total virtual memory / (stack size*1024*1024)
Por lo tanto, la cantidad de subprocesos por proceso se puede aumentar aumentando la memoria virtual total o disminuyendo el tamaño de la pila. Sin embargo, disminuir demasiado el tamaño de la pila puede provocar una falla del código debido al desbordamiento de la pila, mientras que la memoria virtual máxima es igual a la memoria de intercambio.
Revisa tu máquina:
Memoria virtual total: ulimit -v
(el valor predeterminado es ilimitado, por lo que es necesario aumentar la memoria de intercambio para aumentarla)
Tamaño total de la pila: ulimit -s
(el valor predeterminado es 8 Mb)
Comando para aumentar estos valores:
ulimit -s newvalue
ulimit -v newvalue
*Reemplaza el nuevo valor con el valor que deseas poner como límite.
Referencias:
http://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per-process/
En términos prácticos, el límite suele estar determinado por el espacio de la pila. Si cada subproceso obtiene una pila de 1 MB (no recuerdo si ese es el valor predeterminado en Linux), entonces un sistema de 32 bits se quedará sin espacio de direcciones después de 3000 subprocesos (suponiendo que el último GB esté reservado para el kernel). .
Sin embargo, lo más probable es que experimentes un rendimiento terrible si utilizas más de unas pocas docenas de subprocesos. Tarde o temprano, tendrás demasiada sobrecarga de cambio de contexto, demasiada sobrecarga en el programador, etc. (La creación de una gran cantidad de subprocesos hace poco más que consumir mucha memoria. Pero muchos subprocesos con trabajo real por hacer lo ralentizarán mientras luchan por el tiempo de CPU disponible)
¿Qué estás haciendo cuando este límite es incluso relevante?
100k hilos adecuados en Linux:
ulimit -s 256
ulimit -i 120000
echo 120000 > /proc/sys/kernel/threads-max
echo 600000 > /proc/sys/vm/max_map_count
echo 200000 > /proc/sys/kernel/pid_max
./100k-pthread-create-app
Actualización de 2018 de @Thomas, en sistemas systemd:
/etc/systemd/logind.conf: UserTasksMax=100000
@dragosrsupercool
Linux no utiliza la memoria virtual para calcular el máximo de subprocesos, sino la memoria RAM física instalada en el sistema.
max_threads = totalram_pages / (8 * 8192 / 4096);
http://kavassalis.com/2011/03/linux-and-the-maximum-number-of-processes-threads/
kernel/fork.c
/* The default maximum number of threads is set to a safe
* value: the thread structures can take up at most half
* of memory.
*/
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
Entonces, el máximo de subprocesos es diferente entre cada sistema, porque la RAM instalada puede ser de diferentes tamaños, sé que Linux no necesita aumentar la memoria virtual, porque en 32 bits tenemos 3 GB para el espacio de usuario y 1 GB para el kernel. en 64 bits tenemos 128 TB de memoria virtual, eso sucede en Solaris, si desea aumentar la memoria virtual necesita agregar espacio de intercambio.