在部署openstack的官方文檔(最近幾個版本)中的neutron組件默認(rèn)使用的是linux bridge來做網(wǎng)橋盆佣,除直接使用提供者網(wǎng)絡(luò)(provider network)以外,網(wǎng)絡(luò)節(jié)點的負載會比較大编饺,所有的外部網(wǎng)絡(luò)通信流量都要走網(wǎng)絡(luò)節(jié)點求豫,于是就看了看Juno版本以后增加的 DVR(分布式虛擬路由器)葫录,有了 DVR 之后剧董,路由變成了分布式,每個計算節(jié)點上面都可以做路由茫负,東西向流量直接通過計算節(jié)點路由而不需要經(jīng)過網(wǎng)絡(luò)節(jié)點蕉鸳,F(xiàn)loating IP 也是在計算節(jié)點上面實現(xiàn)的,對于有 floating IP 的 VM 訪問公網(wǎng)忍法,直接走計算節(jié)點上面的路由器出去潮尝,對于沒有 floating IP 的 VM 訪問公網(wǎng)才會從網(wǎng)絡(luò)節(jié)點的路由器 SNAT 出去。
看來看去饿序,想起來幾年前勉失,我比較熟悉的OVS(Open vSwitch),于是打開官網(wǎng)看了看原探,更新還真不少乱凿,搞出來了個OVN,OVN 是 OVS 的控制平面踢匣,它給 OVS 增加了對虛擬網(wǎng)絡(luò)的原生支持告匠,用在openstack上的話,相當(dāng)于它干了大部分以前neutron agent干的活离唬,計算節(jié)點不在需要部署neutron agent了后专,OVN全搞定,neutron只需要調(diào)用OVN的北向接口输莺,其它的事都交給OVN來搞定戚哎,應(yīng)該說是徹底解放了neutron,具體的安裝配置可以參考:https://docs.openstack.org/networking-ovn/latest/嫂用。
在看OVS文檔過程中型凳,看到了一個DPDK的東東,完全不懂嘱函,于是就研究一下甘畅,在這里把整個過程記錄下來,和大家分享一下。
DPDK
DPDK(Data Plane Development Kit)疏唾,是一組快速處理數(shù)據(jù)包的開發(fā)平臺及接口蓄氧,運行于Intel X86平臺上(最新版本也開始支持PowerPC和ARM)。
在X86結(jié)構(gòu)中槐脏,處理數(shù)據(jù)包的傳統(tǒng)方式是CPU中斷方式喉童,既網(wǎng)卡驅(qū)動接收到數(shù)據(jù)包后通過中斷通知CPU處理,然后由CPU拷貝數(shù)據(jù)并交給協(xié)議棧顿天。在數(shù)據(jù)量大時堂氯,這種方式會產(chǎn)生大量CPU中斷,導(dǎo)致CPU無法運行其他程序牌废。而DPDK則采用輪詢方式實現(xiàn)數(shù)據(jù)包處理過程:DPDK重載了網(wǎng)卡驅(qū)動咽白,該驅(qū)動在收到數(shù)據(jù)包后不中斷通知CPU,而是將數(shù)據(jù)包通過零拷貝技術(shù)存入內(nèi)存畔规,這時應(yīng)用層程序就可以通過DPDK提供的接口局扶,直接從內(nèi)存讀取數(shù)據(jù)包。這種處理方式節(jié)省了CPU中斷時間叁扫、內(nèi)存拷貝時間三妈,并向應(yīng)用層提供了簡單易行且高效的數(shù)據(jù)包處理方式,使得網(wǎng)絡(luò)應(yīng)用的開發(fā)更加方便莫绣。但是DPDK需要網(wǎng)卡支持畴蒲,目前以intel的網(wǎng)卡為主,想要知道您的網(wǎng)卡是否支持对室,可以到DPDK的官網(wǎng)查詢:http://dpdk.org模燥。
怎么樣,是不是很高大尚掩宜?要不要寫個程序通過DPDK提供的接口來讀取數(shù)據(jù)包蔫骂?呵呵,說句實話牺汤,這對我來說目前還有一定難度辽旋,在這里就暫時不給大家show了,如果有興趣的話檐迟,DPDK的源代碼里有helloworld补胚,還有一些其它的sample。
DPDK + OVS
我們再回到OVS上來追迟,OVS是目前得到廣泛認(rèn)可的一個軟件虛擬交換機溶其,目前已經(jīng)實現(xiàn)了通過DPDK的接口從內(nèi)存直接讀取數(shù)據(jù)包,然后在軟件層再進行各種轉(zhuǎn)發(fā)……敦间,這應(yīng)該是充分發(fā)揮了DPDK的優(yōu)勢瓶逃,相信速度也會得到明顯的改善(別高興太早)束铭。下面我就把我在Mac+virtualbox環(huán)境下的整個安裝、調(diào)試過程和大家分享一下厢绝。
基礎(chǔ)環(huán)境準(zhǔn)備
如果您有硬件環(huán)境纯露,那么建議您還是使用兩臺物理服務(wù)器來進行測試,要求是內(nèi)存至少要2G以上代芜,網(wǎng)卡需要支持DPDK,可以到DPDK的官網(wǎng)查詢:http://dpdk.org查詢您的網(wǎng)卡是否支持浓利。
怎么樣知道你的網(wǎng)卡型號呢挤庇? 很簡單,打開機蓋看贷掖,哈哈嫡秕。
當(dāng)然也有不打開機蓋的方法,安裝完操作系統(tǒng)(centos)后苹威,執(zhí)行lspci
昆咽,應(yīng)該就能看到你的網(wǎng)卡的具體型號了。
如果沒有硬件怎么辦牙甫? 當(dāng)然是萬能的虛擬機了掷酗,本文中將使用virtualbox來創(chuàng)建兩臺虛擬機進行測試,為了達到相關(guān)的要求窟哺,建議你的機器內(nèi)存>=8G泻轰。
網(wǎng)絡(luò):需要用到3個Host-Only網(wǎng)絡(luò),在virtualbox上提前創(chuàng)建好且轨。
網(wǎng)絡(luò)名分別為: vboxnet0浮声、vboxnet1、vboxnet2三個旋奢,它們對應(yīng)的網(wǎng)絡(luò)為:
vboxnet0: 192.168.56.1/24
vboxnet0: 192.168.57.1/24
vboxnet0: 192.168.58.1/24
如下所示:
虛擬機配置:
cpu 2c 內(nèi)存2G 硬盤8G
創(chuàng)建完虛擬機后泳挥,進入網(wǎng)絡(luò)設(shè)置界面:
網(wǎng)卡1-3設(shè)置相同,分別選擇vboxnet0至朗、vboxnet1屉符、vboxnet2。
特別特別要注意的是:控制芯片一定要選擇82545EM爽丹,混雜模式一定要全部允許
請在看一遍上面的文字筑煮,別怪我沒提醒你。
網(wǎng)卡4主要用于上外網(wǎng)粤蝎,因此選擇"網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)"即可真仲,如下圖所示:
最后“OK”保存,開始安裝你的centos吧初澎,安裝過程中不需要創(chuàng)新新用戶秸应,給root設(shè)置一個密碼虑凛,這些過程就不寫了,如果沒搞過自己琢磨吧软啼。
至此桑谍,假設(shè)你的centos7已經(jīng)安裝完成。
網(wǎng)絡(luò)配置
網(wǎng)卡1用于做管理使用祸挪,配置固定IP锣披,如下:
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.56.160
NETMASK=255.255.255.0
GATEWAY=192.168.56.1
DEFROUTE=no
NAME=enp0s17
DEVICE=enp0s17
ONBOOT=yes
網(wǎng)卡2和3暫時不用動.
網(wǎng)卡4主要用于上外網(wǎng),配置成自動獲取IP贿条、默認(rèn)路由雹仿、默認(rèn)啟動,如下所示:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s10
UUID=2a07d19e-5811-45c9-abd0-d6134386b4b2
DEVICE=enp0s10
ONBOOT=yes
編譯安裝DPDK
安裝前執(zhí)行下面的命令將操作系統(tǒng)升級到最新版本:
yum update
執(zhí)行下命的命令安裝編譯所需的依賴:
yum install rpm-build autoconf automake libtool systemd-units openssl openssl-devel python2-devel python3-devel python2 python2-twisted python2-zope-interface python2-six python2-sphinx desktop-file-utils groff graphviz procps-ng checkpolicy selinux-policy-devel kernel-devel python-sphinx python-twisted-core python-zope-interface libcap-ng-devel kernel-devel
然后下載當(dāng)前穩(wěn)定版本的源代碼整以,并解壓:
cd /usr/src
wget http://fast.dpdk.org/rel/dpdk-17.05.2.tar.xz
tar xf dpdk-17.05.2.tar.xz
設(shè)置環(huán)境變量胧辽,將以下內(nèi)容增加到~/.bash_profile
文件:
export DPDK_DIR=/usr/src/dpdk-stable-17.05.2
export DPDK_TARGET=x86_64-native-linuxapp-gcc
export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
執(zhí)行下命的命令進行編譯:
source ~/.bash_profile
cd dpdk-stable-17.05.2
make install T=x86_64-native-linuxapp-gcc
由于DPDK需要將數(shù)據(jù)包從網(wǎng)卡直接拷貝到內(nèi)存,因此需要調(diào)整內(nèi)存頁大小和頁數(shù)公黑,以提高內(nèi)存使用效率邑商。
編輯/etc/default/grub
文件,將下面的內(nèi)容加到引導(dǎo)啟動項GRUB_CMDLINE_LINUX
:
default_hugepagesz=2m hugepagesz=2m hugepages=512 iommu=pt intel_iommu=on
執(zhí)行如下命令寫入引導(dǎo)項:
grub2-mkconfig -o /boot/grub2/grub.cfg
編輯/etc/fstab
凡蚜,在最后增加如下內(nèi)容人断,在系統(tǒng)啟動時掛載大內(nèi)存頁。
nodev /mnt/huge hugetlbfs defaults 0 0
執(zhí)行如下命令創(chuàng)建掛載點:
mkdir -p /mnt/huge
編譯安裝Open vSwitch
執(zhí)行如下命令編譯安裝OVS:
cd /usr/src/
wget http://openvswitch.org/releases/openvswitch-2.8.1.tar.gz
tar -zxvf openvswitch-2.8.1.tar.gz
chown -R root:root openvswitch-2.8.1
cd openvswitch-2.8.1/
./boot.sh
./configure --with-dpdk=$DPDK_BUILD
make install
為了方便我們后面的配置番刊,把主機名改為ovs1含鳞。
編輯/etc/hostname
即可。
執(zhí)行reboot
重啟機器芹务。
復(fù)制虛擬機
為了我們能夠測試兩個虛擬機間的傳輸性能蝉绷,我們需要使用virtualbox復(fù)制一臺一樣的虛擬機,復(fù)制的時候記得選擇“網(wǎng)卡重新初始化選項”枣抱。復(fù)制完成后進行如下更改:
1熔吗、將網(wǎng)卡1的IP配置成192.168.56.161。
2佳晶、將hostname改為ovs2桅狠。
所有配置完成后,啟動ovs1和ovs2轿秧。
創(chuàng)建虛擬網(wǎng)橋(分別在ovs1和ovs2上執(zhí)行)
重啟機器后執(zhí)行如下命令將編譯好的dpdk驅(qū)動加載到系統(tǒng)內(nèi)核:
modprobe uio
insmod $DPDK_BUILD/kmod/igb_uio.ko
執(zhí)行如下命令查看當(dāng)前網(wǎng)卡綁定的情況:
$DPDK_DIR/usertools/dpdk-devbind.py --status
結(jié)果如下:
Network devices using DPDK-compatible driver
============================================
<none>
Network devices using kernel driver
===================================
0000:00:07.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=enp0s7 drv=e1000 unused= *Active*
0000:00:08.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=enp0s8 drv=e1000 unused=
0000:00:09.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=enp0s9 drv=e1000 unused=
0000:00:0a.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=enp0s10 drv=e1000 unused= *Active*
Other Network devices
=====================
<none>
Crypto devices using DPDK-compatible driver
===========================================
<none>
可以看到我們的4張網(wǎng)卡目前都是使用默認(rèn)的e1000驅(qū)動中跌。
執(zhí)行如下命令,將第二張網(wǎng)卡綁定到dpdk驅(qū)動:
$DPDK_DIR/usertools/dpdk-devbind.py --bind=igb_uio 0000:00:08.0
再次執(zhí)行$DPDK_DIR/usertools/dpdk-devbind.py --status
結(jié)果如下:
Network devices using DPDK-compatible driver
============================================
0000:00:08.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' drv=igb_uio unused=
Network devices using kernel driver
===================================
0000:00:07.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=enp0s7 drv=e1000 unused= *Active*
0000:00:09.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=enp0s9 drv=e1000 unused=igb_uio
0000:00:0a.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=enp0s10 drv=e1000 unused=igb_uio *Active*
Other Network devices
=====================
<none>
可以看到第二塊網(wǎng)卡已經(jīng)使用了DPDK驅(qū)動菇篡。
OK漩符,DPDK到此大功告成。
啟動OVS:
export PATH=$PATH:/usr/local/share/openvswitch/scripts
ovs-ctl start
啟動過程如下:
Starting ovsdb-server [ OK ]
system ID not configured, please use --system-id ... failed!
Configuring Open vSwitch system IDs [ OK ]
Inserting openvswitch module [ OK ]
Starting ovs-vswitchd Zone 0: name:<rte_eth_dev_data>, phys:0x7f9cecc0, len:0x30100, virt:0x7f1366dcecc0, socket_id:0, flags:0
[ OK ]
Enabling remote OVSDB managers
為什么我們要4張網(wǎng)卡驱还? 除了1張用于管理嗜暴,1張用于上外網(wǎng)凸克,另外兩張主要用于對比測試,第二張192.168.57.1/24網(wǎng)段使用dpdk驅(qū)動闷沥,第三張192.168.58.1/24使用普通網(wǎng)絡(luò)∥剑現(xiàn)在我們就創(chuàng)建兩個網(wǎng)橋br0和br1,分別將第二張網(wǎng)卡加入到br0舆逃、第三張網(wǎng)卡加入到br1蚂维。
首先對ovs進行dpdk初始化配置:
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
創(chuàng)建br0,將第二張網(wǎng)卡以DPDK設(shè)備形式加入到br0:
ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
ovs-vsctl add-port br0 myportnameone -- set Interface myportnameone type=dpdk options:dpdk-devargs=0000:00:08.0
0000:00:08.0為第二張網(wǎng)卡的ID路狮。
創(chuàng)建br1鸟雏,將第三張網(wǎng)卡加入到br1:
ovs-vsctl add-br br1
ovs-vsctl add-port br1 enp0s9
執(zhí)行ovs-vsctl show
查看網(wǎng)橋配置情況如下:
c81a1a9a-ebfc-4aab-a008-24697f1ff1ca
Bridge "br0"
Port myportnameone
Interface myportnameone
type: dpdk
options: {dpdk-devargs="0000:00:08.0"}
Port "br0"
Interface "br0"
type: internal
Bridge "br1"
Port "br1"
Interface "br1"
type: internal
Port "enp0s9"
Interface "enp0s9"
ovs_version: "2.8.1"
上面的過程在ovs1和ovs2上完全相同,下過分別給兩個網(wǎng)橋配置ip览祖。
在ovs1上,執(zhí)行如下命令給br0和br1設(shè)置IP:
ifconfig br0 192.168.57.10/24 up
ifconfig br1 192.168.58.10/24 up
在ovs2上炊琉,執(zhí)行如下命令給br0和br1設(shè)置IP:
ifconfig br0 192.168.57.11/24 up
ifconfig br1 192.168.58.11/24 up
配置完成后展蒂,在ovs1上應(yīng)該通直接ping通 192.168.57.11 和 192.168.58.11
網(wǎng)速測試
我們使用iperf進行網(wǎng)速測試,在兩臺虛擬機上安裝iperf:
yum install iperf
在ovs1上關(guān)閉防火墻啟動服務(wù)端:
systemctl stop firewalld.service
iperf -s -i 1
在ovs2上執(zhí)行如下命令分別測試兩條鏈路的網(wǎng)速:
iperf -t 10 -i 1 -c 192.168.57.10
iperf -t 10 -i 1 -c 192.168.58.10
結(jié)果如下:
[root@ovs2 ~]# iperf -t 10 -i 1 -c 192.168.57.10
------------------------------------------------------------
Client connecting to 192.168.57.10, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.57.11 port 46748 connected with 192.168.57.10 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 1.0 sec 16.2 MBytes 136 Mbits/sec
[ 3] 1.0- 2.0 sec 19.2 MBytes 161 Mbits/sec
[ 3] 2.0- 3.0 sec 19.2 MBytes 161 Mbits/sec
[ 3] 3.0- 4.0 sec 19.1 MBytes 160 Mbits/sec
[ 3] 4.0- 5.0 sec 17.5 MBytes 147 Mbits/sec
[ 3] 5.0- 6.0 sec 18.4 MBytes 154 Mbits/sec
[ 3] 6.0- 7.0 sec 18.6 MBytes 156 Mbits/sec
[ 3] 7.0- 8.0 sec 17.8 MBytes 149 Mbits/sec
[ 3] 8.0- 9.0 sec 17.8 MBytes 149 Mbits/sec
[ 3] 9.0-10.0 sec 17.5 MBytes 147 Mbits/sec
[ 3] 0.0-10.0 sec 181 MBytes 152 Mbits/sec
[root@ovs2 ~]# iperf -t 10 -i 1 -c 192.168.58.10
------------------------------------------------------------
Client connecting to 192.168.58.10, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.58.11 port 53078 connected with 192.168.58.10 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 1.0 sec 158 MBytes 1.33 Gbits/sec
[ 3] 1.0- 2.0 sec 146 MBytes 1.23 Gbits/sec
[ 3] 2.0- 3.0 sec 147 MBytes 1.23 Gbits/sec
[ 3] 3.0- 4.0 sec 162 MBytes 1.36 Gbits/sec
[ 3] 4.0- 5.0 sec 153 MBytes 1.29 Gbits/sec
[ 3] 5.0- 6.0 sec 119 MBytes 998 Mbits/sec
[ 3] 6.0- 7.0 sec 135 MBytes 1.13 Gbits/sec
[ 3] 7.0- 8.0 sec 117 MBytes 980 Mbits/sec
[ 3] 8.0- 9.0 sec 168 MBytes 1.41 Gbits/sec
[ 3] 9.0-10.0 sec 161 MBytes 1.35 Gbits/sec
[ 3] 0.0-10.0 sec 1.43 GBytes 1.23 Gbits/sec
怎么樣苔咪? 結(jié)果是不是很驚人锰悼?
總結(jié)
為什么? 為什么团赏? 為什么箕般?為什么使用dpdk驅(qū)動的速度會比普通網(wǎng)卡的速度慢那么多呢?只有普通網(wǎng)卡的1/10舔清,理論和實踐為什么差距辣么大丝里?
我個人認(rèn)為可能是由于我的環(huán)境所致,本身虛擬機才2G內(nèi)存体谒,數(shù)據(jù)傳輸完成后杯聚,OVS還要進行大量的數(shù)據(jù)包處理,虛擬機cpu性能也不是很強抒痒,才會出現(xiàn)這樣的局面幌绍,這和我的預(yù)想完全相反,整個人感覺這幾天的工夫白花了故响。
當(dāng)然傀广,也可能是某些地方配置不對,希望各位指正彩届。
后續(xù)工作
現(xiàn)在需要在物理環(huán)境進行測試伪冰,但看了一下我手里的服務(wù)器網(wǎng)卡都不支持DPDK,特在此向各位征集網(wǎng)卡2張惨缆,要求intel的糜值,并且支持dpdk丰捷。
如果誰有可以和我聯(lián)系,微信: cj_zhao寂汇, 1周內(nèi)測試完成病往,原樣寄回,謝謝骄瓣!
如果您喜歡我的作品停巷,歡迎點贊、打賞榕栏、關(guān)注畔勤。
請我吃個雪糕……