Cenário de operação
Este documento descreve como realizar testes de desempenho de rede de alta taxa de transferência em servidores em nuvem via método DPDK.
Etapas de operação
Passo 1: Preparo do ambiente e instalação
Este capítulo irá guiá-lo através da configuração do ambiente de teste DPDK, incluindo download do código-fonte, descompactação, instalação de bibliotecas de dependência e compilação.
Preparação do Ambiente
Os servidores em nuvem precisam de capacidade de acesso à Internet pública. Você pode optar por atribuir um IP público ao criar o servidor em nuvem ou configurar um IP público elástico após a criação do servidor em nuvem. Para servidores em nuvem configurados com múltiplas placas de rede, recomenda-se usar eth0 para testes e as demais placas de rede para login remoto.
Operações relacionadas precisam ser executadas com permissões de root do sistema. Solicite as permissões relevantes antecipadamente.
As seguintes instruções de operação aplicam-se aos sistemas operacionais TencentOS 3.0 e versões superiores.
Prepare dois servidores de teste, respectivamente como receptor e emissor.
Descarregue e descompacte o pacote de código-fonte do DPDK
Utilize o comando wget para baixar o pacote compactado do código-fonte DPDK 23.11 do repositório oficial e descompacte-o.
Nota:
As operações subsequentes devem ser realizadas no diretório após a descompactação do DPDK.
wget https://fast.dpdk.org/rel/dpdk-23.11.tar.gz
tar -xf dpdk-23.11.tar.gz
cd dpdk-23.11
Instalação de bibliotecas de dependência e compilação
Instale as bibliotecas de dependência necessárias e as ferramentas de compilação.
Instale a biblioteca de dependência numactl-devel (requer permissões de root).
yum install numactl-devel -y
Instale as ferramentas de compilação do Python.
pip3 install meson ninja pyelftools
Utilize meson para construir o projeto (definir o número máximo de núcleos lógicos como 1024).
meson build -Dmax_lcores=1024
Utilize ninja para compilar o projeto.
Atenção:
Se o servidor de teste que você usa for do tipo de instância posterior ao SA4 Padrão e a CPU for da especificação mais alta, consulte tratamento de cenários especiais e adicione as etapas de configuração relevantes. Passo 2: Vinculação do módulo de driver do kernel
O DPDK precisa vincular um módulo de driver do kernel dedicado para assumir o controle dos dispositivos de placa de rede.
Baixe o módulo UIO
Clone o código do módulo do kernel do repositório oficial do DPDK:
git clone http://dpdk.org/git/dpdk-kmods
ou utilize o protocolo git (alternativo).
git clone git://dpdk.org/dpdk-kmods
Compile o módulo UIO
Entre no diretório igb_uio e realize a compilação.
cd ./dpdk-kmods/linux/igb_uio
make
Carregue o módulo UIO
Carregar os módulos do kernel uio e igb_uio (requer permissões de root).
modprobe uio
insmod ./dpdk-kmods/linux/igb_uio/igb_uio.ko
Consulte e registre o endereço PCI da placa de rede
Antes de vincular a placa de rede, é necessário obter e registrar o endereço PCI da placa de rede alvo. Execute o seguinte comando para verificar e registrar as informações de todos os dispositivos de placa de rede:
ethtool -i eth0 | grep bus-info
Vincular a placa de rede ao driver UIO
Utilize a ferramenta fornecida pelo DPDK para vincular a placa de rede ao driver igb_uio.
1. Desligue a placa de rede.
Atenção:
Antes de desligar a placa de rede, verifique se você está fazendo login remoto no servidor em nuvem através do IP de outra placa de rede elástica. Se usar o eth0 para login remoto, isso resultará na interrupção da conexão.
2. Vincule a placa de rede ao driver igb_uio (substitua pelo endereço PCI real).
./usertools/dpdk-devbind.py --bind=igb_uio 0000:02:01.0
Passo III: Configuração de memória de página grande
O DPDK utiliza memória de página grande (Huge Pages) para melhorar a eficiência de acesso à memória. A configuração da memória de página grande é um pré-requisito necessário para executar o DPDK.
Execute o seguinte comando para alocar memória de página grande (aqui usamos páginas de 2MB como exemplo, alocando 8192 páginas, totalizando aproximadamente 16GB):
echo 8192 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
Passo 4: Executar o teste de desempenho
O teste de desempenho do DPDK adota o modo de máquina dupla RX-TX: um servidor atua como terminal receptor (RX) e outro servidor como terminal transmissor (TX).
Nota:
O terminal receptor (RX) e o terminal transmissor (TX). Os dois servidores precisam executar os comandos correspondentes respectivamente.
O terminal receptor (RX) executa os seguintes comandos:
C=4; Q=32; ./build/app/dpdk-testpmd -l 0-47 --proc-type primary --file-prefix bench -a 0000:1b:00.0 -- --burst=128 --nb-cores=$C --txd=4096 --rxd=4096 --txq=$Q --rxq=$Q --forward-mode=rxonly --stats-period=1
O terminal transmissor (TX) executa os seguintes comandos:
C=4; Q=32; S=10.31.0.80; D=10.31.0.240; ./build/app/dpdk-testpmd -l 0-47 --proc-type primary --file-prefix bench -a 0000:1b:00.0 -- --burst=128 --nb-cores=$C --tx-ip $S,$D --txonly-multi-flow --txpkts=64 --txd=4096 --rxd=4096 --txq=$Q --rxq=$Q --forward-mode=txonly --stats-period=1
Descrição detalhada dos parâmetros
|
-a 0000:1b:00.0 | Especifique o endereço PCI da placa de rede a ser utilizado, que deve ser substituído conforme o ambiente real. |
--tx-ip S,D | Especifique o endereço IP de destino para envio de pacotes no terminal TX, substituindo pelo endereço da placa de rede do servidor em nuvem. |
--txonly-multi-flow | Ative o modo de envio de múltiplos fluxos (se não configurado, apenas um único fluxo será enviado). |
--txpkts=64 | O comprimento do pacote (em bytes, incluindo o cabeçalho MAC), recomenda-se 64 para cenários de teste de PPS. |
-l 0-47 | |
--txq / --rxq = $Q | Especifique o número de filas de envio/recepção, que pode ser verificado por ethtool -l eth0 | grep Combined. |
--nb-cores=$C | O número de núcleos de CPU efetivamente envolvidos no teste, recomenda-se 2 ≤ C ≤ Q. |
--stats-period=1 | Saída de informações estatísticas uma vez por segundo. |
Um exemplo dos resultados do teste é mostrado abaixo, com o terminal receptor (RX) à esquerda e o terminal transmissor (TX) à direita:
Passo 5: Recuperação do Ambiente de Teste
Após a conclusão do teste, recomenda-se restaurar o ambiente ao estado inicial, liberar recursos e evitar impactos em outros serviços.
Restaurar o driver da placa de rede
Use a ferramenta dpdk-devbind.py para restaurar a placa de rede ao driver padrão:
./usertools/dpdk-devbind.py -b virtio-pci 0000:00:08.0
Se o comando acima não funcionar corretamente, você pode executar manualmente o seguinte comando para desvincular o vfio-pci.
echo 0000:1b:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind
echo virtio-pci > /sys/bus/pci/devices/0000\\:1b\\:00.0/driver_override
echo 0000:1b:00.0 > /sys/bus/pci/drivers/virtio-pci/bind
Restaurar memória de página grande
Zere a quantidade de memória de página grande.
echo 0 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
Reative a placa de rede.
Cenários Especiais de Tratamento
Se o servidor de teste que você usa for do tipo de instância posterior ao SA4 Padrão e a CPU for da especificação mais alta, será necessário adicionar as seguintes etapas de configuração.
Ver a distribuição de filas entre NUMAs
Nota:
Para servidores com CPUs multi-socket, é necessário garantir que os núcleos de CPU usados pelo DPDK estejam no mesmo nó NUMA que a placa de rede, caso contrário, o desempenho será significativamente reduzido.
1. Baixar e verificar o script
wget https://lag-dpdk-1326316016.cos.ap-guangzhou.myqcloud.com/dpdk_core_advisor.sh
2. Executar o script para ver a distribuição NUMA entre filas
sh dpdk_core_advisor.sh eth0
Se os resultados retornados mostrarem distribuição de filas entre nós NUMA, instale o lag_dpdk.patch.
Instale o lag_dpdk.patch
1. Baixe o script de patch lag_dpdk.patch.
wget https://lag-dpdk-1326316016.cos.ap-guangzhou.myqcloud.com/lag_dpdk.patch
2. Aplique o patch.
git apply lag_dpdk.patch
Comandos equivalentes (basta escolher um)
patch -p1 < lag_dpdk.patch
3. Recompile.
meson build -Dmax_lcores=1024
ninja -C build