1. 程式人生 > >手動搭建openstack的計算節點網路

手動搭建openstack的計算節點網路

          在當前部署的openstack測試環境中遇到網路延時的問題,當測試PC(虛擬機器)和BTS進行通訊的時候,發現相對於物理機,虛擬機器的UDP速度慢了約30%,這種狀況非常影響測試時間,比如某個case在虛擬機器中消耗時間20分18秒,在以前物理機中消耗時間14:30秒。

            影響網路速度的因素有很多,從虛擬機器到BTS之間經歷多種物理裝置,虛擬裝置,網路資料包轉換功能,等,按順序排列有虛擬機器,虛擬機器上linux網橋,兩層OVS網橋,兩次vlan號轉換,一層物理網絡卡,兩次物理交換機,再到BTS。而以前物理機是通過一個物理交換機直連BTS。

            以前環境如圖:


            虛擬機器測試環境如圖:


為了找出致使UDP延遲的原因,按照以下順序逐一排查各個裝置和功能。

1、排除兩個物理機的影響

將BTS和宿主機(host)直接連到同一個交換機,經測試,跑case消耗的時間為見明顯變化。

2、測試linux網橋是否影響網速

直接手動建立一個虛擬機器,將虛擬機器網絡卡搭建在linux網橋上,網路拓撲如圖:

 

搭建過程:

1、 建立linux網橋

brctl addbr lbr

2、 將物理網絡卡搭到linux網橋上,分配IP,啟用網橋,釋放物理網絡卡

brctl addif lbr eth0

ifconfig lbr 192.168.255.xxx

ifconfig lbr up

ifconfig eth0 0

3、 使用virt-manger建立虛擬機器,建立時指定橋接到剛建立的linux網橋上


建立虛擬機器後,可以ifconfig看到多了一個vnet0的網路裝置,brctrlshow可以看到這個網路裝置連到lbr網橋,


登入虛擬機器看eth0的實體地址,發現就是vnet0實體地址,即虛擬機器的虛擬網絡卡已經連到了linux網橋。

經過測試,case這這種環境下耗時15:06秒。

背景知識:

linux網橋

Bridge(橋)是 Linux 上用來做 TCP/IP 二層協議交換的裝置,與現實世界中的交換機功能相似。Bridge裝置例項可以和Linux 上其他網路裝置例項連線,既attach 一個從裝置,類似於在現實世界中的交換機和一個使用者終端之間連線一根網線。當有資料到達時,Bridge會根據報文中的MAC 資訊進行廣播、轉發、丟棄處理。

virt-manger

virt-manger是linux中管理虛擬機器的視覺化軟體,通過virt-manger可以增刪改查虛擬機器。

3、測試OVS網橋是否影響網速

將虛擬機器網絡卡搭在OVS網橋上,網路拓撲如圖:


搭建過程

1、 建立OVS網橋

ovs-vsctl addbr br-eth1

2、 將物理網絡卡搭到OVS網橋上,分配IP,啟用網橋,釋放物理網絡卡

ovs-vsctl addif br-eth1eth0

ifconfig br-eth1192.168.255.xxx

ifconfig br-eth1up

ifconfig eth0 0

3、 建立虛擬機器,建立時指定橋接到剛建立的OVS網橋上


注意,virt-manger不能直接搭建在OVS網橋上,建立完虛擬機器後,必須手動修改虛擬機器配置檔案。

virsh list #列出所有虛擬機器


virsh edit 4 #修改虛擬機器配置檔案

修改網路介面引數為

<interface type='bridge'>

      <macaddress='52:54:00:a6:08:70'/>

      <sourcebridge='ovsbr'/>

      <virtualporttype='openvswitch'/>

      <targetdev='vnet2'/>

      <modeltype='virtio'/>    

       <address type='pci' domain='0x0000'bus='0x00' slot='0x03' function='0x0'/>

</interface>

          儲存退出重啟虛擬機器。

經過測試,case這這種環境下耗時14:50秒。

背景知識:

OVS

Open vSwitch is a production quality,multilayer virtual switch licensed under the open source Apache 2.0license.  It is designed to enable massivenetwork automation through programmatic extension, while still supportingstandard management interfaces and protocols (e.g. NetFlow, sFlow, IPFIX,RSPAN, CLI, LACP, 802.1ag). 

4、測試兩層OVS網橋是否影響網速

                將虛擬機器搭建在2個OVS網橋上,網路拓撲如圖:


                和上一步驟區別就是多建一個OVS網橋,並將兩個OVS網橋連在一起。

                連線過程如下:

ovs-vsctl add-port br-eth1  phy-br-eth1

ovs-vsctl set interface phy-br-eth1 type=patch

