¿Número máximo de hilos por proceso en Linux?

245

¿Cuál es el número máximo de hilos que puede crear un proceso en Linux?

¿Cómo (si es posible) se puede modificar este valor?


fuente

Respuestas:

247

Linux no tiene un subproceso separado por límite de proceso, solo un límite en el número total de procesos en el sistema (los subprocesos son esencialmente solo 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. Puede aumentar esto como:

echo 100000 > /proc/sys/kernel/threads-max

También hay un límite en el número de procesos (y, por lo tanto, subprocesos) que puede crear un solo usuario; consulte los ulimit/getrlimitdetalles sobre estos límites.

Robert Gamble
fuente
3
El límite en / proc / sys / vm / max_map_count también puede limitar el número de hilos. Debería ser seguro aumentar mucho ese límite si lo golpeas.
Mikko Rantalainen
1
Robert: Linux implementa por límite de proceso indirectamente. Verifique mi respuesta para más detalles;)
codersofthedark
Estoy tratando de cambiar esto en mi ubuntu 12.04 y no cambia con su comando. También intenté vi para cambiarlo, pero aparece E667: Fsync failedcuando intento guardar en vi.
Siddharth
44
@dragosrsupercool los hilos máximos se calculan utilizando la memoria RAM total, no la memoria virtual
c4f4t0r
1
La cantidad de tamaño de pila por subproceso (el valor predeterminado en su sistema) es más probable que sea el límite que cualquier otra cosa. Reducir el tamaño de la pila por subproceso es una forma de aumentar el número total de subprocesos (aunque rara vez es una buena idea).
Randy Howard el
67

Esto es INCREÍBLE al decir que LINUX no tiene hilos separados por límite de proceso.

¡Linux implementa un número máximo de hilos por proceso indirectamente!

number of threads = total virtual memory / (stack size*1024*1024)

Por lo tanto, el número de subprocesos por proceso puede aumentarse aumentando la memoria virtual total o disminuyendo el tamaño de la pila. Pero, disminuir demasiado el tamaño de la pila puede conducir a la falla del código debido al desbordamiento de la pila, mientras que la memoria virtual máxima es igual a la memoria de intercambio.

Comprueba tu máquina:

Memoria virtual total: ulimit -v(el valor predeterminado es ilimitado, por lo tanto, debe aumentar la memoria de intercambio para aumentar esto)

Tamaño total de la pila: ulimit -s(el valor predeterminado es 8Mb)

Comando para aumentar estos valores:

ulimit -s newvalue

ulimit -v newvalue

* Reemplace el nuevo valor con el valor que desea poner como límite.

Referencias

http://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per-process/

codificadores del oscuro
fuente
11
Excepto 3 pequeños detalles: 1. Linux no hace esto, la presencia de pilas y el hecho de que la memoria y el espacio de direcciones son de tamaño finito no tiene nada que ver con eso. 2. Debe crear la pila de un hilo al crearlo, independientemente de esto ulimit -s. Es muy posible (no sensible, pero posible) crear tantos subprocesos como posibles ID de subproceso. Bajo Linux de 64 bits, es incluso "posible" crear fácilmente más hilos que ID de hilos (por supuesto, no es posible, pero en lo que respecta a la pila, sí lo es). 3. Stack reserve, commit y VM son cosas diferentes, especialmente con OC.
Damon
Sí, para aumentar el número de subprocesos necesita aumentar la memoria virtual o disminuir el tamaño de la pila. En Raspberry Pi no encontré una manera de aumentar la memoria virtual, si disminuye el tamaño de la pila de 8MB a 1MB por defecto Es posible obtener más de 1000 hilos por proceso, pero disminuya el tamaño de la pila con el comando "ulimit -s" hacer esto para todos los hilos. Entonces, mi solución fue usar la instancia "pthread_t" instancia "clase de hilo" porque pthread_t me permitió establecer el tamaño de la pila por cada hilo. Finalmente, estoy disponible para archivar más de 1000 subprocesos por proceso en Raspberry Pi, cada uno con 1 MB de pila
Deulis
43

En términos prácticos, el límite generalmente está determinado por el espacio de 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 núcleo) .

