# Acesso Remoto Direto à Memória (RDMA) para dispositivos Ethernet Intel®

O Acesso Remoto Direto à Memória (RDMA — Remote Direct Memory Access) permite que um dispositivo de rede transfira dados diretamente para e da memória de aplicativos existentes em outro sistema, aumentando a taxa de transferência e reduzindo a latência em determinados ambientes em rede.

- Os dispositivos Ethernet Intel® série 800 são compatíveis com iWARP e RoCEv2.
- Os dispositivos Ethernet Intel® série X722 são compatíveis apenas com iWARP.

A grande diferença é que o iWARP executa o RDMA via TCP, enquanto o RoCEv2 utiliza o UDP.

Para evitar degradação do desempenho por perda de pacotes, ative o controle de fluxo no nível do link ou o controle de fluxo prioritário em todas as interfaces e comutadores de rede.

| NOTAS: Em sistemas executando o sistema operacional Microsoft* Windows Server*, habilitar o *QoS/controle de fluxo de prioridade desabilitará o controle de fluxo no nível do link. Os dispositivos baseados no Controlador Intel® Ethernet série 800 não suportam RDMA quando operando no modo multiporta com mais de 4 portas. Em sistemas Linux*, RDMA e vinculação não são compatíveis. Se o RDMA for habilitado, o bonding não funcionará.

## RDMA no Linux

Estas instruções básicas para instalação de RDMA no Linux são aplicáveis para os seguintes dispositivos:

- Ethernet Intel® série 800
- Ethernet Intel® série X722

Para obter informações detalhadas sobre instalação e configuração, consulte o arquivo README (leiame) do driver do RDMA para Linux, no tarball do driver para dispositivos Intel® Ethernet compatíveis com RDMA.

Este exemplo é específico para o Red Hat* Enterprise Linux*. As especificações do sistema operacional podem ser diferentes.

1. Descompacte o tarball do driver RDMA. Por exemplo:
   `# tar zxf irdma-<x.x.x>.tar.gz`
2. Instale o driver RDMA PF. Por exemplo:
   `# cd irdma-<x.x.x>
   # ./build.sh
   # modprobe irdma`

   | NOTA: Por padrão, o driver irdma é carregado no modo iWARP. Ele utiliza a interface devlink para habilitar RoCEv2 por porta. Para carregar todas as portas do irdma no modo RoCEv2, utilize o seguinte: `# modprobe irdma roce_ena=1`

3. Desinstale qualquer versão instalada anteriormente do rdma-core.
   `# yum erase rdma-core`
4. Baixe o tarball da biblioteca do rdma-core do GitHub. Por exemplo:
   `# wget https://github.com/linux-rdma/rdma-core/releases/download/v27.0/rdma-core-27.0.tar.gz`

   | NOTA: Baixe a versão do rdma-core que corresponde à versão do arquivo de patch da libirdma incluído com o driver. Por exemplo, `libirdma-27.0.patch` requer `rdma-core-27.0.tar.gz`.

5. Descompacte o tarball do rdma-core, aplique o patch e mude o grupo do arquivo de especificação. Por exemplo:
   `# tar -xzvf rdma-core-<version>.tar.gz
   # cd rdma-core-<version>
   # patch -p2 <<caminho até o build do componente>/libirdma-<version>.patch
   # cd ..
   # chgrp -R root <caminho até o rdma-core>/redhat
   # tar -zcvf rdma-core-<version>.tgz rdma-core-<version>`
6. Instale as bibliotecas de espaço do usuário do rdma-core-intel. Por exemplo:
   `# mkdir -p ~/rpmbuild/SOURCES
   # mkdir -p ~/rpmbuild/SPECS
   # cp rdma-core-<version>.tgz ~/rpmbuild/SOURCES/
   # cd ~/rpmbuild/SOURCES
   # tar -xzvf rdma-core-<version>.tgz
   # cp ~/rpmbuild/SOURCES/rdma-core-<version>/redhat/rdma-core.spec ~/rpmbuild/SPECS/
   # cd ~/rpmbuild/SPECS/
   # rpmbuild -ba rdma-core.spec
   # cd ~/rpmbuild/RPMS/x86_64
   # yum install *<version>*.rpm`
