2011-11-07 13 views
5

Así que sé que puedo aumentar el número de subprocesos de un proceso en Linux usando setrlimit y amigos. De acuerdo con this, el límite teórico sobre el número de hilos está determinado por la memoria (alrededor de 100.000k). Para mi uso, estoy buscando usar el FIFO scheduler en un estilo cooperativo, por lo que los conmutadores de contexto espurios no son una preocupación. Sé que puedo limitar el número de hilos activos a la cantidad de núcleos. Mi pregunta es cuál es el límite práctico sobre el número de subprocesos, después de lo cual las suposiciones en el planificador comienzan a estar voladas. Si mantengo un verdadero estilo cooperativo ¿hay hilos adicionales "libres"? Cualquier caso estudiado o ejemplos reales sería especialmente interesante.Límite práctico sobre el número de subprocesos en Linux en un marco cooperativo

El servidor Apache parece ser el programa más análogo a esta situación. ¿Alguien tiene números relacionados con la cantidad de hilos que han visto aparecer a Apache antes de volverse inútiles?

Related, pero tiene que ver con Windows, código de preferencia.

+1

Puede encontrar el siguiente artículo interesante, http://drdobbs.com/open-source/184406204. En él, hay una afirmación vaga sobre 1M hilos concurrentes en una máquina de gama alta. – Kevin

+0

@Kevin Eso me da esperanza. Lo que es especialmente interesante es el hecho de que la prueba se realizó en apoyo del planificador O (1), que desde entonces se ha reemplazado. – tgoodhart

+0

@Kevin Papel en cuestión: http://www.redhat.com/whitepapers/.../POSIX_Linux_Threading.pdf – tgoodhart

Respuesta

2

creo que el número de hilos se limita

  1. por la memoria disponible (cada hilo necesita al menos varias páginas, ya menudo muchos de ellos, sobre todo por su pila y almacenamiento local de subprocesos). Vea la función pthread_attr_setstacksize para sintonizar eso. Los hilos acumulan espacio de un megabyte cada uno, no son infrecuentes.

  2. Al menos en Linux (NPTL, es decir, Glibc actual) y otros sistemas donde los hilos de los usuarios son los mismos que los hilos del kernel, pero el número de tareas que el kernel puede programar.

Supongo que en la mayoría de los sistemas Linux, la segunda limitación es más fuerte que la primera. Los hilos del kernel (en Linux) se crean a través del clone(2) Linux system call. En los kernels antiguos de Unix o Linux, el número de tareas estaba cableado. Es probablemente sintonizable hoy, pero creo que está en los miles, ¡no en los millones!

Y debe considerar la codificación en el Go language, es goroutines son los hilos ligeros de plumas que está soñando.

Si quiere muchos hilos cooperativos, puede consultar los trucos de implementación Chicken Scheme.

+0

Ah Go, ¿no sería lindo? Lua tiene corutinas de primera clase, lo que también lo haría más fácil. Lo que realmente quiero es un marco de pila limpio para la depuración. El paso de continuación o el envío de mensajes son geniales, pero tienden a borrar la secuencia de eventos o al menos a dificultar la depuración de esa secuencia. Si puedo usar muchos hilos que serán mucho más fáciles que usar getcontext/makecontext y escribir la biblioteca cooperativa de threading de un pobre. – tgoodhart

+0

No entiendo por qué quieres un marco de pila limpio (¿por qué ayuda a eliminar errores? ¿Limpiar cada local es suficiente? Y Java lo hace automáticamente). –

+0

Mala elección de palabras. Un marco de pila "limpio" en el sentido de que la pila me dirá con precisión cómo llegué a un punto determinado del código, en contraste con una cola de trabajos, que solo indicará cómo llegué a un código en particular dado que era Salió de la cola y no puede dar ninguna indicación de dónde fue empujado, especialmente si puede ser empujado desde múltiples sitios. – tgoodhart

Cuestiones relacionadas