dpvs入門實踐1--概念及編譯安裝


在接觸一項新事物時,我習慣從宏觀角度去了解。也就是從它的產生背景、基本概念、大致的原理圖來了解。如果能找到靈魂paper來讀一下是最好。然后就是編譯運行,遇到不懂的概念再次反過來理解。然后再抓住一條線,例如四層數據包如何轉發來進行代碼研讀。也就是說先從大圖像了解概貌入手,然后運行程序敲幾個命令有個感性的認識,然后再沿着一條線去細讀反過來再細化最初的大圖像。

DPVS是一種基於DPDK的高性能四層負載均衡器。它來源於Linux Virtual Server LVS及其修改后的alibaba/LVS. 那LVS是什么呢?Linux Virtual Server是構建在實服務器集群上的高度可伸縮和高可用的服務器,負載平衡器運行在Linux操作系統上。服務器集群的架構對最終用戶是完全透明的,用戶之間的交互就好像它是一個高性能的虛擬服務器。因此,DPVS使用了LVS里面的核心概念(這些在http://www.linuxvirtualserver.org/zh/index.html官網有詳細說明,這里做個摘要):

  • NAT: 通過網絡地址轉換,調度器重寫請求報文的目標地址,根據預設的調度算法,將請求分派給后端的真實服務器;真實服務器的響應報文通過調度器時,報文的源地址被重寫,再返回給客戶,完成整個負載調度過程。
  • TUN: 采用NAT技術時,由於請求和響應報文都必須經過調度器地址重寫,當客戶請求越來越多時,調度器的處理能力將成為瓶頸。為了解決這個問題,調度器把請求報 文通過IP隧道轉發至真實服務器,而真實服務器將響應直接返回給客戶,所以調度器只處理請求報文。由於一般網絡服務應答比請求報文大許多,采用 VS/TUN技術后,集群系統的最大吞吐量可以提高10倍。
  • DR: 通過改寫請求報文的MAC地址,將請求發送到真實服務器,而真實服務器將響應直接返回給客戶。同VS/TUN技術一樣,VS/DR技術可極大地 提高集群系統的伸縮性。這種方法沒有IP隧道的開銷,對集群中的真實服務器也沒有必須支持IP隧道協議的要求,但是要求調度器與真實服務器都有一塊網卡連 在同一物理網段上。
  • FNAT: IPVS的一種新的報文轉發方式,區別於DR/NAT/TUNNEL. 該模式處理原則如下:引入local ip address(即IDC 內部ip地址lip), IPVS轉換cip(client ip)--vip to/from lip--rip(remote ip),這里lip和rip都是IDC內部IP地址,因此LVS負載均衡器和真實服務器可以在不同的vlan,真實的服務器只需要能訪問到內網即可。

其他概念:

  • 單臂(one arm): 指所有的客戶端和服務器都在負載均衡器的同一側,LB通過相同的邏輯網絡接口轉發流量。
  • 雙臂(two arms): 客戶機位於負載平衡器(LB)的一端,服務器位於負載平衡器(RS)的另一端,然后LB在其兩個邏輯網絡接口之間轉發數據包。例如廣域網到局域網的負載均衡.

編譯安裝

雖然github官方上說明不再支持dpdk-stable-20.11.1之前的版本了,但是目前新分支還出與開發階段,我沒有編譯通過。所以我用的版本還是dpdk18.11.2 + dpvs1.8. 首先安裝dpvs1.8版本在github上的官方介紹一樣下載1.8版本的dpvs源代碼。

$ git clone https://github.com/iqiyi/dpvs.git
$ cd dpvs

下不來的話可以直接去碼雲網站https://gitee.com 下載release包。然后進到dpvs目錄,再下載dpdk源碼:

$ wget https://fast.dpdk.org/rel/dpdk-20.11.1.tar.xz   # download from dpdk.org if link failed.
$ tar xf dpdk-20.11.1.tar.xz

接下來打補丁,在打補丁之前我們先來安裝一些工具包防止在后面的編譯過程中報錯,有的話可以跳過:

yum install  python3 (Python 3.5 or later.)	
pip3 install meson ninja //Meson (version 0.49.2+) and ninja
pip3 install pyelftools 或者yum install pyelftools
yum install numactl-devel
yum install -y popt-devel
yum install -y automake
yum install -y libnl3 libnl3-devel
yum install -y openssl openssl-devel
yum install -y numactl kernel-devel libpcap-devel
yum install -y unzip patch numactl-devel numactl

另外,注意安裝gcc前要安裝和內核版本匹配的kernel-devel, 查看 ls /usr/src/kernels/, 並且 ldd --version 查看glibc版本要求 glibc >= 2.7(拜托2.17 大於 2.7)

編譯dpdk

在編譯dpvs之前要先編譯DPDK:

cd dpvs-1.8/
cp patch/dpdk-stable-18.11.2/*.patch dpdk-stable-18.11.2/
cd dpdk-stable-18.11.2/
patch -p1 < 000
...
make config T=x86_64-native-linuxapp-gcc
make
export RTE_SDK=$PWD
export RTE_TARGET=build

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
grep Huge /proc/meminfo
 # 需要開機自動掛載的話可以在
 $ echo "nodev /mnt/huge hugetlbfs defaults 0 0" >> /etc/fstab

modprobe uio
cd dpdk-stable-18.11.2
insmod build/kmod/igb_uio.ko
insmod build/kmod/rte_kni.ko carrier=on
./usertools/dpdk-devbind.py --status
// 172.18.8.129: eno4 100.200.0.129  30:fd:65:32:e8:c3  0000:1a:00.3
// 172.18.8.129: eno1                30:fd:65:32:e8:c0  0000:1a:00.0
ifconfig eno4 down
./usertools/dpdk-devbind.py -b igb_uio 0000:1a:00.3
./usertools/dpdk-devbind.py --status

./usertools/dpdk-devbind.py -u 0000:1a:00.0
./usertools/dpdk-devbind.py -b i40e 0000:1a:00.0

編譯dpvs

編譯dpvs比較簡單,只需要配置export PKG_CONFIG_PATH=/opt/sj/dpvs-1.8/dpdk-stable-18.11.2/dpdklib/lib64/pkgconfig/libdpdk.pc 然后到dpvs目錄下編譯即可

cd ..
make // 報 inline 函數未定義的錯誤,需要在 src/Makefile CFLAGS 參數最后-mcmodel=medium之前加上 -fgnu89-inline
make install

運行DPVS

拷貝./conf/下合適的配置文件到 /etc/dpvs.conf
運行./bin/dpvs 如果報段錯誤退出則需要調整配置文件中的pktpool_size,我猜測是因為這個值太大了導致內存不足。可以把這個值改小一些,並且屏蔽一些cpu,減少消耗。我這樣操作之后能跑起來了。


免責聲明!

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



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