0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

字節(jié)跳動在令牌桶限速器優(yōu)化上的實踐

OSC開源社區(qū) ? 來源:字節(jié)跳動SYS Tech ? 2023-03-31 10:05 ? 次閱讀

限速器(rate limiter)是一個非?;A(chǔ)的網(wǎng)絡(luò)包處理功能,被廣泛應(yīng)用于各類網(wǎng)元設(shè)備,在流量調(diào)度、網(wǎng)絡(luò)安全等領(lǐng)域發(fā)揮著重要作用。常見的限速器的實現(xiàn)方式基于令牌桶(token bucket),盡管令牌桶的原理已經(jīng)被人熟知,在具體實踐中,我們也發(fā)現(xiàn)了一些挑戰(zhàn)和共性問題。本文總結(jié)了近兩年字節(jié)跳動系統(tǒng)與技術(shù)工程團(tuán)隊(簡稱 STE 團(tuán)隊)在限速器優(yōu)化方面的一些探索,將一些經(jīng)驗和教訓(xùn)總結(jié)出來,以饗讀者。

令牌桶限速器的基本原理

相信每個寫網(wǎng)絡(luò)包處理的工程師都寫過基本的令牌桶限速器。令牌桶是一個形象的描述,既可以想象有一個桶可以容納一定量的令牌(token),每放行一個數(shù)據(jù)包便消耗一定量的令牌,數(shù)據(jù)包的放行與否取決于令牌桶中的令牌個數(shù)。

d5e11bea-cf06-11ed-bfe3-dac502259ad0.png

圖1 令牌桶圖示

pYYBAGQmQGGAQK8VAAN3J_hRskU606.jpg

在具體實踐中,令牌桶具有實現(xiàn)簡單、效率高等特點,在很多場景下,提到限速器,基本是令牌桶的代名詞。

存在的問題

在具體工程時間中,我們遇到了以下三個問題:

1. 精度問題

實際工程實踐中,時間計量單位其實是受限于系統(tǒng),比如時間戳可能是以微秒(us)為單位,而每次計算的時間差可能只有 1~2us。那么一個 PPS=300K 的限速器,可能一次計算,所產(chǎn)生的令牌是 0.3 個,容易被整數(shù)運算忽略。最終的結(jié)果則是,實際限制為 300K/s,最后效果是只有 250Kpps 流量放行。精度過低,效果不理想。

這種解決方式也比較簡單,可以讓一個數(shù)據(jù)包消耗的令牌量不是 1個,而是 1000個。這樣,即使 1us,令牌桶產(chǎn)生的令牌數(shù)是 300個,而非 0.3個,這樣便保證了精度。但此時又引入了新的問題,因為令牌數(shù)擴(kuò)大了 1000 倍,此時需要考慮令牌桶的深度是否會溢出 32bit。一旦溢出,則會出現(xiàn)其他詭異的問題。

2. 級聯(lián)補(bǔ)償問題

d607fe0e-cf06-11ed-bfe3-dac502259ad0.png 圖2 限速器級聯(lián)補(bǔ)償

我們在實踐中發(fā)現(xiàn),多個限速器級聯(lián)的時候,需要補(bǔ)償令牌。比如對于限速器 A,這個包是放行,消耗了 A 的令牌。對于限速器 B,這個包是丟棄,因為 B 沒令牌了。此時包被丟了。那么此時 A 的令牌就白白消耗了,即消耗了 token,然后包還是丟了。如果想達(dá)到一個準(zhǔn)確的限速效果,限速器A的令牌應(yīng)該被補(bǔ)償。如圖 2 所示那樣。

級聯(lián)補(bǔ)償使得多個限速器互相耦合,在代碼編寫上也比較麻煩。我們在實際中發(fā)現(xiàn),如果限速器 A 和限速器 B 的限速值接近,并且都有丟包,那么缺乏級聯(lián)補(bǔ)償會對精度有嚴(yán)重影響。但如果限速值差的很遠(yuǎn),則對精度的影響沒有那么大。

3. TCP對丟包敏感問題

令牌桶是沒有緩存的,一旦速率超過限定值,則會出現(xiàn)丟包。而 TCP 協(xié)議則對丟包非常敏感,一旦出現(xiàn)丟包,TCP 的對速率的調(diào)整比較激進(jìn)。令牌桶這一特性使得他在應(yīng)用于 TCP 這種流量時,經(jīng)常會導(dǎo)致限制 100Mbps,實際上最多只能跑到 80Mbps,因為不斷的丟包導(dǎo)致 TCP 不斷地降低發(fā)送窗口。

