diferencia entre conjunto de tareas y cpuset

8

Estoy tratando de reducir la latencia de mi aplicación de red de Linux. Aprendí que hay dos herramientas para "vincular" un programa a un núcleo de CPU en particular: conjunto de tareas y cpuset.

  1. ¿Cuál debería preferir? ¿Son equivalentes en un nivel inferior?
  2. (la disposición) Mi aplicación tiene un solo subproceso y se supone que procesa una conexión tcp única (sin reconexión) a través de una red LAN rápida con la menor latencia posible. ¿Estoy en el camino correcto?
John Linberg
fuente
¿Leíste sus respectivas páginas man?
Michael Hampton
¿Ha ejecutado perfiles detallados para estar seguro de que es la parte de red de Linux la que causa la latencia y no la aplicación?
Tero Kilkanen
¿Qué sistema operativo / distribución / versión / kernel está ejecutando?
ewwhite
Además, ¿qué tipo de hardware está involucrado?
Marca

Respuestas:

12

El conjunto de tareas es para vincular un proceso a una o más CPU; esencialmente especificando dónde puede ejecutarse en la ejecución inicial o mientras se está ejecutando. Si utiliza RHEL / CentOS en equipos de servidores modernos, numactlse recomienda que lo haga taskset.

Cpuset / cset es para el blindaje de la CPU y es un marco creado alrededor de cgroups de Linux. Cset nunca fue popular en ciertas distribuciones (como RHEL) porque hay otras herramientas disponibles para la gestión de procesos.

El primer comando a continuación crea un escudo que limitaría las tareas del sistema operativo a los núcleos de CPU 0 y 8. El segundo movería su sesión de shell actual al escudo de CPU especificado, lo que da como resultado un aislamiento de los procesos del sistema y del usuario.

# cset shield --cpu 1-7,9-15 --kthread=on
# cset proc --move --pid=$$ --threads --toset=user

Hay otras cosas para verificar y ajustar antes de seguir el camino de los procesos de enlace a las CPU; interrupciones ( irqbalancedeshabilitación parcial), configuración de ahorro de energía, programador del sistema, elevadores de E / S, política en tiempo real ( chrt).

Ver: Configuraciones TCP de baja latencia en Ubuntu

Aquí hay un ejemplo ( complicado ) de un contenedor de aplicaciones que selecciona un núcleo, detiene el desequilibrio, lo inicia y pone en la lista negra el núcleo seleccionado, luego ejecuta ./your_program con SCHED_FIFO y la prioridad 99 en el núcleo seleccionado.

Core=5
CoreMask=`echo "16 o 2 $Core ^ p" | dc`
service irqbalance stop
  until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
IRQBALANCE_ONESHOT=1 IRQBALANCE_BANNED_CPUS=${CoreMask} irqbalance
sleep 1
  until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
numactl --physcpubind=${Core} --localalloc chrt -f 99 ./your_program
ewwhite
fuente
1
Tenga en cuenta que es posible que una aplicación restablezca sus afinidades cuando se usa taskset. Si usa cpuset no es posible alterar sus afinidades de lo que le otorga cpuset.
Matthew Ife el
Y numactl??
ewwhite
1
Igual, ambos programas llaman a la misma llamada del sistema subyacente sched_setaffinity.
Matthew Ife el