R&D/DPDK

DPDK 빌드

sunshout 2014. 3. 26. 13:56

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 설치

  • 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