在 vSwitch 的使用時,BPS (Bits Per Second)限速對 TCP 的損耗尤其大,這是因為,一般虛擬網(wǎng)卡都開啟了 TSO(TCP Segmentation Offload)優(yōu)化,開啟 TSO 情況下,主機(jī)向外發(fā)送的 TCP 包都很大,一個包有可能是 64K 字節(jié),在這么大的情況下,隨便丟若干個包,就對 TCP 的速率影響非常明顯了。

第一次改進(jìn):端口借貸反壓限速器

我們在實踐中發(fā)現(xiàn),級聯(lián)補(bǔ)償反饋問題雖然存在但不是非常突出,原因是一般級聯(lián)的限速器的限速值差距很大,比如單網(wǎng)卡的速率和整機(jī)速率,一般差距較大,不容易出現(xiàn)精度問題。最嚴(yán)重的問題是 TCP 丟包敏感導(dǎo)致的限速帶寬達(dá)不到,影響用戶體驗。由圖3所示,隨著 TCP RTT 的增加,實際可以達(dá)到的帶寬會明顯下降。

d61d629e-cf06-11ed-bfe3-dac502259ad0.png

圖3 流量通過1Gbps限速器之后,實際獲得速率

反壓(backpressure),就是針對 TCP 對丟包敏感這一問題進(jìn)行的改進(jìn)。我們在第一次設(shè)計的時候,其實針對的是一個特定的場景。既虛機(jī)的虛擬網(wǎng)卡進(jìn)行限速。而且我們的限速器正好是每個網(wǎng)卡有一個特定的限速器。

每個虛擬網(wǎng)卡都有若干隊列,vSwitch 會持續(xù)的輪詢這些隊列拿到數(shù)據(jù)包發(fā)出。這些隊列本質(zhì)上其實就是包的緩存區(qū)。反壓,其實就是停止或者延緩對這些隊列的輪詢發(fā)包,讓數(shù)據(jù)包在隊列上堆積,而達(dá)到將壓力反饋到 Guest Kernel 的目的,這樣 Guest Kernel 的 TCP 棧就會感知到擁塞,調(diào)整發(fā)送的節(jié)奏。

d633ddf8-cf06-11ed-bfe3-dac502259ad0.png

圖4 反壓限速器

當(dāng)時我們設(shè)計反壓限速器的時候,有一個限制影響了最后的實現(xiàn):

虛機(jī)的虛擬網(wǎng)卡沒有提供 Peek 功能,即 vSwitch 只是 Peek 數(shù)據(jù)包,而非真正將數(shù)據(jù)包從隊列中拿出。這一個限制導(dǎo)致了我們利用了“借貸”的思想。既設(shè)置一個開始輪詢的準(zhǔn)許時間點,如果當(dāng)前時間超過了準(zhǔn)許時間點,那么將隊列中的數(shù)據(jù)包一股腦全部發(fā)出,不考慮令牌是否足夠,如果令牌足夠則沒有問題,但是當(dāng)令牌不夠了,那么就考慮向未來借貸一筆令牌,反向計算出一個未來的時間戳,那么在這個時間戳之前,vSwitch 停止輪詢虛擬網(wǎng)卡。

借貸方法的提出,一開始只是為了性能考慮,避免好不容易將數(shù)據(jù)包從虛機(jī)隊列拷貝出來,卻發(fā)現(xiàn)令牌不夠又只能丟棄。既然不想丟棄,索性就向未來借貸一筆令牌都發(fā)出去。

如今回過頭來看這個設(shè)計,和 Peek 相比,其實有好有壞:

1)每次借貸的令牌量,不可控。這會導(dǎo)致公平性問題。大象流會不斷的獲取借貸資格,而小流則會趨向于餓死,在限速器競爭中,如果一方取得了優(yōu)勢,優(yōu)勢方容易持續(xù)獲得優(yōu)勢。

2)簡單的時間戳比較,開銷比 peek 低。如果能夠 peek 數(shù)據(jù)包,就不會有借貸的機(jī)制,也就沒有停止輪詢的可能,而是每次都會去虛擬隊列里查看,反而開銷有點大。