Sin embargo, lo más probable es que experimente un rendimiento terrible si usa más de unas pocas docenas de hilos. Tarde o temprano, obtienes demasiada sobrecarga de cambio de contexto, demasiada sobrecarga en el planificador, etc. (Crear una gran cantidad de subprocesos hace poco más que consumir mucha memoria. Pero muchos subprocesos con un trabajo real que hacer va a ralentizarlo mientras luchan por el tiempo de CPU disponible)

¿Qué haces donde este límite es relevante?

jalf
fuente
3
1 MB por subproceso para la pila es bastante alto, muchos programas no necesitan nada cerca de este espacio de pila. El rendimiento se basará en la cantidad de procesos ejecutables , no en la cantidad de subprocesos que existen. Tengo una máquina funcionando en este momento con más de 1200 hilos con una carga de 0.40.
Robert Gamble
13
el rendimiento depende de lo que estén haciendo los hilos. puede ir mucho más allá de unas pocas docenas si no hacen mucho y, por lo tanto, menos cambio de contexto.
Corey Goldberg
stack está creciendo dinámicamente, solo la página inicial se asigna de manera
Michael Pankov
28

hilos 100k 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 2018 de @Thomas, en sistemas systemd:

/etc/systemd/logind.conf: UserTasksMax=100000
Vladimir Kunschikov
fuente
44
Gracias, finalmente me permitió romper el recuento de hilos Java de 32k.
berezovskyi
1
No funciona para mí: $ ulimit -s 100000 $ ulimit -i 63645 $ cat / proc / sys / kernel / threads-max 127626 $ cat / proc / sys / vm / max_map_count 600000 $ cat / proc / sys / kernel / pid_max 200000 $ java -Xmx4G -Xss256k -cp. ThreadCreation ... 11542 11543 java.lang.OutOfMemoryError: no se puede crear un nuevo hilo nativo en java.lang.Thread.start0 (Método nativo) en java.lang.Thread.start (Thread.java:717) en ThreadCreation.main ( ThreadCreation.java:15)
Martin Vysny
@MartinVysny ulimit -s = tamaño del hilo en kb. entonces está intentando crear hilos con un tamaño de pila de hilos de 100 MB
Vladimir Kunschikov
agregó su sugerencia sin verificar, @Thomas, gracias por los comentarios de todos modos.
Vladimir Kunschikov
2
@VladimirKunschikov Gracias amigo, su solución realmente funcionó, y gracias Thomas por agregar esa línea adicional, puedo confirmar que no funcionará sin esa línea.
BillHoo
14

@dragosrsupercool

Linux no usa 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, thread Max es diferente entre cada sistema, porque la memoria RAM instalada puede ser de diferentes tamaños, sé que Linux no necesita aumentar la memoria virtual, porque en 32 bits obtuvimos 3 GB de espacio de usuario y 1 GB para el núcleo, en 64 bits tenemos 128 TB de memoria virtual, eso sucede en Solaris, si desea aumentar la memoria virtual necesita agregar espacio de intercambio.

c4f4t0r
fuente
11

Para recuperarlo:

cat /proc/sys/kernel/threads-max

Para configurarlo:

echo 123456789 > /proc/sys/kernel/threads-max

123456789 = # de hilos

Vincent Van Den Berghe
fuente
Recibo un permiso denegado cuando intento escribir, incluso con root.
Kim
Bueno, ha pasado casi una década desde que esto fue publicado. No estoy actualizado sobre el estado actual de las cosas, pero muchas cosas podrían haber cambiado (y probablemente lo hayan hecho) ...
Vincent Van Den Berghe
problema con perm-deny puede ser append ( >) parte pierde el sudo: tryecho 12345678 | sudo tee -a /proc/sys/kernel/threads-max
dwanderson
10

Límite de conteo de hilos:

$ cat /proc/sys/kernel/threads-max 

Cómo se calcula:

max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

y: el tamaño de página x86_64 (PAGE_SIZE) es 4K; Como todas las demás arquitecturas, x86_64 tiene una pila de kernel para cada hilo activo. Estas pilas de hilos son THREAD_SIZE (2 * PAGE_SIZE) grandes;

para mempages:

cat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+$2} END {print totalpages}';

