[ Nota del editor:existen limitaciones conocidas para la fijación de CPU en algunos entornos, así que asegúrese de leer los detalles de su entorno antes de seguir este tutorial. ]
Las CPU ejecutan todas las aplicaciones y es mejor si entiende cómo funciona y cómo puede ajustar el uso de la CPU para aumentar el rendimiento de sus aplicaciones.
Los sistemas modernos suelen tener varias CPU y núcleos, que el programador del kernel comparte entre todo el software en ejecución. Entonces, normalmente, no le preocupa qué CPU/núcleo ejecuta su aplicación o proceso, siempre que se ejecute.
Hay varias formas de obtener más CPU y hacer que su aplicación funcione mejor y se ejecute de manera más eficiente. Una forma es usar el ajuste de prioridad usando el nice
/renice
comando.
[ También te puede interesar: La unidad central de procesamiento (CPU):sus componentes y funcionalidad]
La segunda forma es vincular la aplicación a una o más CPU, lo que se denomina "fijación de CPU" o "afinidad de CPU". Vincular la aplicación a una CPU o CPU específicas hace que todos los subprocesos o procesos secundarios relacionados con la aplicación se ejecuten en CPU/CPU definidas. De esta manera, limitar el proceso/aplicación a una o más CPU da como resultado más "calor de caché" o "accesos de caché", lo que aumenta el rendimiento general. El primer beneficio de la afinidad de la CPU es optimizar el rendimiento de la memoria caché. El segundo beneficio de la afinidad de la CPU es que si varios subprocesos acceden a los mismos datos, tiene sentido ejecutarlos todos en el mismo procesador, lo que nos ayuda a minimizar los errores de caché.
Método 1:ajuste de prioridad
Cambiando la prioridad del proceso usando un nice
dominio. Esta es quizás la forma más común conocida de mejorar el uso de la CPU de aplicaciones/procesos.
Unix siempre ha proporcionado un nice()
llamada al sistema para ajustar la prioridad del proceso, que establece una amabilidad valor. Positivo nice
valores dan como resultado una prioridad de proceso más baja (mejor ), y los valores negativos, que solo puede establecer el superusuario (raíz), dan como resultado una prioridad más alta.
El nice
El valor sigue siendo útil hoy en día para ajustar la prioridad del proceso. Su tarea es identificar el trabajo de baja prioridad, que puede incluir agentes de supervisión y copias de seguridad programadas, que modifica para comenzar con un nice
valor. También puede realizar un análisis para verificar que el ajuste sea efectivo y que la latencia del programador permanezca baja para el trabajo de alta prioridad.
¿Cómo funciona?
Cada proceso tiene una cantidad específica de tiempo para ejecutarse en la CPU. El tiempo real durante el cual el proceso se ejecuta en la CPU se denomina tiempo de ejecución virtual del proceso Por cierto, la CPU tiende a actuar como un padre y tiene la costumbre de dividir el tiempo por igual entre todos los hijos (los procesos).
El tiempo total que un proceso pasa "en la CPU" es el tiempo de ejecución virtual del proceso. El sistema operativo (SO) mantiene un registro de este tiempo de ejecución virtual e intenta dar el mismo tiempo a todos los procesos en la cola de ejecución.
El nice
y renice
las utilidades manipulan este tiempo de ejecución virtual.
Cuando alimentas valores positivos con renice
/nice
comandos, por ejemplo - renice +10
PID
, está agregando manualmente más tiempo de ejecución virtual al proceso. El sistema operativo cree que el proceso ha tomado más tiempo de ejecución virtual que otros procesos en la cola de ejecución. Entonces, en el próximo ciclo, la CPU le da menos tiempo al proceso. El proceso finaliza tarde ya que está pasando menos tiempo "en la CPU" ahora, después de la renice
comando.
Pero cuando alimentas valores negativos con renice
/nice
comandos, por ejemplo - renice -10 PID
, está reduciendo manualmente el tiempo de ejecución virtual del proceso. El sistema operativo cree que el proceso no tiene suficiente tiempo "en la CPU" que otros procesos en la cola de ejecución. Entonces, en el próximo ciclo, la CPU le da más tiempo "en la CPU" a ese proceso en comparación con otros procesos en la cola de ejecución. El proceso terminará rápido.
Método 2:vinculación de procesos
Un proceso puede estar vinculado a una o más CPU, lo que puede aumentar su rendimiento al mejorar la calidez de la memoria caché o accesos de caché y localidad de memoria . En Linux, esto se realiza usando el taskset
comando, que puede usar una CPU máscara o rangos para establecer la afinidad de la CPU.
Usando el taskset
, había vinculado el proceso 6197 para que se ejecutara solo en la CPU 1. Esto dará como resultado más accesos a la memoria caché o al calor de la memoria caché. Otros procesos también pueden ejecutarse en la CPU 1, pero el proceso solo se ejecuta en la CPU 1 y la CPU 2. Esta configuración no es permanente. Si el servidor se reinicia o el proceso se reinicia, el PID cambiará. Entonces esta configuración se pierde.
Una mejor manera es usar un archivo "drop-in".
Método 3:afinidad de CPU a través de un archivo desplegable
Según Wikipedia, Afinidad del procesador o fijación de CPU o "afinidad de caché", permite vincular y desvincular un proceso o un subproceso a una unidad central de procesamiento (CPU) o un rango de CPU, de modo que el proceso o el subproceso se ejecute solo en la CPU o CPU designadas en lugar de en cualquier CPU .
Normalmente, es el núcleo el que determina las CPU que ejecuta un proceso. Cada vez que el planificador reprograma un proceso, puede ir a cualquiera de las CPU disponibles. Si bien esto está bien para la mayoría de las cargas de trabajo, a veces es deseable limitar qué CPU (s) puede ejecutar un proceso. Por ejemplo, limitar un proceso que consume mucha memoria a solo una o dos CPU aumenta las posibilidades de un golpe de caché, lo que aumenta el rendimiento general.
¿Cómo funciona?
En la imagen, tiene tres aplicaciones:X, Y y Z. El comportamiento predeterminado del programador es usar todas las CPU disponibles para ejecutar los subprocesos de las aplicaciones X, Y y Z. Usando la configuración predeterminada, puede ver que Obtendrá una buena cantidad de errores de caché ya que la aplicación se distribuye en todas las CPU. Lo que conduce a menos aciertos de caché y más errores de caché.
Cuando las aplicaciones están ancladas a CPU específicas, se ven obligadas a ejecutarse en CPU específicas, por lo que utilizan la memoria caché de la CPU de manera más efectiva:más código en la misma CPU. Hacerlo da como resultado más calor de caché/accesos de caché y, por lo tanto, una aplicación con mejor rendimiento.
Para explorar cómo puede usar la afinidad de CPU/fijación de CPU para vincular un proceso a ciertos procesadores, fije el sshd
proceso a CPU 0.
Comprobar el estado actual de sshd
Servicio. Está comprobando a qué CPU se vincula.
Según el taskset
páginas del comando man, valor f
significa "cualquier CPU". Por lo tanto, no hay vinculación o fijación de CPU configurada para sshd
servicio.
Vincular el sshd
servicio a CPU 0—creando un drop-in archivo que utilizará para controlar el comportamiento de sshd
Servicio. El archivo desplegable controla muchas cosas relacionadas con un proceso, pero actualmente, se limita a la afinidad/fijación de CPU.
Puede ver cómo el taskset
el comando muestra la CPU como "1", que de acuerdo con el taskset
La página man es la primera CPU disponible.
Puede confirmar aún más el archivo desplegable comprobando el estado de sshd
servicio.
Resumir
Puedes usar nice
o renice
para cambiar la prioridad de un proceso. Tanto el nice
y renice
Los comandos pueden manipular el "tiempo de ejecución virtual" del proceso. Entonces, según los valores, el proceso pasa más o menos tiempo en la CPU.
Puede vincular/fijar un proceso a una o más CPU. Esto aumenta las posibilidades de más calor de caché/accesos de caché, lo que da como resultado un rendimiento mucho mejor. Puedes usar el taskset
herramienta de línea de comandos para este propósito. Pero el efecto es sólo temporal. Si quiere que la configuración sea persistente, tiene que usar un archivo "drop-in".
[ Curso gratuito en línea:Descripción general técnica de Red Hat Enterprise Linux. ]