¿El software diseñado para servidores utiliza todos los núcleos de CPU de núcleo cuádruple o hexadecimal?

Piense en el subsistema subyacente que manejaría esto, es decir, el planificador de procesos y el modelo de proceso. Recuerde cómo funciona el algoritmo CFS (programación consistente y justa) (¡GRACIAS INGO! 1): el sistema intentará mantener la distribución de tareas / procesos lo más uniforme posible en todas las unidades de procesamiento (también la programación O (1) y todo eso…). Si un “núcleo” se carga más que los demás, se invocará un algoritmo de equilibrio para migrar y redistribuir procesos entre las diferentes colas de ejecución para mantener las cosas lo más cargadas posible.

Al planificador no le importa que algo sea un hilo frente a un HWP; de hecho, en lo que respecta a Linux, todo es un LWP. El rasgo distintivo entre un proceso normal y un hilo es que un hilo pertenece a un “grupo de hilos” y comparte su espacio de direcciones de memoria virtual con los otros procesos que viven en ese grupo de hilos (es decir, los otros hilos). Entonces, cuando el Sr. Scheduler pueda programar estas bestias para el tiempo de CPU, se distribuirán entre las diferentes unidades de procesamiento de la manera habitual. Se pueden obtener algunas eficiencias al cambiar de contexto entre diferentes procesos en el mismo tgroup (¡revise la fuente de su núcleo!), Es decir, no es mucho más complicado que simplemente cambiar EIP (una gran cantidad de memoria en movimiento y cosas de caché no necesitan tener lugar debido al espacio de dirección virtual compartido). Hay formas de establecer programáticamente la afinidad del procesador y modificar la programación, pero en general así es como funcionan las cosas.

Entonces, para responder a su pregunta, sí, un proceso de servidor “hará uso de múltiples núcleos” probablemente debido al modelo de subprocesos. Además, fork / exec definitivamente se distribuirá entre los diferentes núcleos porque eso solo está generando un nuevo proceso.

Ahora … si su proceso es solo un proceso enlazado a un solo subproceso / CPU, no tendrá acceso a más de una unidad de procesamiento durante la duración de su división de tiempo (o cuántica, o cualquier palabra elegante que quiera usar). Esta es la razón por la cual su proceso bash solo parece vivir en un único procesador: ¡solo tiene una unidad ejecutable para programar!

La mayoría del software de servidor web se puede configurar para ejecutar múltiples procesos, cada proceso generalmente se ejecuta en una sola CPU, por lo que necesitará al menos 4 procesos para utilizar toda la potencia de procesamiento de una CPU de cuatro núcleos, etc. Algunos procesos de servidor web están diseñados para se ejecutan en múltiples subprocesos, lo que les permite usar múltiples procesadores en un solo proceso. En cualquier caso, este comportamiento se puede configurar utilizando el archivo de configuración de los servidores.

Node.js es de un solo subproceso, si desea utilizar más de un núcleo, debe ejecutar más de un proceso Node.js (a menudo con un servidor proxy como Nginx frente a ellos para dividir las solicitudes).

Supongo que cada proceso de CLI de PHP solo puede acceder a un núcleo, pero si el servidor web admite múltiples hilos / procesos, puede generar más de un proceso de CLI a la vez.

Puede usar la salida de programas de monitoreo como top para obtener más información sobre la utilización del procesador. Con la parte superior, presione la tecla 1 mientras está
corriendo para ver cada núcleo individualmente.

Decir que bash solo puede usar un núcleo es solo parcialmente cierto. El código escrito en el script bash se ejecuta en un núcleo, pero los programas generados desde bash pueden usar múltiples núcleos como cualquier otro proceso. Por ejemplo: make -j4 se ejecutará en cuatro núcleos.

Sí. Los servidores sirven a muchos más clientes que la cantidad de núcleos que tienen, por lo que el software que sirve a cada cliente en un solo hilo (la forma típica de programar) es suficiente para utilizar todos los núcleos.