Reflexiones profundas sobre la entrevista n.° 3 del grupo de subprocesos: subprocesos

6 hilos (Alibaba Healthy Two Faces)

6.1 ¿Cuál es la relación entre la cantidad de subprocesos en su grupo de subprocesos y la cantidad de tablas?

Respuesta: Lo que pensé en ese momento fue establecer el número de subprocesos centrales en 20. Esto se basa en la fórmula (número de subprocesos centrales = número de núcleos de CPU (tiempo de espera de subprocesos/tiempo promedio para tareas de ejecución de subprocesos + 1)) El número máximo de subprocesos se establece en la tabla y luego se utiliza una cola de bloqueo. El número de subprocesos no principales aquí no se atreve a establecerse demasiado grande, porque la sincronización de datos implica una gran cantidad de tareas de migración de datos, por lo que si se extraen demasiados datos de mysql al mismo tiempo durante el proceso de sincronización, los datos pueden causar OOM;

Si la cantidad de datos de la tabla que se sincronizarán es básicamente pequeña y se realizan operaciones de modificación posteriores, es mejor utilizar cachedThreadPool para la operación de sincronización.

6.2 Si se trata de un requisito intensivo de IO, el tiempo de inactividad de la CPU será muy largo ¿Cómo diseñar mejor un grupo de subprocesos?

Debido a que este es un requisito intensivo de IO, el tiempo de IO de una tarea es muy largo, lo que significa que se bloqueará durante la IO de la red y el tiempo de inactividad de la CPU será muy largo.

Para tareas intensivas de IO, dado que los subprocesos no consumen CPU mientras esperan IO (por ejemplo, operaciones de disco o solicitudes de red), se pueden usar más subprocesos para mejorar el rendimiento del sistema. Sin embargo, los subprocesos en sí no son libres ya que requieren memoria (por ejemplo, pila de subprocesos) y agregan una sobrecarga de programación de subprocesos. Por tanto, el número de subprocesos no puede ser demasiado.

A continuación se ofrecen algunas sugerencias para diseñar grupos de subprocesos para necesidades intensivas de IO:

  1. Configuración del número de hilo :

    • Puede considerar establecer una cantidad relativamente grande de subprocesos y una estrategia común es CPU核数 * 2o mayor.
    • También puede considerar ajustar dinámicamente la cantidad de subprocesos en función de la relación entre el tiempo de espera de E/S real del sistema y el tiempo de CPU.
  2. Elija la cola apropiada :

    • El uso de una cola limitada, por ejemplo ArrayBlockingQueue, puede evitar que las tareas se acumule y provoque un desbordamiento de la memoria.
    • Seleccione razonablemente el tamaño de la cola en función de la carga comercial real. Una cola demasiado grande puede consumir más memoria y una cola demasiado pequeña puede provocar que se rechacen demasiadas tareas.
  3. Tiempo de supervivencia del hilo :

    • Para tareas con uso intensivo de IO, el tiempo de supervivencia del subproceso se puede establecer relativamente corto, de modo que los recursos del subproceso que ya no son necesarios se puedan liberar más rápido.
  4. Denegar política :

    • Cuando la cola está llena y el número de subprocesos alcanza el máximo, se necesita una estrategia para manejar las tareas entrantes. La estrategia predeterminada es lanzar RejectedExecutionException, pero también puede elegir otras estrategias, como la estrategia de ejecución del llamador, que permite que el subproceso que envió la tarea realice la tarea por sí mismo.
  5. Usar prioridad de tarea :

    • Si algunas tareas de IO son más urgentes que otras, considere utilizar una cola prioritaria.
  6. Monitoreo y ajuste :

    • Supervise los indicadores clave del grupo de subprocesos, como: longitud de la cola, número de subprocesos, uso de CPU, etc. Esta información se puede utilizar para determinar si es necesario ajustar la configuración del grupo de subprocesos.
    • Ajuste la configuración del grupo de subprocesos de acuerdo con los períodos pico del negocio. Por ejemplo, cuando la demanda de IO es baja por la noche, se puede reducir la cantidad de subprocesos.

En resumen, para requisitos intensivos de IO, el objetivo principal es maximizar el rendimiento del sistema. Por lo general, esto significa usar más subprocesos y configurar los parámetros del grupo de subprocesos de manera adecuada.

6.3 ¿Cuándo crees que se crearon los subprocesos en el grupo de subprocesos?

Respuesta: El subproceso central se puede crear cuando se declara el grupo de subprocesos. Esto es equivalente al precalentamiento del subproceso. La tarea se puede utilizar tan pronto como llega. Esto está controlado por el parámetro preStart.

6.4 ¿Cuál crees que es el estado de un hilo?

Respuesta: en ejecución, listo, bloqueado, terminado

En Java, el ciclo de vida de un hilo incluye múltiples estados. Los siguientes son los estados principales de los subprocesos de Java:

  1. Nuevo (NUEVO) :

    • El hilo está en este estado cuando creamos un objeto de hilo pero aún no hemos llamado a sus start()métodos.
  2. Ejecutable (EJECUTABLE) :

    • Un objeto de subproceso está en un estado ejecutable cuando se ha llamado start()a su método , pero el programador de subprocesos aún no lo ha seleccionado como el subproceso de ejecución actual. Esto también incluye el estado de los subprocesos que se ejecutan dentro de la máquina virtual Java.
  3. BLOQUEADO :

    • El subproceso está esperando el bloqueo del monitor (por ejemplo, cuando un subproceso llama a un método sincronizado o a un bloque sincronizado y el método sincronizado o bloque sincronizado actual ya está retenido por otro subproceso, entonces el subproceso ingresa al estado BLOQUEADO).
  4. Esperando :

    • El subproceso está en estado de espera porque se llamó a uno de los siguientes métodos:
      • Object.wait()
      • Thread.join()
      • LockSupport.park()
    • Esta es una espera ilimitada y otros subprocesos deben despertar explícitamente el hilo.
  5. Tiempo de espera de espera (TIMED_WAITING) :

    • Cuando un subproceso llama a uno de los siguientes métodos y especifica un parámetro de tiempo de espera, el subproceso estará en este estado:
      • Thread.sleep(long millis)
      • Object.wait(long timeout)
      • Thread.join(long millis)
      • LockSupport.parkNanos()oLockSupport.parkUntil()
    • Un subproceso permanece en este estado hasta que se alcanza el tiempo de espera o hasta que otro subproceso lo despierta.
  6. TERMINADO :

    • Un hilo está en este estado cuando se run()completa su método o cuando se interrumpe el hilo.

En la programación Java, puede utilizar Thread.getState()el método para obtener el estado actual de un hilo. Esto es muy útil para la depuración y la gestión de subprocesos.

6.5 Si descubre que el uso de la CPU es muy alto, ¿en qué estado de los subprocesos se concentrará?

Respuesta: Si el subproceso está en estado de bloqueo, no debería ocupar mucha CPU y está suspendido en la cola de bloqueo, por lo que debemos centrarnos en los subprocesos en estado de ejecución.

6.6 Si encuentro que la cantidad de subprocesos de una aplicación ha ido creciendo lentamente, y la cantidad de visitas no fluctúa mucho en este momento, y su CPU y carga no fluctúan mucho, ¿cómo lo analizará y qué debe hacer? ¿Cómo analizarlo de esta manera, a qué estado de los hilos prestarás atención? (Respondí incorrectamente)

respuesta:

Respuesta: Cuando la cantidad de subprocesos de una aplicación continúa creciendo lentamente, pero la cantidad de visitas, CPU y carga son relativamente estables, las situaciones posibles son:

  • Fuga de hilo : Es posible que algunos hilos no se cierren correctamente, lo que hace que el número de hilos aumente gradualmente con el tiempo . Esto puede suceder cuando se utilizan subprocesos personalizados o grupos de subprocesos.

  • Biblioteca/componente de terceros : es posible que esté utilizando una biblioteca o componente que crea subprocesos internamente y no los administra correctamente.

Para un análisis más detallado:

  1. Análisis de la pila de subprocesos : puede utilizar las herramientas integradas de Java jstackpara ver la pila de subprocesos de la aplicación. Esto le dará a cada hilo una instantánea que muestra lo que está haciendo. A través de esta herramienta, puedes identificar qué hace el hilo en crecimiento y qué parte del código se inicia.

  2. Preste atención al estado : especialmente a los hilos WAITING y TIMED_WAITING . Aunque es posible que estos subprocesos no consuman una gran cantidad de CPU , pueden bloquearse esperando un determinado recurso o una determinada condición, lo que hace que el número de subprocesos crezca.

  3. Herramientas de monitoreo : utilice herramientas como VisualVM, JProfiler, etc. para monitorear la creación, el estado y la destrucción de subprocesos en tiempo real. Esto puede ayudar a identificar patrones de creación de subprocesos y posibles fugas de subprocesos.

  4. Revisión de registros : revise los registros de la aplicación para verificar excepciones, errores u otra información relevante que pueda estar relacionada con el comportamiento del hilo.

  5. Revisión de código : verifique todos los lugares del código donde se crean subprocesos o grupos de subprocesos para garantizar que los subprocesos se cierren correctamente después de completar sus tareas.

Conclusión: cuando la cantidad de subprocesos continúa creciendo pero otros indicadores son relativamente estables, es probable que se trate de un problema de administración de subprocesos o una fuga de subprocesos. La clave es encontrar qué subprocesos se siguen creando y por qué no se cierran correctamente.

6.7 ¿Cómo entiendes los aspectos horizontales y verticales del gráfico de llamas? ¿Puede resolver el problema que acabo de mencionar?

Respuesta: Horizontalmente representa el tiempo de CPU dedicado a ejecutar un subproceso y verticalmente representa la pila de llamadas del método, porque lo que acabas de decir es que el subproceso no ocupa mucho la CPU, es decir, la tarea puede ejecutarse pero no liberarse correctamente, por lo que el gráfico de llama no es aplicable. para resolver este problema

Supongo que te gusta

Origin blog.csdn.net/yxg520s/article/details/132847187
Recomendado
Clasificación