OpenvSwitch系列之十一 ovs-dpdk


Open vSwitch系列之一 Open vSwitch誕生
Open vSwitch系列之二 安裝指定版本ovs
Open vSwitch系列之三 ovs-vsctl命令使用
Open vSwitch系列之四 ovs-ofctl命令使用
Open vSwitch系列之五 網橋特性功能配置
Open vSwitch系列之六 vlan隔離
Open vSwitch系列之七 meter表限速
Open vSwitch系列之八 vxlan隧道
Open vSwitch系列之九 Group表
Open vSwitch系列之十 調用北向接口下發流表
OpenvSwitch系列之十一 ovs-dpdk

DPDK介紹

DPDK(Data Plane Development Kit):
是一組快速處理數據包的開發平台及接口。有intel主導開發,主要基於Linux系統,用於快速數據包處理的函數庫與驅動集合,可以極大提高數據處理性能和吞吐量,提高數據平面應用程序的工作效率。

DPDK的作用
在數據平面應用中為快速處理數據包提供一個簡單而完善的架構。在理解此工具集之后,開發人員可以以此為基礎進行新的原型設計處理大並發網絡數據請求。

當前數據包的處理流程是這樣:
數據包到達網卡,網卡發送中斷通知CPU,CPU將數據包拷貝到內核空間中,應用程序從內核空間中拷貝數據到用戶態空間,數據處理。

在這個過程中數據包處理耗時的操作有:

  1. 網卡每次收到數據都發送中斷,打斷cpu的工作。切換和恢復過程都耗時
  2. 網絡數據包經過TCP/IP協議棧,達到真正的應用處理程序時走過很多的流程
  3. 應用程序拿到網絡數據時需要經過內核空間到用戶態空間的一次copy,增加耗時

dpdk解決問題辦法:

  1. DPDK技術是重載網卡驅動,直接將數據傳遞給用戶態的應用程序,避免了中間環節的經過TCP/IP協議棧,內核空間到用戶空間的copy。
  2. 同時針對第一點網卡頻繁的中斷,應用程序可以使用輪詢的方式獲取網卡上的數據,避免中斷造成的場景切換和恢復浪費的時間。

ovs-dpdk

普通ovs

ovs的架構圖:

ovs處理流表的過程是:
1.ovs的datapath接收到從ovs連接的某個網絡設備發來的數據包,從數據包中提取源/目的IP、源/目的MAC、端口等信息。
2.ovs在內核狀態下查看流表結構(通過Hash),觀察是否有緩存的信息可用於轉發這個數據包。
3.內核不知道如何處置這個數據包會將其發送給用戶態的ovs-vswitchd。
4.ovs-vswitchd進程接收到upcall后,將檢查數據庫以查詢數據包的目的端口是哪里,然后告訴內核應該將數據包轉發到哪個端口,例如eth0。
5.內核執行用戶此前設置的動作。即內核將數據包轉發給端口eth0,進而數據被發送出去。

ovs-dpdk

DPDK加速的OVS與原始OVS的區別在於,從OVS連接的某個網絡端口接收到的報文不需要openvswitch.ko內核態的處理,報文通過DPDK PMD驅動直接到達用戶態ovs-vswitchd里。

DPDK加速的OVS數據流轉發的大致流程如下:
1.OVS的ovs-vswitchd接收到從OVS連接的某個網絡端口發來的數據包,從數據包中提取源/目的IP、源/目的MAC、端口等信息。
2.OVS在用戶態查看精確流表和模糊流表,如果命中,則直接轉發。
3.如果還不命中,在SDN控制器接入的情況下,經過OpenFlow協議,通告給控制器,由控制器處理。
4.控制器下發新的流表,該數據包重新發起選路,匹配;報文轉發,結束。

總結
主要區別在於流表的處理。普通ovs流表轉發在內核態,而ovs-dpdk流表轉發在用戶態

ovs-dpdk 安裝

安裝環境


系統:ubuntu1604
網卡:intel I350

編譯工具安裝

apt-get update
apt install automake libtool build-essential openssl -y
apt install desktop-file-utils groff graphviz -y
apt install checkpolicy python-sphinx python-twisted-core -y

編譯安裝dpdk

wget http://dpdk.org/browse/dpdk/snapshot/dpdk-16.11.tar.gz
mkdir -p /usr/src/dpdk
解壓並進入目錄
make config T=x86_64-native-linuxapp-gcc
make install T=x86_64-native-linuxapp-gcc DESTDIR=/usr/src/dpdk
make install T=x86_64-native-linuxapp-gcc DESTDIR=/usr

