# 인텔 이더넷 장치용 원격 직접 메모리 액세스(RDMA)

RDMA(Remote Direct Memory Access)를 사용하면 네트워크 장치가 다른 시스템의 애플리케이션 메모리로 직접 데이터를 전송할 수 있어 처리량이 증가하고 특정 네트워킹 환경에서 지연이 감소합니다.

- 인텔® 이더넷 컨트롤러 800 시리즈 장치는 iWARP와 RoCEv2를 모두 지원합니다.
- 인텔® 이더넷 컨트롤러 X722 시리즈 장치는 iWARP만 지원합니다.

주요 차이점은 iWARP는 TCP에서 RDMA를 수행하고, RoCEv2는 UDP를 사용한다는 점입니다.

드롭된 패킷으로 인한 성능 저하를 피하기 위해, 모든 네트워크 인터페이스와 스위치에서 링크 수준 흐름 제어 또는 우선순위 흐름 제어를 활성화하십시오.

| 참고: Microsoft* Windows Server* 운영체제를 실행하는 시스템에서 *QoS/우선순위 흐름 제어를 활성화하면 링크 수준 흐름 제어가 비활성화됩니다. 포트 수가 4개가 넘는 멀티포트 모드에서 작동할 경우에는 인텔® 이더넷 컨트롤러 800 시리즈 기반 장치가 RDMA를 지원하지 않습니다. Linux* 시스템에서 RDMA와 본딩은 호환되지 않습니다. RDMA가 활성화되면 본딩이 작동하지 않습니다.

## Linux의 RDMA

이러한 기본 Linux RDMA 설치 지침은 다음 장치에 적용됩니다.

- 인텔® 이더넷 컨트롤러 800 시리즈
- 인텔® 이더넷 컨트롤러 X722 시리즈

자세한 설치 및 구성 정보는 RDMA를 지원하는 인텔 이더넷 장치용 드라이버 tarball의 Linux RDMA 드라이버 README 파일을 참조하십시오.

이 예제는 Red Hat* Enterprise Linux*에 한정됩니다. 운영 체제의 세부 사항은 다를 수 있습니다.

1. RDMA 드라이버 tarball의 압축을 풉니다. 예를 들면 다음과 같습니다.
   `# tar zxf irdma-<x.x.x>.tar.gz`
2. RDMA PF 드라이버를 설치합니다. 예를 들면 다음과 같습니다.
   `# cd irdma-<x.x.x>
   # ./build.sh
   # modprobe irdma`

   | 참고: 기본으로 irdma 드라이버가 iWARP 모드로 로드됩니다. 포트당 RoCEv2를 활성화하기 위해 devlink 인터페이스를 사용합니다. RoCEv2 모드의 모든 irdma 포트를 로드하려면 다음을 수행하십시오. `# modprobe irdma roce_ena=1`

3. 이전에 설치된 rdma-core 버전을 제거합니다.
   `# yum erase rdma-core`
4. GitHub에서 rdma-core 라이브러리 tarball을 다운로드합니다. 예를 들면 다음과 같습니다.
   `# wget https://github.com/linux-rdma/rdma-core/releases/download/v27.0/rdma-core-27.0.tar.gz`

   | 참고: 드라이버에 포함된 libirdma 패치 파일 버전과 일치하는 rdma-core 버전을 다운로드하십시오. 예를 들어, `libirdma-core-27.0.patch`는 `rdma-core-27.0.tar.gz`가 필요합니다.

5. rdma-core tarball를 압축을 풀고 패치를 적용한 후 사양 파일의 그룹을 변경합니다. 예를 들면 다음과 같습니다.
   `# tar -xzvf rdma-core-<version>.tar.gz
   # cd rdma-core-<version>
   # patch -p2 <<path-to-component-build>/libirdma-<version>.patch
   # cd ..
   # chgrp -R root <path-to-rdma-core>/redhat
   # tar -zcvf rdma-core-<version>.tgz rdma-core-<version>`
