2010-11-03 8 views
7

Estoy considerando el uso de potencialmente cientos de subprocesos para implementar tareas que administren dispositivos a través de una red.Impacto de cientos de subprocesos inactivos

Esta es una aplicación C++ que se ejecuta en un procesador powerpc con un kernel de Linux.

Después de una fase inicial cuando cada tarea realiza la sincronización para copiar datos del dispositivo en la tarea, la tarea queda inactiva, y solo se activa cuando recibe una alarma o necesita cambiar algunos datos (configuración), que es raro después de la fase de inicio. Una vez que todas las tareas lleguen a la fase "inactiva", espero que solo unas pocas por segundo deberán activarse.

Entonces, mi principal preocupación es que si tengo cientos de hilos, ¿tendrán un impacto negativo en el sistema una vez que estén inactivos?

Gracias. Amso

edición:
estoy actualizando la cuestión sobre la base de las respuestas que me dieron. Gracias chicos. Parece que tener una tonelada de hilos en ralentí (IO bloqueado, esperando, durmiendo, etc.), per se, no tendrá un impacto en el sistema en términos de capacidad de respuesta. Por supuesto, gastarán dinero extra para la pila de cada hilo y los datos de TLS, pero eso está bien siempre que arrojemos más memoria a la cosa (haciéndolo más €€€)

Pero entonces, otros problemas deben ser contabilizados para. Tener cientos de subprocesos esperando probablemente aumente el uso de memoria en el núcleo, debido a la necesidad de colas de espera u otros recursos similares. También hay un problema de latencia, que parece no determinista. Para verificar la capacidad de respuesta y el uso de memoria de cada solución, se debe medir y comparar.

Finalmente, la idea de cientos de subprocesos que estarán mayormente inactivos se puede modelar como un grupo de subprocesos. Esto reduce un poco la linealidad del código, pero aumenta drásticamente la escalabilidad de la solución y, con un cuidado apropiado, se puede ajustar fácilmente para ajustar el compromiso entre el rendimiento y el uso de los recursos.

Creo que eso es todo. Gracias a todos por su entrada.

-
Amso

+3

Si necesita cientos de subprocesos, está viendo el problema de la manera incorrecta. –

+4

Roger: Estoy en desacuerdo, cientos de hilos pueden estar bien, dependiendo del problema. Usar hilos significa que el código puede ser agradable y lineal, lo que hace que algunas tareas sean mucho más fáciles. – MarkR

+0

No estoy de acuerdo con el desacuerdo. Si alguna vez miró la salida 'ps amx' en Linux, notará algunos programas (como ...' console-kit-daemon') que mantienen alrededor de 63 hilos daemon (de los cuales 57 son generalmente inútiles y no hacen nada). – user562374

Respuesta

8

Cada hilo tiene cabeza - lo más importante cada uno tiene su propia pila y TLS. El rendimiento no es un gran problema ya que no obtendrán ningún corte de tiempo a menos que realmente hagan algo. Es posible que aún desee considerar el uso de grupos de hilos.

+0

Si los subprocesos "inactivos" usarán divisiones de tiempo depende de cómo se escribe su código. Por ejemplo, vi un montón de código "inactivo" que cada varios ms verifica si tiene que hacer algo. – valdo

+3

Ouch :) Sí, por "inactivo", quise decir un hilo en un estado de espera, no "lo que el programador piensa que significa inactivo". – EboMike

+1

Con "Idle" me refiero a que el hilo se bloqueará en un semáforo o condición de espera hasta que exista alguna actividad externa que necesite su intervención.Por ejemplo: un paquete agotó el tiempo de espera, recibió un paquete, cambió algunos datos y necesita sincronizar ... – amso

1

No soy un hacker de Linux, pero suponiendo que la programación de subprocesos de Linux es similar a la de Windows' ...

Sí, por supuesto, el habrá alguna impacto. Cada bit de memoria que consuma potencialmente tendrá algún impacto en.

Sin embargo, en un entorno de división de tiempo, los subprocesos que se encuentran en un estado Esperar/Suspender/Suscribir no consumirán ciclos de CPU hasta que se despierten.

+1

Creo que en versiones recientes, los hilos de Linux son MUY livianos. Ver http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library, y esp. el documento de diseño que se hace referencia allí. –

+0

@Steve He leído en numerosos sitios web (y también creo en Understanding the Linux Kernel, aunque me puedo confundir con eso) que los pthreads se implementan como procesos en Unix, por lo que en realidad es bastante pesado. En realidad, tu enlace dice eso también ahora que lo veo. –

2

Me preocuparía ofrecer mapeos de conexiones de hilos 1: 1, por lo menos porque te deja bastante expuesto a ataques de denegación de servicio.(pthread_create() es una operación bastante costosa en comparación con una llamada a accept())

