Cuando crea instancias de Elastic Compute Service (ECS) con el sistema operativo Alibaba Cloud Linux 3 en la consola de ECS, Transmit Packet Steering (XPS) se habilita automáticamente. Si XPS está deshabilitado en una instancia de ECS con Alibaba Cloud Linux 3, siga los pasos descritos en este tema para configurarlo.
Descripción general de XPS
XPS es un mecanismo que selecciona automáticamente una cola de transmisión cuando se envían paquetes de datos por una interfaz de red (NIC) con varias colas. Este mecanismo crea asignaciones entre las colas de transmisión y los conjuntos de CPU. Cuando una CPU transmite paquetes de datos, el kernel selecciona automáticamente la cola de transmisión asignada a dicha CPU. El kernel registra la cola de transmisión elegida para el primer paquete de un flujo de datos y la utiliza para enviar los paquetes posteriores del mismo flujo. Esto reduce la sobrecarga computacional que implica elegir una cola de transmisión para cada paquete.
XPS ofrece las siguientes ventajas:
Reduce la competencia entre distintas CPU por la misma cola de transmisión. Esto disminuye los conflictos de bloqueo al transmitir datos y mejora la eficiencia de envío de los paquetes.
Crea asignaciones entre las colas de transmisión y las CPU que coinciden con las afinidades de las NIC virtio a las que están vinculadas dichas colas. Así se reduce la probabilidad de fallos de caché durante la transmisión de paquetes o por contención de bloqueos, lo que mejora el rendimiento de la red.
Configurar XPS
-
Conéctese de forma remota a la instancia de ECS de destino.
Para obtener más información, consulte Log in to a Linux instance using Workbench.
-
Ejecute el siguiente comando para comprobar si XPS está configurado en la instancia de ECS. Asegúrese de que
CONFIG_XPSesté habilitado en el kernel.En este ejemplo se utiliza la NIC eth0.
cat /sys/class/net/eth0/queues/tx-*/xps_cpusSi el resultado del comando muestra solo ceros, como en la siguiente imagen, XPS está deshabilitado en la instancia de ECS. En ese caso, continúe con los pasos siguientes para configurar XPS.

-
Configure los parámetros de XPS para todas las NIC virtio según la cantidad de CPU y de colas de transmisión disponibles. Verifique que esta configuración cumpla con la política que usa el kernel para asignar CPU a cada cola de transmisión.
-
Ejecute el siguiente comando para crear un archivo de configuración de XPS en el directorio actual. Por ejemplo, cree el archivo
xps_config.py.vim xps_config.py -
Presione la tecla
Ipara entrar al modo de inserción y copie el siguiente contenido en el archivoxps_config.py:# encoding: utf-8 # This implements the default configuration of kernel XPS. # Note: The configuration of this script only applies to virtio-net nics. import os import multiprocessing def setup_xps(dev): cpu_count = multiprocessing.cpu_count() txq_dir = "/sys/class/net/{0}/queues/".format(dev) queue_count = len([f for f in os.listdir(txq_dir) if f.startswith("tx-")]) if queue_count <= 1: print("The number of txq: {0} <= 1, exit...".format(queue_count)) return group, stragglers = divmod(cpu_count, queue_count) stragglers = 0 if group == 0 else stragglers group = max(group, 1) cpu = 0 queue_final_bitmap = "" # We do not need to care about NUMA node information # So we must pay attention to the performance in multiple NUMA node scenes!! for i in range(queue_count): group_size = (group + 1) if i < stragglers else group queue_per_bitmap = 0 for j in range(group_size): cpu_bitmap = 1 << cpu cpu += 1 queue_per_bitmap |= cpu_bitmap cpu = 0 if cpu >= cpu_count else cpu queue_final_bitmap = hex(queue_per_bitmap)[2:] if "L" in queue_final_bitmap: queue_final_bitmap = queue_final_bitmap.replace("L", "") result_bitmap = output_seg(queue_final_bitmap) eth_txq_path = "/sys/class/net/{0}/queues/tx-{1}/xps_cpus".format(dev, i) with open(eth_txq_path, "w") as fxps: fxps.write(result_bitmap) print("{0}'s XPS configuration done.".format(dev)) def output_seg(bitmap): result = "" count = 0 for char in reversed(bitmap): if count % 8 == 0 and count != 0: result = "," + result result = char + result count += 1 return result def process_devs(): eth_dir = "/sys/class/net/" eth_folders = [f for f in os.listdir(eth_dir) if os.path.isdir(os.path.join(eth_dir, f)) and f.startswith("eth")] for eth_folder in eth_folders: eth = eth_folder.split("/")[-1] setup_xps(eth) if __name__ == '__main__': process_devs() Presione la tecla
Esce introduzca:wqpara guardar y cerrar el archivo.
-
-
Ejecute el siguiente comando para configurar XPS:
sudo python3 xps_config.py -
(Opcional) Ejecute el siguiente comando para comprobar si la configuración de XPS se completó correctamente.
En este ejemplo, 32 CPU de la instancia de ECS se asignan a 8 colas de transmisión de la NIC eth0.
cat /sys/class/net/eth0/queues/tx-*/xps_cpusEl siguiente resultado indica que XPS está configurado. La salida varía según la cantidad de CPU o de colas.

Impactos
El objetivo de configurar XPS es mejorar el rendimiento de la red. Sin embargo, es posible que el rendimiento se vea afectado después de aplicar esta configuración. Si esto ocurre, ejecute el siguiente comando para borrar los parámetros de XPS. En este ejemplo se utiliza la NIC eth0.
sudo sh -c 'for txq in /sys/class/net/eth0/queues/tx-*; do echo 0 > $txq/xps_cpus; done'