6. rdma-core-intel 사용자 공간 라이브러리를 설치합니다. 예를 들면 다음과 같습니다.
   `# 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. 어댑터에서 흐름 제어를 활성화합니다. 링크 수준 또는 우선순위 흐름 제어를 활성합니다. 우선순위 흐름 제어를 사용하는 것이 좋습니다. 흐름 제어에 대한 자세한 정보는 Linux RDMA 드라이버 README를 참조하십시오.
8. 시스템이 연결된 스위치에서 흐름 제어를 활성화합니다. 자세한 내용은 스위치 설명서를 참조하십시오.

## FreeBSD*의 RDMA

FreeBSD RDMA 드라이버는 다음 장치 시리즈에서 사용할 수 있습니다.

장치 | 기본 드라이버 이름 | RDMA 드라이버 이름 | 지원되는 프로토콜
인텔® 이더넷 컨트롤러 800 시리즈 | ice | irdma | RoCEv21, iWARP
인텔® 이더넷 컨트롤러 X722 시리즈 | ixl | iw_ixl | iWARP

1 제한적 지원: 기능 테스트만 해당됩니다. DCB 및 우선순위 흐름 제어(PFC)는 현재 지원되지 않습니다.

다음 지침은 각 장치 시리즈에 대한 기본 FreeBSD RDMA 설치에 대한 안내입니다. 자세한 설치 및 구성 정보는 FreeBSD RDMA 드라이버 tarball의 README 파일을 참조하십시오.

인텔® 이더넷 컨트롤러 800 시리즈:

1. 기본 드라이버와 RDMA 드라이버의 압축을 풉니다. 예를 들면 다음과 같습니다.`
   # tar -xf iw_ixl-<version>.tar.gz
   # tar -xf irdma-<version>.tar.gz`
2. 기본 드라이버를 설치합니다. 예를 들면 다음과 같습니다.
   `# cd ice-<version>/ directory
   # make
   # make install`
3. RDMA 드라이버를 설치합니다. 예를 들면 다음과 같습니다.
   `# cd irdma-<version>/src
   # make clean
   # make ICE_DIR=$PATH_TO_ICE/ice-<version>/
   # make install`

   | 참고: 기본적으로 irdma 드라이버가 iWARP 모드로 로드됩니다. RoCEv2 모드에서 irdma 포트를 로드하려면 `<port>`가 RoCEv2 모드를 활성화하는 `/boot/loader.conf`에 다음 줄을 추가한 뒤 재부팅합니다. `dev.irdma<port>.roce_enable=1` 예를 들어 ICE1에서 RoCEv2 모드 활성화 방법: `dev.irdma1.roce_enable=1`

4. 흐름 제어를 활성화합니다.
   `# sysctl dev.ice.<interface_num>.fc=3`
5. 시스템이 연결된 스위치에서 흐름 제어를 활성화합니다. 자세한 내용은 스위치 설명서를 참조하십시오.

인텔® 이더넷 컨트롤러 X722 시리즈:

1. 기본 드라이버와 RDMA 드라이버의 압축을 풉니다. 예를 들면 다음과 같습니다.`
   # tar -xf ixl-<version>.tar.gz
   # tar -xf iw_ixl-<version>.tar.gz`
2. 기본 드라이버를 설치합니다. 예를 들면 다음과 같습니다.
   `# cd ixl-<version>/src directory
   # make
   # make install`
3. RDMA 드라이버를 설치합니다. 예를 들면 다음과 같습니다.
   `# cd iw_ixl-<version>/src
   # make clean
   # make IXL_DIR=$PATH_TO_IXL/ixl-<version>/src
   # make install`
4. 흐름 제어를 활성화합니다.
   `# sysctl dev.ixl.<interface_num>.fc=3`
5. 시스템이 연결된 스위치에서 흐름 제어를 활성화합니다. 자세한 내용은 스위치 설명서를 참조하십시오.

## Microsoft Windows* ND(Network Direct) 사용자 모드 애플리케이션용 RDMA

ND(Network Direct)는 사용자 모드 애플리케이션에 의한 RDMA 기능 사용을 허용합니다.

| 참고: 사용자 모드 애플리케이션은 Microsoft HPC Pack 또는 Intel MPI Library와 같은 전제 조건을 가질 수도 있습니다. 자세한 내용은 애플리케이션 문서를 참조하십시오.

### RDMA 사용자 모드 설치