ovs-vsctl set interface phy-br-eth1 options:peer int-br-eth1

ovs-vsctl add-port br-int  int  -br-eth1

ovs-vsctl set interface int  -br-eth1type=patch

ovs-vsctl set interface int  -br-eth1options:peer phy-br-eth1

經過測試,case這這種環境下耗時16:15秒

5、測試OVS網橋的VLANtag轉換是否影響網速

將虛擬機器搭建在2個OVS網橋上,並在網橋上經過vlantag轉換,網路拓撲如圖:


和上一步驟區別就是新增兩條流表規則,

操作步驟:

root@btsci-OptiPlex-9020:~# ovs-vsctl set port vnet0 tag=200

root@btsci-OptiPlex-9020:~# ovs-vsctl get Interface vnet0 ofport   #獲取port num號

root@btsci-OptiPlex-9020:~# ovs-ofctl add-flow br-test"priority=3,in_port=3,dl_vlan=102,actions=mod_vlan_vid:200,normal"

root@btsci-OptiPlex-9020:~# ovs-ofctl add-flow br-eth1"priority=3,in_port=2,dl_vlan=200,actions=mod_vlan_vid:102,normal"

root@btsci-OptiPlex-9020:~# ovs-ofctl dump-flows br-test

NXST_FLOW reply (xid=0x4):

 cookie=0x0, duration=26.784s,table=0, n_packets=0, n_bytes=0, idle_age=26, priority=3,in_port=3,dl_vlan=102actions=mod_vlan_vid:200,NORMAL

 cookie=0x0, duration=279597.834s,table=0, n_packets=915884, n_bytes=341478656, idle_age=0, hard_age=65534,priority=0 actions=NORMAL

root@btsci-OptiPlex-9020:~# ovs-ofctl dump-flows br-eth1

NXST_FLOW reply (xid=0x4):

 cookie=0x0, duration=18.832s,table=0, n_packets=0, n_bytes=0, idle_age=18, priority=3,in_port=2,dl_vlan=200actions=mod_vlan_vid:102,NORMAL

 cookie=0x0, duration=5632.942s,table=0, n_packets=106362, n_bytes=40896804, idle_age=1, priority=0actions=NORMAL

經過測試,case這這種環境下耗時14:49秒

注意:此時出OVS交換機的時候已經有vlan tag, 必須設定host連線到物理交換的port trunk,否則網路不通。

6、測試兩層OVS網橋,一層linux網橋是否影響網速

                 手動搭建完全類似openstack自動搭建的網路結構。網路拓撲如圖:


在上一個步驟基礎上再建一個linux網橋,並且將linux網橋通過vethpair連到OVS網橋上。

root@btsci-OptiPlex-9020:~# ip link add qvb type veth peer name qvo #建立vethpair

root@btsci-OptiPlex-9020:~# brctrl addbr qbr #建立linux網橋

root@btsci-OptiPlex-9020:~# ip link set qvb up

root@btsci-OptiPlex-9020:~# ip link set qvb promisc on  #開啟混雜模式

root@btsci-OptiPlex-9020:~# ip link set qvo up #啟用

root@btsci-OptiPlex-9020:~# ip link set qvo promisc on

root@btsci-OptiPlex-9020:~# ip link set qbr up

root@btsci-OptiPlex-9020:~# brctl show

bridge name             bridge id                              STP enabled       interfaces           

qbr                                8000.000000000000         no                                                          

root@btsci-OptiPlex-9020:~# brctl addif qbr qvb

root@btsci-OptiPlex-9020:~# brctl show

bridge name             bridge id                              STP enabled       interfaces           

qbr                                8000.ee8dbfe80047        no                           qvb                       

root@btsci-OptiPlex-9020:~# ovs-vsctl add-port br-test qvo

經過測試,case這這種環境下耗時15:01秒

傻眼了,手動建立的網路結構完全和自動建立的網路相同,但網路延時不一樣

背景知識:

VETH

veth pair是用於不同networknamespace間進行通訊的方式,veth pair將一個networknamespace資料發往另一個network namespaceveth。如下


可以簡單的把veth想象成現實裡的一條兩端帶網絡卡的網線。在另外一篇記錄《dockerand vlan》也是通過veth連線容器和網橋。

7、VM繞過部分虛擬網路裝置的的影響

                      在原來openstack 計算節點手動修改本來自動建立好的網路,逐個繞過虛擬網路裝置。

                      測試結果如圖:


可見測試結果並沒有大的改善,這就很大的可能是虛擬機器本身有問題,經過將測試的伺服器加入openstack成為計算節點,經過測試,耗時和物理機無大的差別。

總結,導致網路延時的根本原因是計算節點安裝的作業系統centos的預設KVM安裝包版本較低。