Solicitudes concentradas en ciertos procesos

Fenómeno

A veces, al ejecutar el comando php start.php status, vemos que las solicitudes se concentran en ciertos procesos específicos, mientras que otros procesos están completamente inactivos.

Mecanismo de concurrencia

La forma en que múltiples procesos de workerman obtienen conexiones es por defecto concurrente, es decir, cuando hay una nueva conexión desde el cliente, todos los procesos inactivos tienen la oportunidad de obtener esa conexión, el más rápido se la queda. Quién es el más rápido, lo determina la programación del núcleo del sistema operativo. Es posible que el sistema operativo priorice seleccionar el proceso que fue utilizado recientemente para obtener el uso de la CPU, ya que puede que aún exista información de contexto del proceso anterior en los registros de la CPU, lo que puede reducir el costo de cambio de contexto. Por lo tanto, cuando los negocios son lo suficientemente rápidos o durante pruebas de carga, es más probable que las conexiones se concentren en ciertos procesos, ya que esta estrategia puede evitar cambios de procesos frecuentes, y el rendimiento suele ser óptimo, no es un problema.

Mecanismo de sondeo

Workerman puede cambiar la forma de obtener conexiones a sondeo configurando $worker->reusePort = true;. Con el enfoque de sondeo, el núcleo distribuye las conexiones de manera aproximadamente equitativa entre todos los procesos, de modo que todos los procesos manejarán las solicitudes juntos.

Malentendidos

Muchos desarrolladores piensan que cuantos más procesos participen en el manejo de solicitudes, mejor será el rendimiento, pero en realidad no siempre es así. Cuando el negocio es lo suficientemente simple, el número de procesos que participan en el manejo de solicitudes debe acercarse al número de núcleos de CPU para que el rendimiento del servidor sea óptimo. Por ejemplo, en un servidor de 4 núcleos, establecer el número de procesos en 4 generalmente logra el máximo QPS en pruebas de carga de helloworld. Si el número de procesos que participan en el manejo supera demasiado el número de núcleos de CPU, el costo de cambio de contexto entre procesos aumenta, y el rendimiento en realidad disminuye. En el caso de negocios que suelen involucrar bases de datos, establecer el número de procesos entre 3 y 6 veces el número de núcleos de CPU puede mejorar el rendimiento.