Intel® Ethernet User Mode RDMA Provider는 Microsoft Windows Server 2012 R2 이상에서 지원됩니다.

사용자 모드 ND(Network Direct) 기능을 설치하려면 아래 단계를 따르십시오.

1. 설치 매체에서 Autorun.exe를 실행하여 설치 프로그램을 시작한 후 "Install Drivers and Software(드라이버와 소프트웨어 설치)"를 선택하고 라이센스 계약을 수락합니다.
2. Setup Options(설정 옵션) 화면에서 "Intel® Ethernet User Mode RDMA Provider"를 선택합니다.
3. 원하는 경우 RDMA Configuration Options(RDMA 구성 옵션) 화면에서 "Enable RDMA routing across IP Subnets(IP 서브넷에서 RDMA 라우팅 사용)"을 선택합니다. 이 옵션은 Network Direct Kernel 기능에도 적용될 수 있으므로 사용자 모드 RDMA가 선택되어 있지 않아도 기본 드라이버 설치 도중 표시된다는 점에 유의하십시오.
4. Windows 방화벽이 설치되어 있고 활성 상태이면 "Create an Intel® Ethernet RDMA Port Mapping Service rule in Windows Firewall(Windows 방화벽에서 인텔® 이더넷 RDMA 포트 매핑 서비스 규칙 만들기)"와 해당 규칙을 적용할 네트워크를 선택합니다.

   | 참고: Windows 방화벽이 비활성화되어 있거나 타사 방화벽을 사용 중이면 수동으로 이 규칙을 추가해야 합니다.

5. 드라이버 및 소프트웨어 설치를 진행하십시오.

## RDMA NDK(Network Direct Kernel)

RDMA NDK(Network Direct Kernel) 기능은 인텔 기반 네트워킹 드라이버에 포함되며 추가적인 기능을 설치할 필요가 없습니다.

## IP 서브넷에서 RDMA 라우팅

서브넷에서 NDK의 RDMA 기능을 허용하려면 기본 드라이버 설치 도중 RDMA Configuration Options 화면에서 "Enable RDMA routing across IP Subnets(IP 서브넷에서 RDMA 라우팅 활성화)"를 선택해야 합니다.

## Microsoft Windows Server 운영체제에서 우선순위 흐름 제어(PFC) 활성화

드롭된 패킷으로 인한 성능 저하를 피하기 위해, 모든 네트워크 인터페이스와 스위치에서 우선순위 흐름 제어(PFC) 또는 링크 수준 흐름 제어를 활성화하십시오.

| 참고: Microsoft* Windows Server* 운영 체제를 실행하는 시스템에서 *QoS/우선순위 흐름 제어를 활성화하면 링크 수준 흐름 제어가 비활성화됩니다.

다음 PowerShell 명령을 사용하여 Microsoft Windows Server 운영체제에서 PFC 활성화:

`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"`

## Microsoft PowerShell*을 사용한 RDMA 작동 검증

다음 Microsoft PowerShell 명령을 사용하여 네트워크 인터페이스에서 RDMA가 활성화되어 있는지 확인할 수 있습니다.

`Get-NetAdapterRDMA`

네트워크 인터페이스가 RDMA를 지원하고 멀티채널이 활성화되어 있는지 확인하려면 다음 PowerShell 명령을 사용합니다.

`Get-SmbClientNetworkInterface`

Network Direct가 운영 체제에서 활성화되어 있는지 확인하려면 다음 PowerShell 명령을 사용합니다.

`Get-NetOffloadGlobalSetting | Select NetworkDirect`

각 RDMA 지원 네트워크 인터페이스가 포트 445에 리스너를 가지고 있는지 확인하려면 netstat를 사용합니다(RDMA를 지원하는 Windows Client OS가 리스너를 게시하지 않을 수도 있음). 예를 들면 다음과 같습니다.

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

## 가상화된 환경용 RDMA

VMSwitch에 연결된 가상 어댑터에서 RDMA 기능을 활성화하려면, SRIOV(Single Root IO Virtualization)와 VMQ(Virtual Machine Queues) 고급 속성이 각 포트에서 활성화되어 있어야 합니다. 특정 상황에서 이러한 설정은 기본적으로 비활성화되었을 수 있습니다. 이러한 옵션은 어댑터 속성 대화 상자의 고급 탭에서 수동으로 또는 다음 Powershell 명령을 사용해서 설정할 수 있습니다.

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

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

