Saltar al contenido

¿Cuántos hilos son demasiados?

Nuestros mejores desarrolladores agotaron sus depósitos de café, por su búsqueda diariamente por la resolución, hasta que Alejandro halló el arreglo en GitLab por lo tanto ahora la comparte contigo.

Solución:

Algunas personas dirían que dos los hilos son demasiados, no estoy del todo en ese campo 🙂

Aquí está mi consejo: medir, no adivinar. Una sugerencia es hacerlo configurable e inicialmente configurarlo en 100, luego liberar su software y monitorear lo que sucede.

Si su uso de subprocesos alcanza un máximo de 3, entonces 100 es demasiado. Si permanece en 100 durante la mayor parte del día, súbalo a 200 y vea qué sucede.

pudo en realidad, haga que su propio código controle el uso y ajuste la configuración para la próxima vez que se inicie, pero eso probablemente sea excesivo.


Para aclaración y elaboración:

No estoy abogando por implementar su propio subsistema de agrupación de subprocesos, por supuesto, use el que tiene. Pero, dado que estaba preguntando acerca de un buen punto de corte para los subprocesos, asumo que la implementación de su grupo de subprocesos tiene la capacidad de limitar la cantidad máxima de subprocesos creados (lo cual es algo bueno).

He escrito un código de agrupación de conexiones de subprocesos y bases de datos y tienen las siguientes características (que creo que son esenciales para el rendimiento):

  • un número mínimo de subprocesos activos.
  • un número máximo de hilos.
  • cerrar hilos que no se han utilizado durante un tiempo.

El primero establece una línea de base para el rendimiento mínimo en términos del cliente del grupo de subprocesos (esta cantidad de subprocesos siempre está disponible para su uso). El segundo establece una restricción en el uso de recursos por subprocesos activos. El tercero lo devuelve a la línea de base en momentos de tranquilidad para minimizar el uso de recursos.

Debe equilibrar el uso de recursos de tener subprocesos sin usar (A) con el uso de recursos de no tener suficientes subprocesos para hacer el trabajo (B).

(A) es generalmente el uso de la memoria (pilas, etc.) ya que un subproceso que no funciona no utilizará gran parte de la CPU. (B) generalmente habrá un retraso en el procesamiento de las solicitudes a medida que llegan, ya que debe esperar a que un hilo esté disponible.

Por eso mides. Como dices, la gran mayoría de tus subprocesos estarán esperando una respuesta de la base de datos, por lo que no se ejecutarán. Hay dos factores que afectan la cantidad de subprocesos que debe permitir.

El primero es el número de conexiones DB disponibles. Este puede ser un límite estricto a menos que pueda aumentarlo en el DBMS. Voy a suponer que su DBMS puede tomar una cantidad ilimitada de conexiones en este caso (aunque idealmente también debería medir eso).

Luego, la cantidad de subprocesos que debe tener depende de su uso histórico. El mínimo que debe tener en ejecución es el número mínimo que alguna vez ha tenido en ejecución + A%, con un mínimo absoluto de (por ejemplo, y hágalo configurable como A) 5.

El número máximo de subprocesos debe ser su máximo histórico + B%.

También debe estar monitoreando los cambios de comportamiento. Si, por alguna razón, su uso llega al 100 % del disponible durante un tiempo significativo (de modo que afecte el rendimiento de los clientes), debe aumentar el máximo permitido hasta que vuelva a ser un B % más alto.


En respuesta a la pregunta “¿qué debo medir exactamente?” pregunta:

Lo que debe medir específicamente es la cantidad máxima de subprocesos en uso concurrente (por ejemplo, esperando un retorno de la llamada DB) bajo carga. Luego agregue un factor de seguridad del 10% para ejemplo (enfatizado, ya que otros carteles parecen tomar mis ejemplos como recomendaciones fijas).

Además, esto debe hacerse en el entorno de producción para el ajuste. Está bien obtener una estimación de antemano, pero nunca se sabe qué producción se le presentará (es por eso que todas estas cosas deben configurarse en tiempo de ejecución). Esto es para detectar una situación como la duplicación inesperada de las llamadas entrantes del cliente.

Esta pregunta se ha discutido bastante a fondo y no tuve la oportunidad de leer todas las respuestas. Pero aquí hay algunas cosas a tener en cuenta al observar el límite superior en la cantidad de subprocesos simultáneos que pueden coexistir pacíficamente en un sistema determinado.

  1. Tamaño de la pila de subprocesos: en Linux, el tamaño predeterminado de la pila de subprocesos es de 8 MB (puede usar ulimit -a para averiguarlo).
  2. Máxima memoria virtual que admite una determinada variante del sistema operativo. Linux Kernel 2.4 admite un espacio de direcciones de memoria de 2 GB. con Kernel 2.6, yo un poco más grande (3GB)
  3. [1] muestra los cálculos para la cantidad máxima de subprocesos por máquina virtual máxima admitida. Para 2.4 resulta ser alrededor de 255 hilos. para 2.6 el número es un poco mayor.
  4. ¿Qué tipo de planificador de kernel tienes? Al comparar el programador del kernel de Linux 2.4 con el 2.6, el último le brinda una programación O(1) sin depender de la cantidad de tareas existentes en un sistema, mientras que la primera es más una O(n). Así también las capacidades SMP del programa del kernel también juegan un buen papel en el número máximo de subprocesos sostenibles en un sistema.

Ahora puede ajustar el tamaño de su pila para incorporar más subprocesos, pero luego debe tener en cuenta los gastos generales de la gestión de subprocesos (creación/destrucción y programación). Puede aplicar la afinidad de CPU a un proceso determinado, así como a un subproceso determinado para vincularlos a CPU específicas para evitar los gastos generales de migración de subprocesos entre las CPU y evitar problemas de efectivo frío.

Tenga en cuenta que uno puede crear miles de subprocesos a su gusto, pero cuando Linux se queda sin VM, simplemente comienza a matar procesos aleatoriamente (por lo tanto, subprocesos). Esto es para evitar que el perfil de utilidad se agote. (La función de utilidad informa sobre la utilidad de todo el sistema para una cantidad determinada de recursos. Con recursos constantes en este caso, ciclos de CPU y memoria, la curva de utilidad se aplana con más y más tareas).

Estoy seguro de que el programador del kernel de Windows también hace algo de este tipo para lidiar con la sobreutilización de los recursos.

[1]

http://adywicaksono.wordpress.com/2007/07/10/i-can-not-create-more-than-255-threads-on-linux-what-is-the-solutions/

Si sus subprocesos realizan algún tipo de trabajo intensivo en recursos (CPU/disco), rara vez verá beneficios más allá de uno o dos, y demasiados matarán el rendimiento muy rápidamente.

El ‘mejor de los casos’ es que sus subprocesos posteriores se detengan mientras que los primeros se completan, o algunos tendrán bloqueos de gastos generales bajos en recursos con poca contención. En el peor de los casos, comienza a destrozar el caché/disco/red y su rendimiento general cae por los suelos.

Una buena solución es colocar solicitudes en un grupo que luego se envían a subprocesos de trabajo desde un grupo de subprocesos (y sí, evitar la creación/destrucción continua de subprocesos es un gran primer paso).

La cantidad de subprocesos activos en este grupo se puede ajustar y escalar según los resultados de su creación de perfiles, el hardware en el que se está ejecutando y otras cosas que pueden estar ocurriendo en la máquina.

Acuérdate de que puedes decir si diste con la solución.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *