example multithreading java-8 linuxmint jetty-9

multithreading - example - java concurrency



Cómo evitar el patrón de pausa de java constante en Linux Mint (0)

Tengo una aplicación Java ejecutándose en Linux Mint. CADA minuto, el programa muestra una ralentización muy notable: una pausa. La pausa es consistente de 3 a 4 segundos. Cuando ejecutamos más instancias del mismo programa, también se detienen de 3 a 4 segundos cada minuto. Cada programa se detiene en un segundo diferente del minuto.

última actualización:

Después de la última actualización (a continuación), al aumentar el conteo de subprocesos del grupo de subprocesos se eliminó el problema de la GUI. Después de correr alrededor de ~ 40 horas, observamos una fuga de hilo en el Jetty HttpClient bloquea la llamada -GET ( Request.send() ). Para explicar la mecánica, usando la clase Executor: un hilo principal se ejecuta cada pocos minutos. Utiliza Executor para ejecutar un hilo independiente para llamar al host con un comando HTTP GET, Jetty''s HttpClient.request.send() .

Después de aproximadamente 40 horas de operación, hubo un aumento en el número de subprocesos que se ejecutan en el grupo HttpClient . Así que durante 40 horas, los mismos hilos funcionaron bien. La hipótesis de trabajo es que, en ese momento, una o más llamadas a send() no se completaron o caducaron y no han regresado al hilo de llamada. Básicamente, estos / estos hilos están colgados dentro del Jetty Client.

Al observar cada ciclo regular en jVisualMV vemos el comportamiento normal de cada ciclo; algunos subprocesos de HttpClient se activan para el GET del host, se ejecutan y desaparecen en solo unos segundos. También en el monitor hay aproximadamente 10 subprocesos pertenecientes al grupo de subprocesos de Jetty HttpClient que han estado ''presentes'' durante ( ahora ) 10 horas.

La expectativa es que hubo algún error en el procesamiento del cliente o la red subyacente. Me sorprende que no haya excepción de tiempo de espera o excepción de programación. Hay una pregunta clara que puedo hacer ahora.

  1. Qué puede pasar dentro de HttpClient que podría simplemente colgar un Request.send()
  2. ¿Cuál es el tiempo de espera en el retorno de llamada? Creo que todavía habrá tiempos de espera o controles absolutos para bloquear, etc. (¿no?)
  3. ¿Se puede colgar el sistema de E / S y dejar colgado el hilo de llamada? Mientras Java obedientemente ...
    • Enciende el hilo del administrador a la hora programada, luego
    • El siguiente Http.Request.send() sucede,
    • Un (os) nuevo (s) hilo (s) desde el inicio del grupo para el próximo envío (como parece haber sucedido).
    • Mientras que el send() anterior send() está atascado en el limbo
  4. ¿Puedo limitar o de otra manera ponerme a limpiar estos hilos atascados?

Esto estaba sucediendo antes de aumentar el tamaño del grupo de subprocesos. Lo que sucedió es que la ''culpa'' se ha centrado más en el área problemática. también desconfiamos del sistema subyacente porque también tuvimos bloqueos con Apache HttpClient nuevamente alrededor de la misma hora del día (no específica).

( actualización anterior ) ...

El comportamiento de pausa observado es que la GUI de JavaFX no se actualiza / actualiza; el reloj de la pantalla (textView), setText() se registraron durante el congelamiento con dos x actualizaciones por segundo (esa es información nueva). El reloj no se actualiza (en Mint Linux), continúa actualizándose cuando se ejecuta en Windows. Para prevenir que me repita por preguntas sobre GC, registros, sondeos, etc. la respuesta será la misma; hemos realizado extensos diagnósticos en las últimas semanas. El problema es inequívocamente una mezcla de: Linux JVM / Linux Mint / Threads (por JavaFX). Otra pieza de datos nuevos es que aumentar el recuento de grupos de subprocesos en +2 parece eliminar la congelación. Se necesitan más pruebas para confirmar y ajustar los números. La pregunta, sin embargo, es " ¿Cuáles son los parámetros que hacen la diferencia entre las dos plataformas? "

Hemos ejecutado varias instancias del programa en Windows durante días sin pausas. Cuando corremos en una plataforma Mint Linux vemos la congelación, es muy consistente.

El programa tiene varios subprocesos corriendo en un horario. Un hilo abre Internet para un socket http. Cuando comentamos esa área, la pausa desaparece. Sin embargo, no vemos ese comportamiento con Windows. Los experimentos apuntan a algo específico para el subsistema de E / S de red Mint, la programación de Linux, la JVM de Linux Java 8 o alguna interacción entre los dos.

Como puedes adivinar, nos estamos arrancando el pelo en este caso. Por ejemplo, desactivamos el registro y la pausa permaneció. Volvimos a iniciar sesión y simplemente hicimos una llamada al servidor http, pause cada 60 segundos, en el mismo segundo conteo. Esto sucede incluso cuando no hacemos otro procesamiento. Probamos diferentes bibliotecas http, etc. Parece muy claro que está en la JVM o Linux.

¿Alguien sabe de una manera de resolver esto?