### RDMA 게스트 지원 구성(NDK 모드 3)

NDK 모드 3을 사용하면 커널 모드 Windows 구성 요소가 Hyper-V 게스트 파티션 내에서 RDMA 기능을 사용할 수 있습니다. 인텔 이더넷 장치에서 NDK 모드 3을 활성화하려면 다음 절차를 따르십시오.

1. 시스템 BIOS 또는 uEFI에서 SR-IOV를 활성화합니다.
2. 장치에서 SR-IOV 고급 설정을 활성화합니다.
3. 동일한 장치의 모든 물리 기능에 대해 다음 작업을 수행하여 장치에 바운드된 VMSwitch에서 SR-IOV를 활성화합니다
   `New-VMSwitch -Name <switch_name> -NetAdapterName <device_name>`
   `-EnableIov $true`
4. “RdmaMaxVfsEnabled" 고급 설정을 설정하여 장치에서 RDMA 가상 기능(VF) 수를 구성합니다. 모든 물리 기능은 동일한 값으로 설정해야 합니다. 값은 전체 장치에 대해 한 번에 RDMA가 가능한 최대 VF 수입니다. 더 많은 VF를 활성화하면 물리 기능(PF)과 다른 VF에서 RDMA 리소스가 제한됩니다.
   `Set-NetAdapterAdvancedProperty -Name <device_name> -RegistryKeyword RdmaMaxVfsEnabled -RegistryValue <Value: 0 ? 32>`
5. 호스트에서 모든 PF 어댑터를 비활성화했다가 다시 활성화합니다. 이 작업은 레지스트리 키워드 "RdmaMaxVfsEnabled"가 변경되었거나 VMSwitch를 생성 또는 파괴할 때 필요합니다.
   `Get-NetAdapterRdma | Disable-NetAdapter`
   `Get-NetAdapterRdma | Enable-NetAdapter`
6. RDMA VF 지원이 필요한 VM에 대해 VM 네트워크 어댑터를 생성합니다.
   `Add-VMNetworkAdapter -VMName <vm_name> -VMNetworkAdapterName <device_name> -SwitchName <switch_name>`
7. 게스트 파티션에서 Microsoft Windows 10 Creators Update(RS2) 이상을 사용하려는 경우에는 호스트에서 다음 명령을 입력하여 VM Network Adapter에서의 RDMA 가중치를 설정하십시오.
   `Set-VMNetworkAdapterRdma -VMName <vm_name> -VMNetworkAdapterName <device_name> -RdmaWeight 100`
8. VM 네트워크 어댑터에서 SR-IOV 가중치를 설정합니다(참고: RdmaWeight를 0으로 설정하기 전에 SR-IOV 가중치를 0으로 설정해야 함).
   `Set-VMNetworkAdapter -VMName <vm_name> -VMNetworkAdapterName <device_name> -IovWeight 100`
9. VM에 PROSET Installer와 함께 VF 네트워크 어댑터를 설치합니다.
10. VM에서 PowerShell을 사용하여 VF 드라이버와 Hyper-V 네트워크 어댑터의 RDMA를 활성화합니다.
    `Set-NetAdapterAdvancedProperty -Name <device_name> -RegistryKeyword RdmaVfEnabled -RegistryValue 1`
    `Get-NetAdapterRdma | Enable-NetAdapterRdma`

## NDK용 RDMA 기능. 예: SMB Direct(Server Message Block)

NDK는 Windows 구성 요소(예: SMB Direct 스토리지)가 RDMA 기능을 사용할 수 있도록 지원합니다.

### NDK 테스트: DiskSPD 포함 Microsoft Windows SMB Direct

이 섹션에서는 RDMA 테스트를 통해 인텔 이더넷 기능을 확인하는 권장 방법과 Microsoft Windows 운영 체제에서의 성능에 대해 간략히 설명합니다.

