安装dpdk
官方URL https://github.com/iqiyi/dpvs
dpdk-17.05.2可以兼容dpvs
wget https://fast.dpdk.org/rel/dpdk-17.05.2.tar.xz
tar vxf dpdk-17.05.2.tar.xz
下载dpvs
git clone https://github.com/iqiyi/dpvs.git
给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.patch
另一个补丁,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_hugepages
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 处理的网络这块