Prueba de carga de un sistema de subprocesos múltiples frente a uno que utiliza procesos separados: ¿por qué la versión de subprocesos es mucho más rápida?

Estoy trabajando en un sistema donde interactúan tres componentes de alto nivel.

Cliente (PHP) - Logger (Java) - MainBackend (Java)

El cliente PHP crea un nuevo proceso de Logger de Linux para cada solicitud recibida. El registrador luego envía un mensaje a través de TCP a MainBackend y comienza a registrar los mensajes que recibe de MainBackend. Tenga en cuenta que Logger es muy ligero y utiliza muy poca memoria.

Probé este sistema mediante carga, aumentando el número de usuarios, N, accediendo al sistema. Luego escribí una versión en la que Logger tenía varios subprocesos para que solo se utilizara un proceso por cada N usuarios simultáneos y probé la versión con subprocesos.

Los resultados fueron que la versión de subprocesos múltiples fue MUCHO más rápida, ya que muchas veces más rápido que cierto N. Mi pregunta es ¿por qué?

Si toma un cierto tiempo T para iniciar cada proceso de Linux, ¿por qué no veo una diferencia constante (T2 - T1) entre los dos gráficos?

¿Linux es mucho menos eficiente en la programación de procesos que Java en la programación de subprocesos?

EDITAR: Un punto importante que no mencioné es que todo el tiempo se realizó desde Logger, por lo que el tiempo para iniciar el proceso / máquina virtual no está afectando los resultados: realicé el experimento de esta manera para tener la menor cantidad de variables como sea posible.

Respuesta 1

JVM realiza optimizaciones de tiempo de ejecución, especialmente para el código ejecutado repetidamente. Esto llevará un tiempo, un período de calentamiento. El resultado puede ser increíblemente más rápido. Puede cronometrar su tarea repetidamente en la misma máquina virtual, verá que es lenta al principio pero al final es mucho más rápida.

Si inicia un nuevo proceso de JVM para cada tarea pequeña, no se activará la optimización antes de que finalice JVM.

Respuesta: 2

Los procesos son más pesados ​​que los hilos. Usar un proceso existente o una conexión TCP existente es mucho más rápido que crear uno nuevo cada vez. Esto es cierto para todos los sistemas operativos. Solo crearía procesos o conexiones a pedido si el rendimiento no fuera un problema para usted.

Verá alguna variación en el tiempo que lleva realizar la mayoría de las tareas porque la máquina está tratando de hacer varias cosas a la vez. Siempre debe esperar ver alguna variación.

Respuesta: 3

Necesito algunos consejos sobre cómo actualizar una contraseña cifrada en un LDAP (OpenLDAP) de un usuario dentro de un árbol LDAP. Las contraseñas en el servidor LDAP tienen el prefijo {crypt}, lo que supongo que indica que ...

Tengo una clase base que captura algunas funciones comunes a dos clases. En otras palabras, puedo crear una clase base y hacer que estas dos clases sean subclases de esa clase base. Sin embargo, para cada uno de ...

Obtuve un método que recibe un parámetro de tipo largo, y trato de llamarlo pasando 1: contato.setId (1); Y recibo esto: el método setId (Long) en el tipo Contato no es aplicable para el ...

Heredé dos bases de código bastante triviales que usan spring para configurar las aplicaciones. Ahora necesito reconfigurar las aplicaciones. Pero mucha de la configuración se proporciona a través de ...