DPDK 개요
Prerequisite
- HPET (High Precision Event Timer)
- Clock Event Device 가 hpet 면,
- DPDK 빌드시 CONFIG_RTE_LIBEAL_USE_HPET=y 옵션을 사용할 수 있다.
root@ubuntu:~# grep hpet /proc/timer_list Clock Event Device: hpet set_next_event: hpet_legacy_next_event set_mode: hpet_legacy_set_mode
- Huge Page 지원 여부
- 4K 이상의 page를 지원하기 위해서는 CPU에서 지원을 하여야 한다
- pse (Page Size Extention): 2M huge page
- pse36 : 4M Huge page
- pdpe1gb : 1G Huge page
- 아래 예제는 pse, pse36만 지원함을 의미함
root@ubuntu:~/dpdk# grep pse /proc/cpuinfo | uniq flags : fpu vme de pse ... root@ubuntu:~/dpdk# grep pse36 /proc/cpuinfo | uniq flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 ... root@ubuntu:~/dpdk# grep pdpe1gb /proc/cpuinfo | uniq root@ubuntu:~/dpdk#
DPDK Build
- 빌드 옵션
- 다양한 컴파일러 지원: icc 또는 gcc
- 다양한 플랫폼 지원 : linux 또는 bsd
- 위 빌드 옵션은 ${DPDK}/config/ 디렉토리 밑에 존재
- 아래 예제는 linux에서 gcc를 사용하는 DPDK에 대한 빌드 방법
root@ubuntu:~# git clone git://dpdk.org/dpdk root@ubuntu:~# cd dpdk
- enable HPET (edit ${DPDK}/config/defconfig_x86_64-default-linuxapp-gcc )
... CONFIG_RTE_LIBEAL_USE_HPET=y ...
- DPDK 컴파일
root@ubuntu:~/dpdk# make install T=x86_64-default-linuxapp-gcc
- DPDK 컴파일 (Ver 1.7 ~)
- 아래의 예제 중 default -> native로 변경해서 수행하면 됨
export RTE_SDK=/root/dpdk
export RTE_TARGET=x86_64-native-linuxapp-gcc
root@ubuntu:~/dpdk# make install T=x86_64-native-linuxapp-gcc DESTDIR=install
DPDK 설치
- 아래의 예제 중 default -> native로 변경해서 수행하면 됨
export RTE_SDK=/root/dpdk
export RTE_TARGET=x86_64-native-linuxapp-gcc
root@ubuntu:~/dpdk# make install T=x86_64-native-linuxapp-gcc DESTDIR=install
- DPDK를 사용하기 위해서는 두 개의 커널 모듈이 로드되어야 한다(uio, igb_uio)
root@ubuntu:~/dpdk# modprobe uio root@ubuntu:~/dpdk# insmod x86_64-default-linuxapp-gcc/kmod/igb_uio.ko
Huge Page 설정
- DPDK application을 동작 시키기 위해서는 사전에 hugepage 설정이 필요하다.
root@ubuntu:~/dpdk# vi /etc/default/grub
/etc/default/grub 설정 파일
- 여러 종류의 hugepage size를 지원할 경우, hugepagesz를 지정하여야 한다.
GRUB_CMDLINE_LINUX_DEFAULT="hugepages=1024"
또는
GRUB_CMDLINE_LINUX_DEFAULT="default_hugepagesz=2M hugepagesz=2M hugepages=1024"
grub update
root@ubuntu:~/dpdk# update-grub
CentOS에서는
grub2-mkconfig -o /boot/grub2/grub.cfg
- hugepage 설정을 마치고 나면, filesystem에 마운트를 하여야 한다
root@ubuntu:~/dpdk# mkdir /hugepage
root@ubuntu:~/dpdk# vi /etc/fstab
/etc/fstab 수정
nodev /hugepage hugetlbfs defaults 0 0
리부팅...
또는
$ echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages$ mount -t hugetlbfs nodev /hugepage
DPDK kernel module 로드
- DPDK application를 사용하기 위해서는 두 개의 커널 모듈이 로드되어야 한다(uio, igb_uio)
root@ubuntu:~/dpdk# modprobe uio
igb_uio.ko 모듈 로드(위에서 DPDK 를 빌드하고 kmod 디렉토리에 igb_uio.ko 커널 모듈이 생성됨)
root@ubuntu:~/dpdk# insmod x86_64-default-linuxapp-gcc/kmod/igb_uio.ko
커널 모듈 로드가 끝나면, 어떤 장치(NIC)을 사용할 것인지를 지정하여야 한다.
실제 동작은 해당 PCI 장치의 device driver 를 igb_uio를 변경하는 것이다. (아래 예제는 p2p1 NIC을 DPDK로 사용한다는 것이다)
root@ubuntu:~/dpdk# ./tools/igb_uio_bind.py --bind=igb_uio p2p1
cf) after DPDK 1.7, igb_uio_bind.py file is changed to dpdk_nic_bind.py