Ao criar instâncias do Elastic Compute Service (ECS) com o sistema operacional Alibaba Cloud Linux 3 no console do ECS, o Transmit Packet Steering (XPS) é ativado automaticamente. Se o XPS estiver desativado em uma instância ECS com Alibaba Cloud Linux 3, siga as operações descritas neste tópico para configurá-lo.
Visão geral do XPS
O XPS é um mecanismo que seleciona automaticamente uma fila de transmissão ao enviar pacotes de dados por uma interface de rede (NIC) com múltiplas filas. Ele mapeia filas de transmissão para conjuntos de CPUs. Quando uma CPU transmite pacotes de dados, o kernel seleciona automaticamente a fila de transmissão mapeada para essa CPU. O kernel registra a fila escolhida para o primeiro pacote de um fluxo de dados e a reutiliza para os pacotes subsequentes do mesmo fluxo. Esse mecanismo reduz a sobrecarga computacional necessária para selecionar uma fila de transmissão para cada pacote.
O XPS oferece os seguintes benefícios:
Reduz a competição entre diferentes CPUs pela mesma fila de transmissão. Isso diminui conflitos de bloqueio durante o envio de dados e aumenta a eficiência na transmissão de pacotes.
Estabelece mapeamentos entre filas de transmissão e CPUs alinhados às afinidades das NICs virtio às quais as filas estão vinculadas. Essa ação diminui a probabilidade de cache misses durante a transmissão de pacotes e de cache misses causados por contenção de bloqueio, melhorando o desempenho da transmissão de rede.
Configurar o XPS
-
Conecte-se remotamente à instância ECS de destino.
Para mais informações, consulte Log in to a Linux instance using Workbench.
-
Execute o comando a seguir para verificar se o XPS está configurado na instância ECS. Certifique-se de que a opção CONFIG_XPS esteja ativada no kernel.
Este exemplo usa a NIC eth0.
cat /sys/class/net/eth0/queues/tx-*/xps_cpusSe a saída do comando retornar apenas zeros, conforme ilustrado na figura a seguir, o XPS está desativado na instância ECS. Nesse caso, prossiga com as etapas seguintes para configurar o XPS.

-
Defina as configurações do XPS para todas as NICs virtio com base no número de CPUs e filas de transmissão disponíveis. Garanta que as definições do XPS estejam em conformidade com a política usada pelo kernel para alocar CPUs a cada fila de transmissão.
-
Execute o comando a seguir para criar um arquivo de configuração do XPS no diretório atual. Por exemplo, crie o arquivo
xps_config.py.vim xps_config.py -
Pressione a tecla
Ipara insira no modo de inserção e copie o conteúdo a seguir para o arquivoxps_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() Pressione a tecla
Esce digite :wq para salve e fechar o arquivo.
-
-
Execute o comando a seguir para aplicar a configuração do XPS:
sudo python3 xps_config.py -
(Opcional) Execute o comando a seguir para validar se a configuração do XPS foi concluída.
Neste cenário, 32 CPUs da instância ECS são mapeadas para 8 filas de transmissão na NIC eth0.
cat /sys/class/net/eth0/queues/tx-*/xps_cpusA saída de comando a seguir indica que o XPS está configurado. O resultado pode variar dependendo do número de CPUs ou filas.

Impactos
A configuração do XPS visa melhorar o desempenho da rede. No entanto, é possível que ocorram efeitos adversos após a ativação. Caso o XPS prejudique o desempenho da sua rede, execute o comando a seguir para limpar as configurações. Este exemplo usa a NIC eth0.
sudo sh -c 'for txq in /sys/class/net/eth0/queues/tx-*; do echo 0 > $txq/xps_cpus; done'