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
root@ubuntu:~# make config T=x86_64-default-linuxapp-gcc
root@ubuntu:~# make
Virtio DPDK Build
root@ubuntu:~# cd ~
root@ubuntu:~# wget http://dpdk.org/browse/virtio-net-pmd/snapshot/virtio-net-pmd-1.2.tar.gz
root@ubuntu:~# tar zxvf virtio-net-pmd-1.2.tar.gzroot@ubuntu:~# cd virtio-net-pmd-1.2root@ubuntu:~# make RTE_INCLUDE=../dpdk/build/include
root@ubuntu:~# make install
Huge Page 설정
- DPDK application을 동작 시키기 위해서는 사전에 hugepage 설정이 필요하다.
root@ubuntu:~/dpdk# vi /etc/default/grub
/etc/default/grub 설정 파일
GRUB_CMDLINE_LINUX_DEFAULT="hugepages=1024"
grub update
root@ubuntu:~/dpdk# update-grub
- hugepage 설정을 마치고 나면, filesystem에 마운트를 하여야 한다
root@ubuntu:~/dpdk# mkdir /hugepage
root@ubuntu:~/dpdk# vi /etc/fstab
/etc/fstab 수정
nodev /hugepage hugetlbfs defaults 0 0
리부팅...
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