3)反過來,有 peek 功能的話,也可以先看看隊列里積壓的數(shù)據(jù)包,可以等待隊列積累了一定量數(shù)據(jù)包之后,計算將下一次 Batch 個數(shù)據(jù)包發(fā)出的時間戳,在此之前都停止輪詢。這對增加 batch 提升性能反而有好處。

反壓限速器因為反壓的是虛機(jī)的網(wǎng)卡隊列,只能對虛機(jī)往外發(fā)數(shù)據(jù)包有限制,而無法限制虛機(jī)的收方向的流量。這是因為我們無法反壓物理網(wǎng)卡的數(shù)據(jù)包,物理網(wǎng)卡的數(shù)據(jù)包可能發(fā)往不同的虛擬網(wǎng)卡,每個網(wǎng)卡的限速值是不一樣的,我們無法計算出一個確切的時間點,在這個時間點之前可以不用輪詢數(shù)據(jù)包。況且,物理網(wǎng)卡隊列滿了之后,只會丟包,而虛機(jī)網(wǎng)卡隊列滿了之后,可以反壓 TCP 協(xié)議棧,兩者效果是不一樣的。

因此在入向流量的限制上,我們只是延續(xù)了準(zhǔn)許時間戳的思想。如果當(dāng)前時間超過準(zhǔn)許時間,就放行所有數(shù)據(jù)包,如果沒有,則丟棄所有數(shù)據(jù)包。

第二次改進(jìn):Carousel限速器

Carousel 限速器是 Google 在 SIGCOMM 17' 上的論文提出的一種限速器算法[2],實際上想法也很簡單,即給每個數(shù)據(jù)包計算一個發(fā)出的時間戳,如果當(dāng)前時間戳小于發(fā)出時間戳,則緩存在一個時間輪里,即不是丟包,而是將數(shù)據(jù)包延遲發(fā)送。

d649ad22-cf06-11ed-bfe3-dac502259ad0.png

圖5 Carousel限速器

我們基于這個算法基本原理,在 OVS-DPDK 實現(xiàn)了一個類似限速器,這中間有很多細(xì)節(jié)決定了算法的參數(shù),比如一次輪詢的時間粒度是 1us 還是 10us ?實際使用的限速器的速率區(qū)間在什么范圍?是 300Kpps 還是 3Mpps?這些都直接決定了算法的參數(shù)設(shè)置,諸多細(xì)節(jié)就不展開說明了。

Carousel 最大的一個好處是引入了緩存。時間輪的本質(zhì)就是一個緩存,這個對 TCP 流量有明顯的好處,同時,時間輪也解決了虛機(jī)入向流量的無法反壓的問題,使得所有的流量都能統(tǒng)一在一個時間輪下。第三個好處,可能有點意想不到,就是它一定程度的消除了級聯(lián)補(bǔ)償?shù)谋匾?,因為?shù)據(jù)包不在丟包,而是延遲發(fā)送。在沒有丟包的情況下,不需要級聯(lián)補(bǔ)償。

下圖是在限速 10Gbps 下,通過 iperf 工具,測試 100s 情況下,虛機(jī)出入向,在使用老的反壓限速器和新的 Carousel 限速器的對比效果。

橫軸是時間(s),豎軸是吞吐(Gbps),即每秒 iperf 報告出的當(dāng)前的吞吐性能。可以看到入向流量增加了 500Mbps。更靠近 10Gbps。

d65b60a8-cf06-11ed-bfe3-dac502259ad0.png

出向吞吐性能,可以看出 Carousel 限速器更加穩(wěn)定:

d671e850-cf06-11ed-bfe3-dac502259ad0.png

這些改進(jìn)的源頭,都來自于緩存對 TCP 流量的平滑作用。

未來的改進(jìn)和小結(jié)

1. 進(jìn)一步改進(jìn)

基于借貸機(jī)制的反壓限速,當(dāng)限速值較大時,因借貸超發(fā)的數(shù)據(jù)包對整個限速抖動影響是有限的。比如限速 1G,在某個時刻超發(fā)幾個包,對限速的抖動影響是比較小的。但是如果限速值很小,比如小到 5Mbps,那么超發(fā)幾個數(shù)據(jù)包的影響就會比較大。此時,通過時間戳控制虛機(jī)端口的輪詢,會帶來 ON-OFF 效應(yīng),既在虛機(jī)看來,出向流量的路徑上,好像有一個閘門,一會打開,一會關(guān)閉。