EboMike ya ha respondido directamente a la pregunta, siempre que los hilos estén bloqueados y no estén ocupados, esperando que no consumirán mucho en cuanto a recursos aunque ocupará memoria e intercambiará para todo el estado por hilo.

+0

Gracias por el consejo. DoS no es un riesgo porque los hilos no se crean/destruyen en función de las conexiones entrantes. En cambio, se crean cuando una aplicación está configurada (durante su ejecución) para administrar un nuevo dispositivo y se destruye cuando se elimina un dispositivo. – amso

+0

¿Podría examinar mi respuesta y dejarme saber sus pensamientos? Creo que puede haber un impacto, dependiendo de la aceptabilidad de la latencia al despertar un hilo. –

3

Principalmente utilizarán el espacio de direcciones y la memoria para las pilas; una vez que obtienes, digamos, 1000 hilos, esto se vuelve bastante significativo ya que he visto que 10M por hilo es típico para las pilas (en x86_64). Es cambiante, pero solo con cuidado.

Si tiene un procesador de 32 bits, el espacio de direcciones será la principal limitación una vez que llegue a 1000s de hilos, puede agotar fácilmente el AS.

Usan memoria del kernel, pero probablemente no tanto como el espacio de usuario.


Editar: por supuesto, los hilos comparten el espacio de direcciones entre sí solo si están en el mismo proceso; Estoy asumiendo que lo son.

+0

la biblioteca pthread tiene 32 megabytes por hilo mínimo recomendado – Jay

+3

Cita por favor; la mayoría de los sistemas que he visto parecen predeterminados en alrededor de 1M - 8M; No puedo ver dónde se recomienda un mínimo de 32Mb por hilo. – MarkR

0

Estoy aprendiendo los conceptos básicos del kernel ahora. No puedo darle una respuesta específica todavía; Todavía soy un novato ... pero aquí hay algunas cosas para que puedas masticar.

Linux implementa cada subproceso POSIX como un proceso único. Esto creará sobrecarga como otros han mencionado. Además de esto, su modelo de espera parece defectuoso en cualquier forma que lo haga. Si crea una variable condicional para cada hilo, entonces creo (basado en mi interpretación del sitio web a continuación) que en realidad estará gastando mucha memoria del kernel, ya que cada hilo se colocaría en su propia cola de espera. Si, en cambio, divide los hilos para cada grupo de subprocesos X para compartir una variable condicional, entonces también tiene problemas porque cada vez que la variable señala, debe activar _EVERY_DARN_PROCESS_ en la cola de espera de esa variable.

También asumo que necesitará hacer algún objeto que comparta una sincronización. En este caso, su código puede ser más lento debido a la necesidad de activar todos los procesos que esperan un recurso, como mencioné anteriormente.

Sé que esto no fue de mucha ayuda, pero como he dicho, soy un novato de kernel. Espero que haya ayudado un poco.

http://book.chinaunix.net/special/ebook/PrenticeHall/PrenticeHallPTRTheLinuxKernelPrimer/0131181637/ch03lev1sec7.html

+0

Mi comprensión de la implementación de NPTL es que "cada hilo es un proceso" no es ni la mitad de malo que suena inicialmente, porque la clonación a la que se asigna este mapa está bastante optimizada. Los puntos de referencia parecen estar de acuerdo con esto (http://kerneltrap.org/node/429). En lo que respecta a una variable condicional por subproceso, si realmente se requirió y resultó ser un problema, se puede evitar esto mediante "hash" (es decir, compartiendo) 1 cond var por 20 subprocesos más o menos. Había estado asumiendo que sería IO bloqueando los hilos, no las primitivas de sincronización, que creo que también es más barato. – Flexo

+0

El bloqueo de subprocesos se realiza mediante la sincronización. ¿Sería un semáforo una solución más liviana? El despertar y el bloqueo de los hilos se pueden modelar fácilmente como un patrón productor-consumidor. – amso

+0

Mídalo y vea. Creo que la mayoría de las primitivas de sincronización pthread en Linux se implementan usando futex (2) en estos días, por lo que probablemente no haya mucha diferencia entre ellas. Si no se implementan utilizando futex, es posible que vea algunas mejoras de rendimiento al usarlo usted mismo, aunque le recomiendo que lo mida. – Flexo

0

no estoy seguro de lo que "dispositivo" que está hablando, pero si es un descriptor de archivo, me gustaría sugerir que se mire empezando a migrar al uso ya sea sondeo o epoll (Id sugieren el último da la descripción de qué tan activo espera que sea cada descriptor de archivo). De esta forma, podría usar un proceso que sería responsable de todos los fds.

+0

Gracias. Creo que malinterpretaste la pregunta. No estoy sondeando eventos desde un descriptor de archivo ni nada por el estilo. La pregunta se relaciona con la implementación de varias tareas para el control de potencialmente cientos de dispositivos o entidades, o cualquier cosa que requiera un algoritmo con estado. – amso

Cuestiones relacionadas