SMB Direct는 스토리지 워크로드이므로 벤치마크의 성능이 테스트 대상 네트워크 인터페이스가 아닌 스토리지 장치의 속도로 제한될 수도 있다는 점에 유의하십시오. 인텔에서는 테스트 대상 네트워크 장치의 진정한 성능을 테스트할 수 있도록 가능한 한 가장 빠른 스토리지를 사용하도록 권장합니다.

테스트 지침:

1. 적어도 하나의 RDMA 지원 인텔® 이더넷 장치가 서버에 있는 상태에서, 지원되는 Microsoft Windows 운영 체제가 실행되는 2개 이상의 서버를 설정하고 연결합니다.
2. SMB 서버로 지정된 시스템에서 SMB 공유를 설정합니다. 벤치마크의 성능이 테스트 대상 네트워크 인터페이스가 아닌 스토리지 장치의 속도로 제한될 수도 있다는 점에 유의하십시오. 스토리지 설정은 이 문서의 범위를 벗어납니다. 다음 PowerShell 명령을 사용할 수 있습니다.
   `New-SmbShare -Name <SMBsharename> -Path <SMBsharefilepath> -FullAccess <domainname>\Administrator,Everyone`
   예를 들면 다음과 같습니다.
   `New-SmbShare -Name RAMDISKShare -Path R:\RAMDISK -FullAccess group\Administrator,Everyone`
3. Diskspd Microsoft 유틸리티를 https://gallery.technet.microsoft.com/DiskSpd-a-robust-storage-6cd2f223에서 다운로드해서 설치합니다.
4. CMD 또는 Powershell을 사용하여 DiskSpd 폴더로 이동하고 테스트를 실행합니다. (매개변수에 대한 자세한 내용은 Diskspd 문서를 참조하십시오)
   예: 블록 크기를 4K로 설정하고, 60초 동안 테스트를 실행하며, 모든 하드웨어 및 소프트웨어 캐싱을 비활성화하고 지연 시간 통계를 측정 및 표시합니다. 타겟당 16개의 오버랩된 IO 및 16개의 스레드를 활용하고, "\\<SMBserverTestIP>\<SMBsharename>\test.dat"에서 임의로 0% 쓰기 및 100% 읽기와 테스트 파일 10GB를 생성합니다.
   `.\diskspd.exe -b4K -d60 -h -L -o16 -t16 -r -w0 -c10G \\<SMBserverTestIP>\<SMBsharename>\test.dat`
5. RDMA 트래픽이 “RDMA Activity” 및 “SMB Direct Connection”과 같은 perfmon 카운터를 사용해서 실행되고 있는지 확인합니다. 자세한 내용은 Microsoft 문서를 참조하십시오.

## 고객 지원

- 기본 인텔 웹 지원 사이트: http://www.intel.com/p/ko_KR/support/
- 네트워크 제품 정보: https://www-ssl.intel.com/content/www/kr/ko/communications/network-transformation.html

## 법률 / 고지 사항

Copyright (C) 2019 ? 2021, 인텔사. 모든 권한은 인텔사에 있습니다.

인텔사는 이 문서의 오류나 누락에 대한 책임을 지지 않습니다. 인텔은 여기에 수록된 정보를 업데이트한다는 약속을 하지 않습니다.

인텔은 미국 및/또는 기타 국가에서 인텔사의 상표입니다.

*다른 이름과 브랜드는 다른 회사의 소유일 수 있습니다.

본 소프트웨어는 라이센스 하에서 공급되며 라이센스 계약 내용에 따라서만 사용하거나 복사할 수 있습니다. 본 설명서의 정보는 정보 제공 목적으로만 제공되며 예고 없이 바뀔 수 있습니다. 또한 이 정보를 인텔사에서 확인한 내용으로 간주해서는 안 됩니다. 인텔사는 본 문서 또는 본 문서와 관련하여 제공되었을 수 있는 소프트웨어에 나타날 수 있는 오류나 부정확성에 대한 책임을 지지 않습니다. 해당 라이센스에서 허용하는 경우를 제외하고 인텔사의 명시적인 서면 동의 없이는 어떠한 수단으로도 본 문서의 어떠한 부분도 재생산하거나 검색 시스템에 저장하거나 전송하면 안 됩니다.