7. Habilitar controle de fluxo no seu adaptador. É possível habilitar controle de fluxo prioritário ou no nível do link; nós recomendamos utilizar o controle de fluxo prioritário. Consulte o arquivo README (leiame) do driver do RDMA para obter mais informações sobre controle de fluxo.
8. Habilite o controle de fluxo no comutador ao qual seu sistema estiver conectado. Consulte a documentação do comutador para obter detalhes.

### RDMA para ambientes virtualizados no Linux

Os dispositivos baseados no Ethernet Intel® série 800 suportam RDMA em uma VF no Linux em hosts do Windows ou Linux compatíveis. Consulte o arquivo README (leiame) no tarball do driver RDMA no Linux para obter mais informações sobre como carregar e configurar o RDMA em uma VF no Linux.

## RDMA em FreeBSD*

Os drivers RDMA para FreeBSD estão disponíveis para as seguintes séries de dispositivos:

Dispositivo | Nome do driver básico | Nome do driver RDMA | Protocolos suportados
Ethernet Intel® série 800 | ice | irdma | RoCEv2, iWARP
Ethernet Intel® série X722 | ixl | iw_ixl | iWARP

As instruções a seguir descrevem a instalação básica do FreeBSD RDMA para cada série de dispositivos. Para informações detalhadas sobre instalação e configuração, consulte o arquivo README (leiame) no tarball do driver RDMA FreeBSD.

Ethernet Intel® série 800:

1. Descompacte o driver básico e o driver RDMA. Por exemplo:`
   # tar -xf ice-<version>.tar.gz
   # tar -xf irdma-<version>.tar.gz`
2. Instale o driver básico. Por exemplo:
   `diretório # cd ice-<version>/
   # make
   # make install`
3. Instale o driver RDMA. Por exemplo:
   `# cd irdma-<version>/src
   # make clean
   # make ICE_DIR=$PATH_TO_ICE/ice-<version>/
   # make install`

   | NOTA: Por padrão, o driver irdma é carregado no modo iWARP. Para carregar portas irdma no modo RoCEv2, adicione a seguinte linha a `/boot/loader.conf`, onde `<port>` é a interface na qual habilitar o modo RoCEv2 e depois reiniciar: `dev.irdma<port>.roce_enable=1` Por exemplo, para habilitar o modo RoCEv2 em ice1: `dev.irdma1.roce_enable=1`

4. Habilitar o controle de fluxo.
   `# sysctl dev.ice.<interface_num>.fc=3`
5. Habilite o controle de fluxo no comutador ao qual seu sistema estiver conectado. Consulte a documentação do comutador para obter detalhes.

Ethernet Intel® série X722:

1. Descompacte o driver básico e o driver RDMA. Por exemplo:`
   # tar -xf ixl-<version>.tar.gz
   # tar -xf iw_ixl-<version>.tar.gz`
2. Instale o driver básico. Por exemplo:
   `# cd ixl-<version>/src directory
   # make
   # make install`
3. Instale o driver RDMA. Por exemplo:
   `# cd iw_ixl-<version>/src
   # make clean
   # make IXL_DIR=$PATH_TO_IXL/ixl-<version>/src
   # make install`
4. Habilitar o controle de fluxo.
   `# sysctl dev.ixl.<interface_num>.fc=3`
5. Habilite o controle de fluxo no comutador ao qual seu sistema estiver conectado. Consulte a documentação do comutador para obter detalhes.

## RDMA no Microsoft Windows*

### RDMA (Remote Direct Memory Access — Acesso Remoto Direto à Memória) para Aplicativos Network Direct (ND) no Modo Usuário

O Network Direct (ND) permite que aplicativos no Modo Usuário utilizem recursos de RDMA.

| NOTA: os aplicativos no Modo Usuário podem ter pré-requisitos, como o Microsoft HPC Pack ou a Intel® MPI Library — consulte a documentação de seu aplicativo para obter mais detalhes.