但這只是在虛機(jī)發(fā)送端視角看到的情況,接收端因為有時間輪的調(diào)節(jié),速率會比較穩(wěn)定。為在發(fā)送端帶來比較穩(wěn)定的體驗,需要將反壓的效果更加細(xì)化,既降低超發(fā)的幾率。

此外,基于端口粒度的限速可以通過控制端口的輪詢來實現(xiàn),但是對于粒度小于端口的限速,則不好實現(xiàn)反壓。為了實現(xiàn)更細(xì)粒度的反壓,Google 在論文 PicNIC[3] 中,在Carousel 之上,利用 virtio 支持 OOO completion (亂序完成) 的特點,實現(xiàn)了更細(xì)粒度的反壓,這些都為進(jìn)一步優(yōu)化限速器提供了思路。

2. 主動限速(基于ECN或者修改TCP window選項)

我們可以在 vSwitch 中對 TCP 的 Window 窗口進(jìn)行跟蹤修改,協(xié)商一個小窗口進(jìn)行的方式,獲得更平穩(wěn)的 TCP 吞吐。同時ECN標(biāo)記也可以在 vSwitch 中進(jìn)行感知,通過直接或者間接的方式反饋到虛機(jī)內(nèi)部,或者影響 vSwitch 的輪詢頻率。

3. 鎖機(jī)制改進(jìn)

以上所有的限速器改進(jìn)均是針對網(wǎng)絡(luò)方面,系統(tǒng)方面由于多核存在,而限速器的粒度經(jīng)??缭骄€程,如何設(shè)計一個無鎖的限速器也是一個值得探索的方向。

4. 小結(jié)

從限速器的改進(jìn)歷史中可以看出,當(dāng)前的算法已經(jīng)越來越和實際場景相關(guān)。算法不再只是一個獨立的組件,而越來越和實際的運行系統(tǒng)和產(chǎn)品特性緊密耦合。







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • PPS
    PPS
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    10467
  • RTT
    RTT
    +關(guān)注

    關(guān)注

    0

    文章

    64

    瀏覽量

    16991
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    888

    瀏覽量

    27815
  • TCP通信
    +關(guān)注

    關(guān)注

    0

    文章

    146

    瀏覽量

    4184

原文標(biāo)題:字節(jié)跳動在限速器優(yōu)化上的實踐探索

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    字節(jié)跳動最新回應(yīng):正在探索AI芯片領(lǐng)域

    3月16日消息,字節(jié)跳動正在自研云端AI芯片和Arm服務(wù)芯片。對此,字節(jié)跳動方面向媒體回應(yīng)稱,是
    的頭像 發(fā)表于 03-16 14:53 ?5129次閱讀

    一種基于多令牌的數(shù)據(jù)風(fēng)暴抑制單元

    一種基于多令牌的數(shù)據(jù)風(fēng)暴抑制單元_馬徐瀚
    發(fā)表于 01-07 20:49 ?0次下載

    字節(jié)跳動全面屏電子設(shè)備專利曝光 有望應(yīng)用于字節(jié)跳動旗下堅果手機(jī)

    2月28日消息,天眼查專利數(shù)據(jù)顯示,字節(jié)跳動旗下北京字節(jié)跳動網(wǎng)絡(luò)技術(shù)有限公司近日新增多個專利授權(quán),其中包括“一種全面屏電子設(shè)備”的專利。
    的頭像 發(fā)表于 02-28 14:30 ?2978次閱讀
    <b class='flag-5'>字節(jié)</b><b class='flag-5'>跳動</b>全面屏電子設(shè)備專利曝光 有望應(yīng)用于<b class='flag-5'>字節(jié)</b><b class='flag-5'>跳動</b>旗下堅果手機(jī)

    字節(jié)跳動否認(rèn)微軟求購TikTok全球業(yè)務(wù)_微軟和字節(jié)跳動正探索初步提案

    此前微軟公司一份聲明中確認(rèn),正就收購TikTok美國與字節(jié)跳動開展談判,并不晚于9月15日完成。根據(jù)微軟的聲明,微軟和字節(jié)跳動正在探索一項
    的頭像 發(fā)表于 08-07 09:22 ?2569次閱讀

    字節(jié)跳動正考慮推動抖音業(yè)務(wù)單獨香港上市

    投資界10月26日消息,媒體爆料,字節(jié)跳動正考慮推動抖音業(yè)務(wù)單獨香港上市。知情人士稱,高盛等多家投行曾與字節(jié)跳動溝通承銷事宜。 對此,
    的頭像 發(fā)表于 10-26 17:30 ?2121次閱讀

    字節(jié)跳動精簡枝干,一收再收

    字節(jié)跳動并不能一直成功。最起碼,最近不到一周的時間里,字節(jié)跳動先是官宣關(guān)停 “悟空問答”,接著又確認(rèn)暫停手機(jī)業(yè)務(wù)——這對一向高歌猛進(jìn)的
    的頭像 發(fā)表于 01-21 16:20 ?2267次閱讀
    <b class='flag-5'>字節(jié)</b><b class='flag-5'>跳動</b>精簡枝干,一收再收

    字節(jié)跳動的芯片棋局

    從此前市場中公開的消息來看,字節(jié)跳動正在積極組建AI芯片團(tuán)隊,目前已經(jīng)各大招聘平臺上有不少芯片相關(guān)職位。而從知情人士處的消息中顯示,則是明確了字節(jié)
    的頭像 發(fā)表于 05-17 14:02 ?3596次閱讀

    字節(jié)跳動 收購元宇宙公司

    元宇宙可以理解為超越現(xiàn)實的虛擬宇宙,近日字節(jié)跳動公司CEO張一鳴將投入15億美元收購VR軟硬件研發(fā)制造商“Pico”,這一投資標(biāo)志著字節(jié)跳動
    的頭像 發(fā)表于 11-08 15:54 ?3654次閱讀

    字節(jié)跳動基于Iceberg的海量特征存儲實踐

    字節(jié)跳動基于Iceberg的海量特征存儲實踐
    的頭像 發(fā)表于 12-01 09:37 ?863次閱讀

    字節(jié)跳動旗下火山引擎自研的視頻編解碼芯片已出片

    跳動自研芯片將為字節(jié)跳動大規(guī)模視頻推薦服務(wù)專用場景定制硬件優(yōu)化,如視頻編解碼、云端推理加速等,以期提升性能,降低成本。這款字節(jié)
    的頭像 發(fā)表于 08-23 18:56 ?1991次閱讀

    字節(jié)跳動旗下PICO近半員工離職 但字節(jié)跳動表示會長期投入XR

    字節(jié)跳動旗下PICO近半員工離職 但字節(jié)跳動表示會長期投入XR 有媒體報道字節(jié)跳動旗下PICO
    的頭像 發(fā)表于 10-24 17:38 ?1558次閱讀

    字節(jié)跳動「突襲」交換機(jī)!

    因為字節(jié)跳動自研交換機(jī),早在2019年,就開始悄悄布局了。
    的頭像 發(fā)表于 02-26 15:34 ?1066次閱讀
    <b class='flag-5'>字節(jié)</b><b class='flag-5'>跳動</b>「突襲」交換機(jī)!

    字節(jié)跳動否認(rèn)AI手機(jī)研發(fā)項目

    近日,有市場傳聞稱字節(jié)跳動已在兩個月前秘密啟動了AI手機(jī)研發(fā)項目,引發(fā)業(yè)界廣泛關(guān)注。然而,字節(jié)跳動相關(guān)人士迅速對此作出回應(yīng),表示這些消息并不屬實。
    的頭像 發(fā)表于 06-12 15:54 ?408次閱讀

    字節(jié)跳動回應(yīng)要進(jìn)軍手機(jī)市場

    近日,關(guān)于字節(jié)跳動秘密啟動AI手機(jī)研發(fā)項目的傳聞引起了廣泛關(guān)注。然而,字節(jié)跳動相關(guān)人士12日對此進(jìn)行了澄清,表示這一消息并不屬實。
    的頭像 發(fā)表于 06-13 11:48 ?628次閱讀

    字節(jié)跳動否認(rèn)與臺積電合作AI芯片

    近日,關(guān)于字節(jié)跳動計劃與臺積電攜手開發(fā)AI芯片的報道引發(fā)關(guān)注。對此,字節(jié)跳動迅速作出回應(yīng),明確表示該報道不實。字節(jié)方面透露,公司確實在芯片領(lǐng)
    的頭像 發(fā)表于 09-19 16:04 ?103次閱讀