tencent cloud

Cloud Virtual Machine

DPDK를 사용한 테스트

Download
포커스 모드
폰트 크기
마지막 업데이트 시간: 2026-08-07 10:12:53
AI 번역

작업 시나리오

본문은 DPDK 방법을 사용하여 높은 처리량의 CVM 네트워크 성능을 테스트하는 방법을 설명합니다.

작업 단계

단계 1: 환경 준비 및 설치

본 장에서는 DPDK 테스트 환경 구축을 안, 소스 코드 다운로드, 압축 해제, 종속 라이브러리 설치 및 컴파일 과정을 포함합니다.

환경 준비

CVM은 퍼블릭 네트워크 액세스 기능이 필요하며, CVM 생성 시 공용 IP 할당을 선택하거나, CVM 생성 후 탄력적 공용 IP를 구성할 수 있습니다.
CVM에 다수의 NIC가 구성된 경우, eth0을 사용하여 테스트하고 나머지 NIC를 원격 로그인에 사용하는 것을 권장합니다.
해당 작업은 시스템 root 권한이 필요하므로, 사전에 관련 권한을 신청하시기 바랍니다.
다음 작업 안내는 TencentOS 3.0 이상 운영 체제에 적용됩니다.
테스트 서버 2대를 준비하며, 각각 수신단과 송신단으로 구성합니다.
인스턴스 생성 방법은 구매 페이지를 통한 인스턴스 생성을 참고하시기 바랍니다.
인스턴스 로그인 방법은 OrcaTerm 방식을 사용한 Linux 인스턴스 연결(권장)을 참고하시기 바랍니다.

DPDK 소스 코드 패키지를 다운로드하고 압축을 해제합니다

wget 명령어를 사용하여 공식 저장소에서 DPDK 23.11 소스 코드 압축 파일을 다운로드하고 압축을 해제합니다.
설명:
후속 작업은 DPDK 압축 해제 후 디렉터리에서 진행하시기 바랍니다.
wget https://fast.dpdk.org/rel/dpdk-23.11.tar.gz
tar -xf dpdk-23.11.tar.gz
cd dpdk-23.11

종속 라이브러리 설치 및 컴파일

필요한 종속 라이브러리와 컴파일 툴을 설치합니다.
numactl-devel 종속 라이브러리를 설치합니다(root 권한 필요).
yum install numactl-devel -y
Python 빌드 툴을 설치합니다.
pip3 install meson ninja pyelftools
meson을 사용하여 프로젝트를 빌드합니다(최대 논리 코어 수를 1024로 설정).
meson build -Dmax_lcores=1024
ninja를 사용하여 프로젝트를 컴파일합니다.
ninja -C build
주의:
사용 중인 테스트 서버가 표준형 SA4 이후의 인스턴스 유형이며 CPU가 최고 사양인 경우, 특수 시나리오 처리를 참고하여 관련 구성 단계를 추가하시기 바랍니다.

단계 2: 커널 드라이버 모듈 바인딩

DPDK는 전용 커널 드라이버 모듈을 바인딩하여 NIC 기기를 인수해야 합니다.

UIO 모듈 다운로드

DPDK 공식 저장소에서 커널 모듈 코드를 클론합니다.
git clone http://dpdk.org/git/dpdk-kmods
또는 git 프로토콜을 사용합니다(대안).
git clone git://dpdk.org/dpdk-kmods

UIO 모듈 컴파일

igb_uio 디렉터리로 이동하여 컴파일합니다.
cd ./dpdk-kmods/linux/igb_uio
make

UIO 모듈 로딩

uioigb_uio 커널 모듈을 로딩합니다(root 권한 필요).
modprobe uio
insmod ./dpdk-kmods/linux/igb_uio/igb_uio.ko

NIC PCI 주소 쿼리 및 기록

NIC 바인딩 전, 타겟 NIC의 PCI 주소를 획득하고 기록해야 합니다. 다음 명령어를 실행하여 모든 NIC 기기 정보를 확인하고 기록합니다.
ethtool -i eth0 | grep bus-info


NIC를 UIO 드라이버에 바인딩

DPDK가 제공하는 툴을 사용하여 NIC를 igb_uio 드라이버에 바인딩합니다.
1. NIC를 종료합니다.
주의:
NIC를 종료하기 전, 현재 다른 Elastic Network Interface의 IP를 통해 CVM에 원격 로그인 중인지 확인하시기 바랍니다. eth0을 사용하여 원격 로그인 중인 경우 연결이 중단됩니다.
ifconfig eth0 down
2. NIC를 igb_uio 드라이버에 바인딩합니다(실제 PCI 주소로 교체).
./usertools/dpdk-devbind.py --bind=igb_uio 0000:02:01.0 #0000:02:01.0은 실제 NIC PCI 주소로 교체해야 합니다.

단계 3: 대용량 페이지 메모리 구성

