安裝dpdk html
官方URL https://github.com/iqiyi/dpvsnode
dpdk-17.05.2能夠兼容dpvs
wget https://fast.dpdk.org/rel/dpdk-17.05.2.tar.xz
tar vxf dpdk-17.05.2.tar.xzlinux
下載dpvs
git clone https://github.com/iqiyi/dpvs.gitgit
給dpdk打補丁,加入kni驅動
cd <path-of-dpvs>
cp patch/dpdk-stable-17.05.2/*.patch dpdk-stable-17.05.2/
cd dpdk-stable-17.05.2/
patch -p 1 < 0001-PATCH-kni-use-netlink-event-for-multicast-driver-par.patchgithub
另外一個補丁,uoa模塊
patch -p1 < 0002-net-support-variable-IP-header-len-for-checksum-API.patch算法
編譯dpdk並安裝
cd dpdk-stable-17.05.2/
make config T=x86_64-native-linuxapp-gcc
make
export RTE_SDK=$PWD後端
啓動hugepage
服務器是numa系統(centos)
echo 8192 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 8192 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepagescentos
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge服務器
注:這個操做是臨時的,若是服務器有別的應用再跑,可能已經佔用hugepage了,後面給出另外的方法網絡
安裝uio驅動,並綁定網卡
modprobe uio
cd dpdk-stable-17.05.2
insmod build/kmod/igb_uio.ko
insmod build/kmod/rte_kni.ko
查看網卡狀態 ./usertools/dpdk-devbind.py --status
Network devices using kernel driver
===================================
0000:01:00.0 'I350 Gigabit Network Connection 1521' if=eth0 drv=igb unused=
0000:01:00.1 'I350 Gigabit Network Connection 1521' if=eth1 drv=igb unused=
0000:01:00.2 'I350 Gigabit Network Connection 1521' if=eth2 drv=igb unused=
0000:01:00.3 'I350 Gigabit Network Connection 1521' if=eth3 drv=igb unused=
綁定eth2
./usertools/dpdk-devbind.py -b igb_uio 0000:01:00.2
注:這裏綁定的網卡,最好是沒有使用的,由於網卡須要down 掉才能綁
編譯dpvs
cd dpdk-stable-17.05.2/
export RTE_SDK=$PWD
cd <path-of-dpvs>
make
make install
注:安裝的時候 可能有依賴包報錯,提示哪一個,yum安裝就能夠了
編譯後的文件
ls bin/
dpip dpvs ipvsadm keepalived
啓動dpvs
cp conf/dpvs.conf.single-nic.sample /etc/dpvs.conf
cd <path-of-dpvs>/bin
./dpvs &
查看是否啓動正常
./dpip link show
1: dpdk0: socket 0 mtu 1500 rx-queue 8 tx-queue 8
UP 10000 Mbps full-duplex fixed-nego promisc-off
addr A0:36:9F:9D:61:F4 OF_RX_IP_CSUM OF_TX_IP_CSUM OF_TX_TCP_CSUM OF_TX_UDP_CSUM
以DR模式舉例
官方URL https://github.com/iqiyi/dpvs/blob/master/doc/tutorial.md ,各類lvs模式配置
給dpvs添加lan ip 37,這個步驟必須在添加vip以前
./dpip addr add 192.168.1.37/24 dev dpdk0
給dpvs添加vip 57
./dpip addr add 192.168.1.57/32 dev dpdk0
設置算法爲rr,vip爲57
./ipvsadm -A -t 192.168.1.57:80 -s rr
添加後端機器11
./ipvsadm -a -t 192.168.1.57:80 -r 192.168.1.11 -g
在11機器執行
ip addr add 192.168.1.11/32 dev lo
sysctl -w net.ipv4.conf.lo.arp_ignore=1
dpvs在啓動的時候,有時候 會報錯,罪魁禍首是內存碎片,app沒法申請到足夠多的連續大塊內存,只能申請到不少小塊內存。以致於內存塊數目超過了系統設置的256個。
解決方式 就是申請大頁內存應該在系統啓動時,或系統啓動後儘快申請,避免內存被割裂
https://www.cnblogs.com/cobbliu/p/6603391.html
爲了省事 能夠加入到kernel參數 /etc/boot/grub2.cfg
default_hugepagesz=1G hugepagesz=1G hugepages=8G
引用別人的結論:
結論:DPDK 再快也是收包到送給應用層的時間短,而不是「轉發」快。收到包後,各種檢查跟查表(通常都是併發環境,加鎖啊什麼的,無鎖?……哈哈)處理的時間,基本上都是要遠遠超過 DPDK 的自身開銷的。
想要快過 Linux,要明白爲何 Linux 網絡協議棧會「慢」,這個慢是相比 DPDK 的處理而言的,對大部分應用而言,上層的業務延遲已經沒多大必要在網絡方面下功夫。總之,可否下降路有延遲,要看應用環境(買得起那麼多物理機麼?有相應的穩定可靠人才支撐麼?),而後再作 profiling,看瓶頸在哪裏。不要想固然的 DPDK。
舉例來講吧,作 UDP 的 DNS,就能夠用 DPDK,繞過 Linux 協議棧提高 QPS. 若是作路由,我以爲拼不過硬件,我是不贊同這種作法的。爲了低延遲,沒有包的時候,DPDK 都要讓 CPU 滿載跑着,這時若是想提高吞吐量,延遲也會跟着上去。若是系統裏邊是多個幹活程序一塊兒跑的,老闆窮或者不捨得買好機器,開發運維技能沒跟着上去,DPDK 也會被用殘的。
硬件差很少,網絡 IO+內存類的程序,Linux 跑萬兆是沒問題的。
若是作包轉發,相比 x86 linux 確定會大大提高性能,其實大部分瓶頸不在 dpdk 處理的網絡這塊