編譯安裝ovs

wget http://openvswitch.org/releases/openvswitch-2.7.0.tar.gz

解壓並進入目錄

./boot.sh

./configure \
--with-dpdk=/usr/src/dpdk \
--prefix=/usr \
--exec-prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var

make

make install

網卡綁定

系統設置

vim  /boot/grub2/grub.cfg

找到引導的相應內核參數,在后面添加:iommu=pt intel_iommu=on

linux   /vmlinuz-4.4.0-142-generic root=/dev/mapper/ubuntu--vg-root ro recovery nomodeset  iommu=pt intel_iommu=on

重啟生效

設置dpdk驅動

modprobe uio_pci_generic
dpdk-devbind --bind=uio_pci_generic enp1s0f0
dpdk-devbind --bind=uio_pci_generic enp1s0f1

配置大頁

查看當前的hugepage

grep HugePages_ /proc/meminfo

修改hugepage的頁數為1024

臨時設置大頁的方法,重啟失效:

echo 1024 > /proc/sys/vm/nr_hugepages

配置保存的設置方法,重啟生效:

echo 'vm.nr_hugepages=1024' > /etc/sysctl.d/hugepages.conf

掛載hugepages

mount -t hugetlbfs none /dev/hugepages

啟動ovs進程

准備ovs相關路徑

mkdir -p /etc/openvswitch
mkdir -p /var/run/openvswitch

刪除舊的ovs配置數據和創建新的(可選)

如果不需要舊配置時,可以選擇該操作

rm /etc/openvswitch/conf.db
ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema

啟動ovsdb server

ovsdb-server /etc/openvswitch/conf.db \
-vconsole:emer -vsyslog:err -vfile:info \
--remote=punix:/var/run/openvswitch/db.sock \
--private-key=db:Open_vSwitch,SSL,private_key \
--certificate=db:Open_vSwitch,SSL,certificate \
--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --no-chdir \
--log-file=/var/log/openvswitch/ovsdb-server.log \
--pidfile=/var/run/openvswitch/ovsdb-server.pid \
--detach --monitor

第一次啟動ovs需要初始化

ovs-vsctl --no-wait init

初始化dpdk

從ovs-v2.7.0開始,開啟dpdk功能已不是vswitchd進程啟動時指定–dpdk等參數了,而是通過設置ovsdb來開啟dpdk功能

ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true

自定義一些dpdk的參數(可選)

指定的sockets從hugepages預先分配的內存

ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="1024,0"

指定在某些core上運行

ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x02

查看自定義的dpdk參數

ovs-vsctl get Open_vSwitch . other_config:dpdk-socket-mem
ovs-vsctl get Open_vSwitch . other_config:pmd-cpu-mask
ovs-vsctl get Open_vSwitch . other_config:dpdk-init

啟動vswitchd進程

ovs-vswitchd unix:/var/run/openvswitch/db.sock \
-vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir \
--log-file=/var/log/openvswitch/ovs-vswitchd.log \
--pidfile=/var/run/openvswitch/ovs-vswitchd.pid \
--detach --monitor

ovs工具使用

創建openvswitch網橋

ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev

把dpdk端口加入網橋

先使用dpdk-devbind命令查看當前已綁定的dpdk網卡,並記住相應的PCI地址

dpdk-devbind --status

ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk options:dpdk-devargs=0000:01:00.0
ovs-vsctl add-port br0 dpdk1 -- set Interface dpdk1 type=dpdk options:dpdk-devargs=0000:01:00.1

完成分割線

到這里就安裝完成了,並且兩台主機之間可以直接轉發數據。

測速

在兩主機之間使用iperf工具測速,服務端收集到的測速信息如下:
兩主機之間是1000Mb的帶寬

目前只使用了iperf的測速方法,發現ovs-dpdk和ovs的轉發效率沒有什么區別,可能並沒有找到合適的測試方法,待補充。

報錯解決

在安裝過程中可能會出現的報錯:

ovs-vsctl: unix:/usr/local/var/run/openvswitch/db.sock: database connection failed (No such file or directory)

解決方法:

ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
                     --remote=db:Open_vSwitch,Open_vSwitch,manager_options \
                     --private-key=db:Open_vSwitch,SSL,private_key \
                     --certificate=db:Open_vSwitch,SSL,certificate \
                     --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \
                     --pidfile --detach
ovs-vsctl --no-wait init
ovs-vswitchd --pidfile --detach
/usr/share/openvswitch/scripts/ovs-ctl start


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM