contributed by < foxhoundsk
>
linux2020
HAProxy:
XDP:
參數 -R20000
為目前實驗的瓶頸,應再調高,方可展現較低 latency 所帶來的效益(higher throughput)。
嘗試參數:
XDP:
haproxy:
目前架構為,經過 IP in IP 包裝過的封包到達其他 LB 時,其他 LB 會將 IPIP header 截斷,使得封包在該 LB 上 (application, network stack 等等) 看起來就只是一個普通的 IP packet,最後,封包處理完後將直接以 VIP 的 IP 位置回傳給 client,而非實際 IP。
在此環境下,每台 LB 要設定其負責的 VIP,設定方式為將 VIP 新增到 loopback device 上,即:
其中 10.10.0.5
即為 VIP。
此外,我們還要對 ARP 做相關設定:
如此一來 VIP 才能正確做出 DSR (Direct Server Return),也就是以 VIP 作為 L3 中的 source address。
此機器用於將 ingress 的流量平均分發至個別 XDP LB,關於 ECMP 在 vanilla Linux 上的發展歷史可見此連結。
首先,我們假設 10.10.0.7
為 VIP、做 ECMP 的機器的位置為 10.10.0.3
、XDP LB \ application 機器的位置為 10.10.0.4
, 10.10.0.5
以及 10.10.0.6
、做 benchmarking 的 client 的位置為 10.10.0.2
。
ECMP 的機器主要會有以下設定:
其中需注意 nexthop 的位置必須是 reachable 的,倘若不是,可參考 onlink
這個 iproute2 route
的其中一個參數是否對你的環境設定有幫助。
ip_forward
用於將 MAC address 指向本機上的 interface 但 L3 的位置不屬於本機的封包轉送至其他機器。
設定完後執行命令 $ ip r
預期會見到以下輸出:
Benchmarking 機器設定:
強制將指向 10.10.0.7
的封包發送給 10.10.0.3
這台機器(做 ECMP 的機器),讓它去做 routing。
XDP LB / application 機器設定請參考上一段落的介紹。
雖然兩者均用於負載平衡以及增加線路的冗餘性,但前者是作用於 layer 2,而後者則是作用於 layer 3。
建立 (socket(2)) netlink socket 時,SOCK_RAW 以及 SOCK_DGRAM 這兩種 socket 類型均可使用,因為 netlink 將其視為等價。
注意,載入 XDP program 時,相關 bpf 系統呼叫的成功僅是代表 XDP program 已載入到核心中(通過 in-kernel verifier 的檢測),此時 XDP program 尚未掛載(hook)到預期的 network interface 上,我們需要使用 netlink 中的 NETLINK_ROUTE 相關功能方能將 XDP program 掛載到預期的 interface 上。
值得注意的是,libbpf 已經實做了 XDP program 相關的 netlink 的 helper。
因為每個 driver 所支援的 XDP capabilities 不一,所以當載入 XDP program 時,需檢查對應的 NIC device driver 是否支援此 XDP program 需要用到的功能。
epbf program 若需使用 kernel API,則該 API 需經類似 EXPORT_SYMBOL
的巨集處理。
每種 ebpf program type 有個別可使用的 helper function 子集。
原生 NIC driver (eBPF driver mode) 對 eBPF 的應用有些限制,例如:僅能有 31 個 NIC ring buffer (單埠網卡),雙埠網卡的話 ring 的數量限制則僅有 15 個。
若將 NIC 的 driver 更換 (載入對應核心模組) 為對 eBPF 提供支援的 driver,則可以不受此限制的約束。
src & dst IP 位於 L3,src & dst port 位於 L4。
因 header 中的 option
成員的關係,header 的長度不定。長度由 4-bit 的 bitfield (在結構體中名為 ihl
) 來定義,ihl
表示 header 長度為多少個 dword (32-bit)。
由於長度使用 4 個位元表示,並且除了 option
成員外 header 還有必要的長度。因此 IPv4 長度最小為 20 bytes,最大為 60 bytes (0b1111 * size_of_qword)。