DPDK는 메모리 접속 효율을 높이기 위해 대용량 페이지 메모리(Huge Pages)를 사용합니다. 대용량 페이지 메모리 구성은 DPDK 실행의 필수 전제 조건입니다.
다음 명령어를 실행하여 대용량 페이지 메모리를 할당합니다(여기서는 2MB 대용량 페이지를 예로 들어 8192개 페이지를 할당하며, 총 약 16GB입니다).
echo 8192 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

단계 4: 성능 테스트 실행

DPDK 성능 테스트는 RX-TX 이중 서버 모드를 사용합니다. 한 대의 서버는 수신단(RX)으로, 다른 한 대의 서버는 송신단(TX)으로 동작합니다.
설명:
RX는 수신단, TX는 송신단입니다. 두 대의 서버는 각각 해당 명령어를 실행해야 합니다.
RX 수신단 명령어 실행은 다음과 같습니다.
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
TX 송신단 명령어 실행은 다음과 같습니다.
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

매개변수 상세 설명

매개변수
설명
-a 0000:1b:00.0
사용할 NIC의 PCI 주소를 지정하며, 실제 환경에 따라 교체해야 합니다.
--tx-ip S,D
TX 측 패킷 전송의 타겟 IP 주소를 CVM NIC 주소에 따라 교체합니다.
--txonly-multi-flow
멀티플로우 송신 모드를 활성화합니다(설정하지 않으면 단일 플로우만 송신합니다).
--txpkts=64
패킷 길이(바이트, MAC 헤더 포함)이며, PPS 테스트 시나리오에서는 64바이트를 권장합니다.
-l 0-47
사용할 CPU 코어 번호 범위를 지정하며, 필요에 따라 조정합니다. NUMA를 넘는 시나리오에서는 큐의 NUMA 간 분포 확인을 통해 획득할 수 있습니다.
--txq / --rxq = $Q
송신/수신 큐 개수는 ethtool -l eth0 | grep Combined 명령어로 확인할 수 있습니다.
--nb-cores=$C
테스트에 실제로 참여하는 CPU 코어 수이며, 2 ≤ C ≤ Q 범위를 권장합니다.
--stats-period=1
통계 정보를 초당 한 번씩 출력합니다.
테스트 결과 예시는 다음과 같습니다. 왼쪽은 RX 수신단, 오른쪽은 TX 송신단입니다.


단계 5: 테스트 환경 복원

테스트 완료 후, 환경을 초기 상태로 복원하고 리소스를 해제하여 다른 서비스에 영향을 미치지 않도록 하시기 바랍니다.

NIC 드라이버 복원

dpdk-devbind.py 툴을 사용하여 NIC를 기본 드라이버로 복원합니다.
./usertools/dpdk-devbind.py -b virtio-pci 0000:00:08.0 # 참고: 0000:00:08.0은 실제 PCI 주소로 교체해야 합니다.
상기 명령어가 정상적으로 작동하지 않을 경우, 다음 명령어를 수동으로 실행하여 vfio-pci 바인딩을 해제할 수 있습니다.
echo 0000:1b:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind #0000:1b:00.0은 필요에 따라 교체합니다.
echo virtio-pci > /sys/bus/pci/devices/0000\\:1b\\:00.0/driver_override #driver_override를 virtio-pci로 설정합니다.
echo 0000:1b:00.0 > /sys/bus/pci/drivers/virtio-pci/bind #virtio-pci로 다시 바인딩합니다.

대용량 페이지 메모리 복원

대용량 페이지 메모리 수량을 0으로 설정합니다.
echo 0 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
NIC를 다시 활성화합니다.
ifconfig eth1 up

특수 시나리오 처리

사용 중인 테스트 서버가 표준형 SA4 이후의 인스턴스 유형이며 CPU가 최고 사양인 경우, 다음 구성 단계를 추가해야 합니다.

큐 NUMA 간 분포 확인

설명:
다중 CPU 서버의 경우, DPDK가 사용하는 CPU 코어와 NIC가 동일한 NUMA 노드에 위치하도록 보장해야 합니다. 그렇지 않으면 성능이 크게 저하됩니다.
1. 스크립트 다운로드 및 확인
wget https://lag-dpdk-1326316016.cos.ap-guangzhou.myqcloud.com/dpdk_core_advisor.sh
2. 크로스 큐 NUMA 분포 스크립트 실행 및 확인
sh dpdk_core_advisor.sh eth0
반환된 결과에 큐가 NUMA를 가로질러 분포되어 있음이 표시될 경우, lag_dpdk.patch를 설치하시기 바랍니다.

lag_dpdk.patch 설치

1. lag_dpdk.patch 패치 스크립트를 다운로드합니다.
wget https://lag-dpdk-1326316016.cos.ap-guangzhou.myqcloud.com/lag_dpdk.patch
2. 패치를 적용합니다.
git apply lag_dpdk.patch
# 동등한 명령어(둘 중 하나만 선택 가능)
patch -p1 < lag_dpdk.patch
3. 다시 컴파일합니다.
meson build -Dmax_lcores=1024
ninja -C build



도움말 및 지원

문제 해결에 도움이 되었나요?

피드백