#### Instalação do RDMA no Modo Usuário

O recurso Provedor de RDMA em Modo de Usuário Ethernet Intel® é compatível com o Microsoft* Windows Server* 2012 R2 e posterior.

Para instalar os recursos do Network Direct (ND) do Modo Usuário, siga as etapas abaixo.

1. Na mídia de instalação, execute o Autorun.exe para iniciar o instalador, selecione "Instalar drivers e software" e aceite o contrato de licença.
2. Na tela Opções de instalação, selecione "Provedor de RDMA em Modo Usuário Intel® Ethernet".
3. Na tela Opções de configuração do RDMA, selecione "Habilitar o roteamento de RDMA através das sub-redes de IP", se necessário. Convém observar que essa opção é exibida durante a instalação do driver básico, mesmo que o RDMA do Modo Usuário não esteja selecionado, porque esta opção também se aplica à funcionalidade Network Direct Kernel.
4. Se o Firewall do Windows estiver instalado e ativo, selecione "Criar uma regra de serviço de mapeamento de portas do RDMA Intel® Ethernet no Windows Firewall" e as redes às quais a regra será aplicada.

   | NOTA: se o Firewall do Windows estiver desabilitado ou se você estiver usando um firewall de terceiros, será necessário adicionar manualmente esta regra.

5. Continue a instalação do driver e software.

### RDMA Network Direct Kernel (NDK)

A funcionalidade RDMA Network Direct Kernel (NDK) está incluída nos drivers de rede básicos da Intel e não exige instalação de quaisquer recursos adicionais.

#### Roteamento do RDMA através das sub-redes de IP

Para permitir a funcionalidade RDMA do NDK através das sub-redes, selecione "Habilitar o roteamento do RDMA através das sub-redes de IP" na tela Opções de configuração do RDMA, durante a instalação do driver básico.

### Habilitando o controle de fluxo prioritário (PFC) em um sistema operacional Microsoft Windows Server

Para evitar a queda do desempenho com perda de pacotes, habilite o controle de fluxo prioritário (PFC) ou o controle de fluxo no nível do link em todas as interfaces e comutadores de rede.

| NOTA:em sistemas executando o sistema operacional Microsoft* Windows Server*, habilitar o *QoS/controle de fluxo de prioridade desabilitará o controle de fluxo no nível do link.

Use os seguintes comandos do PowerShell* para habilitar o PFC no Microsoft Windows Server:

`Install-WindowsFeature -Name Data-Center-Bridging -IncludeManagementTools
New-NetQoSPolicy "SMB" -NetDirectPortMatchCondition 445 -PriorityValue8021Action 3
Enable-NetQosFlowControl -Priority 3
Disable-NetQosFlowControl -Priority 0,1,2,4,5,6,7
New-NetQosTrafficClass -Name "SMB" -Priority 3 -BandwidthPercentage 60 -Algorithm ETS
Set-NetQosDcbxSetting -Willing $FALSE
Enable-NetAdapterQos -Name "Slot1 4 2 Port 1"`

### Verificação da operação do RDMA com o Microsoft PowerShell

Para verificar se o RDMA está habilitado nas interfaces de rede, emita o seguinte comando do Microsoft PowerShell:

`Get-NetAdapterRDMA`

Para saber se as interfaces de rede indicam capacidade para RDMA e se o multicanal está habilitado, emita o seguinte comando do PowerShell:

`Get-SmbClientNetworkInterface`

Para verificar se o Network Direct (ND) está habilitado no sistema operacional, emita o seguinte comando do PowerShell:

`Get-NetOffloadGlobalSetting | Selecione NetworkDirect`

Use netstat para se certificar de que cada interface de rede com capacidade para o RDMA tem um ouvinte na porta 445 (os SOs Cliente Windows compatíveis com RDMA podem não postar ouvintes). Por exemplo:

`netstat.exe -xan | ? {$_ -match "445"}`

### RDMA para ambientes virtualizados no Windows

