2011-05-14 12 views
24

Tengo algunos problemas con .NET's ThreadPool (.NET 4).ThreadPool max threads

He leído que, por defecto, .NET tiene un límite de 25 hilos por procesador, pero según las publicaciones del foro en SO y en otros lugares, puedo aumentar el límite con el siguiente código.

void SetThreads(int threads) 
{ 
    ThreadPool.SetMaxThreads(threads, threads); 
    ThreadPool.SetMinThreads(threads, threads); 
} 

Sin embargo, cuando me puse lo anterior a un número arbitrariamente alto, por ejemplo, 2000, y la cola de ~ 1000 elementos, todavía sólo tengo ~ 33 hilos de ejecución (.NET CLR toma ~ 5 hilos), y ThreadPool.GetAvailableThreads() devuelve 1971 hilos restantes.

¿Por qué no funciona el código anterior?

+0

¿Cómo está haciendo cola de tareas en el grupo de subprocesos? Mostrar tu código de prueba podría ser de gran ayuda. –

+0

Su problema es que debería ejecutar _less_ de 33 hilos, no más. –

+0

@Henk Holterman, no es una aplicación grande; es un generador de carga HTTP de wack-job rápido que hice para intentar cargar un servidor web local con un montón de solicitudes. Desafortunadamente no resultó tan bien. – foxy

Respuesta

8

From the MSDN:

Cuando la demanda es baja, el número real de hilos de grupo de subprocesos puede caer debajo de los valores mínimos.

Lea esto también: Patterns for Parallel Programming: Understanding and Applying Parallel Patterns with the .NET Framework 4

+0

Puse en cola ~ 50k tareas y establecí los hilos min + max de ThreadPool en 20k, pero solo se usaron ~ 25 hilos. Es esto esperado? – foxy

+0

¿Alguna de las tareas se completó o se puso en estado de espera? Depende del administrador crear hilos. En algunas máquinas, es mejor no tener muchos subprocesos porque los subprocesos sufrirán falta de hilo. –

1

En primer lugar comprobar this link, especialmente esta observación:

Si el tiempo de ejecución de lenguaje común está alojado, por ejemplo a través de Internet Information Services (IIS) o SQL Server , el host puede limitar o para evitar cambios en el tamaño del grupo de subprocesos.

Luego debe verificar el valor de retorno del método ThreadPool.SetMaxThreads(threads, threads). Tal vez devuelve false?

+0

Gracias, estoy usando .NET 4 en Windows 7. – foxy

65

En primer lugar, su "conocimiento" de los valores predeterminados es incorrecto. El límite de 25 hilos por procesador volvió de .NET 1.1. Se aumentó en .NET 2, and now:

A partir de la versión de .NET Framework 4, el tamaño predeterminado de la agrupación de hebras de un proceso depende de varios factores, tales como el tamaño del espacio de dirección virtual. Un proceso puede llamar al método GetMaxThreads para determinar el número de subprocesos.

Sin embargo, hay algo más en juego: el grupo de subprocesos no se inmediatamente crear nuevos temas en todas las situaciones. Para hacer frente a las ráfagas de pequeñas tareas, limita la rapidez con la que crea nuevos hilos. IIRC, creará un hilo cada 0.5 segundos si hay tareas pendientes, hasta el número máximo de hilos. Sin embargo, no puedo ver inmediatamente esa figura documentada, por lo que puede cambiar. Sospecho fuertemente que eso es lo que estás viendo. Intente poner en cola una gran cantidad de elementos y luego monitoree la cantidad de hilos a lo largo del tiempo.

+1

Esta debería ser la respuesta aceptada, explica claramente lo que freedompeace está experimentando – Fayilt

+1

¡Esa fue la respuesta! Noté ese extraño medio segundo, a veces un segundo en el que no hacía nada. Tengo tareas pendientes y otras tareas que esperan ser iniciadas en consecuencia, y todo es lento. Necesito alrededor de 10 hilos para mi trabajo. Al configurar ThreadPool.SetMinThreads como 20 (el valor predeterminado era 8) ¡los hilos de trabajo corrigieron mi problema de inmediato! Como también necesito esos hilos más adelante, no reduciré el mínimo nuevamente. – ygoe