así que en realidad el número no está relacionado con la limitación del tamaño de la pila de memoria de hilo ( ulimit -s).

PD: la limitación de la pila de memoria de subprocesos es de 10 M en mi máquina virtual rhel, y para la memoria de 1.5G, ¿esta VM solo puede permitirse 150 subprocesos?

Albert Kong
fuente
5

Para cualquiera que esté viendo esto ahora, en los sistemas systemd (en mi caso, específicamente Ubuntu 16.04) hay otro límite impuesto por el parámetro cgroup pids.max.

Esto se establece en 12,288 por defecto, y se puede anular en /etc/systemd/logind.conf

Todavía se aplican otros consejos, incluidos pids_max, threads-max, max_maps_count, ulimits, etc.

Trent Lloyd
fuente
5

compruebe el tamaño de la pila por hilo con ulimit, en mi caso Redhat Linux 2.6:

    ulimit -a
...
    stack size              (kbytes, -s) 10240

Cada uno de sus hilos obtendrá esta cantidad de memoria (10 MB) asignada para su pila. Con un programa de 32 bits y un espacio de direcciones máximo de 4 GB, ¡eso es un máximo de solo 4096 MB / 10 MB = 409 hilos! Código de programa menos, menos espacio de montón probablemente conducirá a un máximo observado. de 300 hilos.

Debería poder plantear esto compilando y ejecutando en 64 bits o configurando ulimit -s 8192 o incluso ulimit -s 4096. Pero si esto es aconsejable es otra discusión ...

Axel Podehl
fuente
4

Probablemente no debería importar. Obtendrá un rendimiento mucho mejor al diseñar su algoritmo para usar un número fijo de subprocesos (por ejemplo, 4 u 8 si tiene 4 u 8 procesadores). Puede hacer esto con colas de trabajo, E / S asíncronas o algo así como liberador.

twk
fuente
3
El propósito del subprocesamiento múltiple no es solo el rendimiento. Por ejemplo, está escuchando 10 puertos con un sistema de bloqueo en un procesador de 4 núcleos. En este ejemplo no hay significado de 4.
obayhan
3

Utilice la nbio biblioteca de E / S sin bloqueo o lo que sea, si necesita más subprocesos para hacer llamadas de E / S que bloquean

wefeqfw
fuente
2

Depende de su sistema, simplemente escriba un programa de muestra [creando procesos en un ciclo] y verifique usando ps axo pid, ppid, rss, vsz, nlwp, cmd. Cuando ya no pueda crear hilos, verifique nlwp count [nlwp es el número de hilos] voila, obtuvo su respuesta a prueba de tontos en lugar de pasar por libros

resultados
fuente
1

Para establecer permanentemente,

vim /etc/sysctl.conf

y añadir

kernel.threads-max = "value"
Matteo Zocca
fuente
0

Podemos ver el número máximo de hilos definidos en el siguiente archivo en Linux

cat / proc / sys / kernel / threads-max

(O)

sysctl -a | grep threads-max

KrishnaKumar Madagani
fuente
0

Puede ver el valor actual con el siguiente comando: cat / proc / sys / kernel / threads-max

También puede establecer el valor como

echo 100500> / proc / sys / kernel / threads-max

El valor que establezca se verificará con las páginas RAM disponibles. Si las estructuras de hilos ocupan más de 1/8) de las páginas RAM disponibles, thread-max se reduciría en consecuencia.

Arif
fuente
0

Sí, para aumentar el número de subprocesos necesita aumentar la memoria virtual o disminuir el tamaño de la pila. En Raspberry Pi no encontré una manera de aumentar la memoria virtual, si disminuye el tamaño de la pila de 8MB a 1MB por defecto Es posible obtener más de 1000 hilos por proceso, pero disminuya el tamaño de la pila con el comando "ulimit -s" hacer esto para todos los hilos. Entonces, mi solución fue usar la instancia "pthread_t" instancia "clase de hilo" porque pthread_t me permitió establecer el tamaño de la pila por cada hilo. Finalmente, estoy disponible para archivar más de 1000 hilos por proceso en Raspberry Pi, cada uno con 1 MB de pila.

Deulis
fuente