Para habilitar a funcionalidade RDMA em adaptador(es) virtual(is) conectado(s) a um VMSwitch (comutador de máquina virtual), as propriedades avançadas de SRIOV (Single Root IO Virtualization — Virtualização de E/S de raiz única) e de VMQ (Virtual Machine Queues - Filas de Máquina Virtual) devem estar habilitadas em cada porta. Em certas circunstâncias, essas configurações podem ser desabilitadas, como padrão. Essas opções podem ser definidas manualmente no Painel de configurações do adaptador do Intel PROSet ACU, na guia Avançado da caixa de diálogo de propriedades do adaptador ou com os seguintes comandos do PowerShell:

`Set-NetAdapterAdvancedProperty -Name <nic_name> -RegistryKeyword *SRIOV -RegistryValue 1`

`Set-NetAdapterAdvancedProperty -Name <nic_name> -RegistryKeyword *VMQ -RegistryValue 1`

### Configurando o suporte para convidados do RDMA (Modo NDK 3)

O Modo NDK 3 permite que os componentes do Windows no modo kernel usem os recursos do RDMA dentro das partições convidadas do Hyper-V. Para habilitar o Modo NDK 3 em um dispositivo Intel Ethernet, faça o seguinte:

1. Habilite o SR-IOV no BIOS de seu sistema ou no UEFI.
2. Habilite a configuração avançada SR-IOV no dispositivo.
3. Habilite a SR-IOV no VMSwitch vinculado ao dispositivo, executando o seguinte para todas as funções físicas no mesmo dispositivo:
   `New-VMSwitch -Name <switch_name> -NetAdapterName <device_name>`
   `-EnableIov $true`
4. Configure o número de funções virtuais (VFs — Virtual Functions) do RDMA no dispositivo, definindo a opção avançada "RdmaMaxVfsEnabled". Todas as funções físicas devem ser definidas com o mesmo valor. O valor é o número máximo de VFs com capacidade de RDMA, de uma só vez, para o dispositivo inteiro. Habilitar mais VFs restringirá recursos do RDMA das funções físicas (PFs — Physical Functions) e outras VFs.
   `Set-NetAdapterAdvancedProperty -Name <device_name> -RegistryKeyword RdmaMaxVfsEnabled -RegistryValue <Value: 0 - 32>`
5. Desabilite todos os adaptadores de PF no host e reabilite-os. Isso é necessário quando a palavra-chave do registro “RdmaMaxVfsEnabled” é alterada ou ao criar ou destruir um VMSwitch.
   `Get-NetAdapterRdma | Disable-NetAdapter`
   `Get-NetAdapterRdma | Enable-NetAdapter`
6. Crie adaptadores de rede de VM para as VMs que exigem suporte para VFs do RDMA.
   `Add-VMNetworkAdapter -VMName <vm_name> -VMNetworkAdapterName <device_name> -SwitchName <switch_name>`
7. Para utilizar o Microsoft Windows 10 Creators Update (RS2) ou posterior em uma partição convidada, defina o peso do RDMA em um adaptador de rede de VM, inserindo o seguinte comando no host:
   `Set-VMNetworkAdapterRdma -VMName <vm_name> -VMNetworkAdapterName <device_name> -RdmaWeight 100`
8. Defina o peso do SR-IOV no adaptador de rede VM (Nota: o peso do SR-IOV deve ser definido como 0 antes de definir o RdmaWeight como 0):
   `Set-VMNetworkAdapter -VMName <vm_name> -VMNetworkAdapterName <device_name> -IovWeight 100`
9. Instale o adaptador de rede de VF com o Instalador PROSET na VM.
10. Habilite o RDMA no driver de VF e o adaptador de rede do Hyper-V, usando o PowerShell na VM:
    `Set-NetAdapterAdvancedProperty -Name <device_name> -RegistryKeyword RdmaVfEnabled -RegistryValue 1`
    `Get-NetAdapterRdma | Enable-NetAdapterRdma`

### RDMA para recursos do NDK, como SMB Direct (Server Message Block)

