提起負(fù)載均衡設(shè)備像吻,程序員基本都打過交道啼器。硬件的比如 F5窥岩、netscaler, 以前在趕集網(wǎng)就用 netscaler, 后來(lái)過保也沒續(xù)... 軟件的有 lvs披诗、haproxy撬即,當(dāng)然了七層的 nginx 也算。關(guān)于轉(zhuǎn)發(fā)模式也知道一些 dr呈队、nat剥槐、tunnel 等等,輪循的算法有 rr宪摧、wrr、wlc 等等。但是內(nèi)部原理除了網(wǎng)絡(luò)同學(xué)击狮,大部分同學(xué)只是簡(jiǎn)單的使用筹陵,借著這次調(diào)研 dpdk
機(jī)會(huì),讀讀源碼孩革,一勺燴了岁歉。
背景
現(xiàn)代互聯(lián)網(wǎng)流量越來(lái)越大,網(wǎng)卡吞吐能力也越來(lái)越強(qiáng),從最早的 1gb, 到現(xiàn)在 10gb 是標(biāo)配锅移,以后可能 100gb, 所以負(fù)載均衡設(shè)備的線性擴(kuò)展也遇到了瓶勁熔掺。谷歌前幾年發(fā)布了關(guān)于 LB
的論文 Maglev
, 估計(jì)是受啟發(fā),各大公司相繼造 LB
輪子非剃,愛奇異和小米同時(shí)用 dpdk
+ lvs
技術(shù)開發(fā)了自己的負(fù)載均衡軟件置逻,要是小米先開源,這名和利早就是小米同學(xué)的了... 雖然這些技術(shù)都是開源并且己知备绽,很成熟的券坞,能站在了巨人的肩膀上,將技術(shù)組合起來(lái)并開源也很歷害肺素,感謝愛奇異的大牛們恨锚。
lvs 的問題
IT 行業(yè)技術(shù)變化真快,剛畢業(yè)時(shí) lvs
還是負(fù)載均衡界的小甜甜倍靡,才過了幾年就成了牛夫人猴伶。中小公司 lvs
足夠好用,但是內(nèi)核比較低塌西,尤其 fullnat
模式應(yīng)用非常廣泛他挎。那 lvs
問題是什么呢?
主要是內(nèi)核太慢捡需,網(wǎng)絡(luò)棧代碼寫的也不好办桨,各種歷史問題,很多 if
語(yǔ)句站辉,這個(gè)很影響分支預(yù)測(cè)的呢撞。而lvs
的數(shù)據(jù)需要經(jīng)過內(nèi)核網(wǎng)絡(luò)棧,再拷貝到用戶空間庵寞,性能自然上不去狸相。谷歌的 Maglev
完全是繞過了內(nèi)核,從網(wǎng)卡收數(shù)據(jù)直接送到 LB
. 這就是所謂的內(nèi)核旁路 kernel bypass
技術(shù)捐川,這個(gè)技術(shù)現(xiàn)在比較成熟脓鹃,dpdk
, open onload
, netmap
等等。當(dāng)年谷歌可是硬擼的古沥,理念和技術(shù)水平領(lǐng)先一個(gè)時(shí)代瘸右。
什么是 dpvs
那再回頭說什么是 dpvs 呢?dpdk
+ lvs
岩齿,可以理解為經(jīng)過內(nèi)核旁路的 lvs ++
. 對(duì)于原來(lái)熟悉 lvs
的人不會(huì)陌生太颤。看官網(wǎng)得知盹沈,轉(zhuǎn)發(fā)模式完全來(lái)自 lvs
龄章,就連代碼部份函數(shù)名都是一樣的。
上圖是官網(wǎng)的一張圖,右側(cè)都是
dpvs
列出的優(yōu)化點(diǎn)做裙。那這些優(yōu)化點(diǎn)難不難呢岗憋?難,但是锚贱,dpdk
都做好了仔戈。dpdk
程序最大的特點(diǎn)就是每個(gè)邏輯核都有自己的數(shù)據(jù),有一個(gè)封裝好的宏 RTE_PER_LCORE
拧廊,即然都本地化了监徘,那自然也沒有鎖開銷“赡耄看源碼得知凰盔,mbuf
分配,定時(shí)器這些都是本地化的倦春。
dpvs 優(yōu)點(diǎn)
lvs
相關(guān)的模式廊蜒,轉(zhuǎn)發(fā)算法目前沒看到區(qū)別。性能優(yōu)化都是 dpdk
層面的溅漾,減少 cpu cache miss, 減少 false sharing,NUMA 友好著榴,綁定 cpu添履,其實(shí)想想這些不都是軟件優(yōu)化共性嘛。
- 用戶態(tài)內(nèi)核旁路脑又,少去內(nèi)核到用戶空間的拷貝
- 網(wǎng)卡隊(duì)列與 cpu 的綁定
-
flow director
增加返程數(shù)據(jù)親和性暮胧,往返都由同一個(gè) cpu 處理 - cpu 數(shù)據(jù)本地化,無(wú)鎖
- 實(shí)現(xiàn)輕量級(jí) tcp stack问麸,專用的性能自然好
dpvs 缺點(diǎn)
- 缺點(diǎn)還是有的往衷,由于他是
lvs
衍生出來(lái)的,所以lvs
各個(gè)模式的缺點(diǎn)他都有严卖。 - 相比
Maglev
, 目前dpvs
更適配intel
網(wǎng)卡席舍,看官網(wǎng)也支持其它廠商網(wǎng)卡。這其實(shí)算是dpdk
的限制哮笆,畢竟intel
的框架来颤。 - 由于網(wǎng)卡被
dpvs
專用,可能還需要專配一個(gè)網(wǎng)卡用于運(yùn)維稠肘,或是開kni
也行福铅。 - 不支持
ipv6
, 現(xiàn)在有強(qiáng)推的趨勢(shì),想對(duì)標(biāo)Maglev
, 還是越早支持越好项阴。
小結(jié)
先寫這些滑黔,之后再?gòu)脑创a角度分析 dpvs
業(yè)務(wù)處理流程,和各種優(yōu)化的細(xì)節(jié)。