O NDK permite que componentes do Windows (como o armazenamento do SMB Direct) utilizem recursos do RDMA.

#### Testando o NDK: SMB Direct do Microsoft Windows com DiskSPD

Esta seção descreve uma recomendação para testar a funcionalidade e o desempenho do RDMA para Intel® Ethernet nos sistemas operacionais Microsoft Windows.

Convém observar que, como o SMB Direct é uma carga de trabalho de armazenamento, o desempenho do parâmetro de comparação pode estar limitado à velocidade do dispositivo de armazenamento, em vez da interface de rede submetida ao teste. A Intel recomenda usar o armazenamento mais veloz possível para testar as reais capacidades do(s) dispositivo(s) de rede sob teste.

Instruções do teste:

1. Configure e conecte pelo menos dois servidores executando um sistema operacional Microsoft Windows Server compatível, com, no mínimo, um dispositivo Ethernet Intel® por servidor, com capacidade para RDMA.
2. No sistema designado como servidor SMB, configure um compartilhamento SMB. Convém observar que o desempenho do parâmetro de comparação pode estar limitado à velocidade do dispositivo de armazenamento, em vez da interface de rede submetida ao teste. A instalação do armazenamento está fora do âmbito deste documento. Você pode emitir o seguinte comando do PowerShell:
   `New-SmbShare -Name <SMBsharename> -Path <SMBsharefilepath> -FullAccess <domainname>\Administrator,Everyone`
   Por exemplo:
   `New-SmbShare -Name RAMDISKShare -Path R:\RAMDISK -FullAccess group\Administrator,Everyone`
3. Baixe e instale o utilitário Diskspd da Microsoft a partir daqui: https://gallery.technet.microsoft.com/DiskSpd-a-robust-storage-6cd2f223
4. Usando o CMD ou Powershell, passe para o diretório da pasta DiskSpd e execute os testes. (Consulte a documentação do Diskspd para obter mais detalhes sobre os parâmetros)
   Por exemplo: defina o tamanho do bloco em 4 K, execute o teste durante 60 segundos, desabilite todo o cache do hardware e software, avalie e exiba os dados estatísticos da latência, utilize 16 E/Ss sobrepostas e 16 threads por destino, gravações de 0% aleatórias e leituras de 100%, e crie um arquivo de teste de 10 GB em "\\<SMBserverTestIP>\<SMBsharename>\test.dat" :
   `.\diskspd.exe -b4K -d60 -h -L -o16 -t16 -r -w0 -c10G \\<SMBserverTestIP>\<SMBsharename>\test.dat`
5. Verifique se o tráfego do RDMA está operando, usando contadores perfmon, como “RDMA Activity” e “SMB Direct Connection”. Consulte a documentação da Microsoft para obter mais detalhes.

## Suporte técnico

- Site de suporte principal da Intel na web: http://support.intel.com
- Informações sobre produtos de rede: http://www.intel.com/network

## Assuntos legais / Isenções de responsabilidade

Copyright (C) 2019 - 2021, Intel Corporation. Todos os direitos reservados.

A Intel Corporation não assume nenhuma responsabilidade por erros ou omissões neste documento. A Intel também não assume nenhum compromisso de atualizar as informações aqui contidas.

Intel é marca comercial da Intel Corporation nos EUA e/ou em outros países.

*Outras marcas e nomes podem ser propriedade de outras empresas.

Este software é fornecido sob licença e só pode ser usado ou copiado de acordo com os termos da licença. As informações contidas neste manual são fornecidas apenas para fins informativos, estão sujeitas a alterações sem aviso-prévio e não devem ser interpretadas como compromisso da Intel Corporation. A Intel Corporation não assume nenhuma responsabilidade por quaisquer erros ou imprecisões que possam aparecer neste documento ou em qualquer software que possa ser fornecido em associação com este documento. Exceto conforme permitido por tal licença, nenhuma parte deste documento pode ser reproduzida, armazenada em um sistema de recuperação nem transmitida por qualquer meio sem a permissão expressa por escrito da Intel Corporation.