柚子快報(bào)邀請(qǐng)碼778899分享:在數(shù)據(jù)中心網(wǎng)絡(luò)中隔離大象流
柚子快報(bào)邀請(qǐng)碼778899分享:在數(shù)據(jù)中心網(wǎng)絡(luò)中隔離大象流
1000 條短突發(fā)中混入幾條大象流將嚴(yán)重影響短突發(fā) p99 latency,造成抖動(dòng)。這個(gè)我在 隔離網(wǎng)絡(luò)流以優(yōu)化網(wǎng)絡(luò) 論證過了,還有另一種更直觀的理解方式:
規(guī)模差異越大,算術(shù)均值越偏離中位數(shù),即算術(shù)均值的分位數(shù)越高。
可以看出,無論洛倫茲曲線,基尼系數(shù),或更普遍意義的 CDF 曲線,都能看出一個(gè)意思,擴(kuò)大差異就拉高了均值和中位數(shù)之間的 gap,顯得越發(fā)不公平。這里沒有假設(shè)數(shù)據(jù)的任何分布特征,這是一般意義上的理解而不為建模,但它可以直擊 p99,p90,p75 數(shù)據(jù)異常的本質(zhì)。
早些年用指數(shù)分布建模的網(wǎng)絡(luò)流量模型已不適用,現(xiàn)在微服務(wù)網(wǎng)絡(luò),AI 網(wǎng)絡(luò)以及混雜著各種流量的云網(wǎng)絡(luò)流量均展現(xiàn)出長(zhǎng)程依賴,流量模型更符合帕累托分布,極少數(shù)大象流貢獻(xiàn)了超過一半的流量以及絕大多數(shù)的時(shí)延抖動(dòng),因此,隔離大象流是高尚的。
還是那句話,按流的長(zhǎng)度將不同流量裝入不同的虛通道,以虛通道為粒度進(jìn)行資源分配和資源隔離,就香了。
我曾建議應(yīng)用程序自行用 getlength 獲取數(shù)據(jù)長(zhǎng)度,自行將流量按長(zhǎng)度分類,但他們不肯。上層不配合提供有效信息,底層就要猜,這跟端到端擁塞控制的痛點(diǎn)一樣痛,網(wǎng)絡(luò)不提供有效信息,主機(jī)就要猜,所以知道 ecn 到底厲害在哪了吧。
既然猜就有誤判,誤判就有代價(jià),成本是一定要支付的,所以要承認(rèn)再好的啟發(fā)式算法都有上限。 如果知道流量的統(tǒng)計(jì)分布就好辦,但往往沒有任何統(tǒng)計(jì)分布可以準(zhǔn)確擬合數(shù)據(jù),為了建模方便,我們假設(shè)流量的生存時(shí)間符合帕累托分布,問題顯然就是給定一條流已經(jīng)存活的時(shí)間 t,求它剩余壽命的期望。這是一道看起來不難,但算起來很麻煩的數(shù)學(xué)題。
帕累托分布的累積分布函數(shù)(CDF)為
F
(
x
;
α
,
θ
)
=
1
?
(
θ
x
)
α
F(x; \alpha, \theta)=1 - \left(\frac{\theta}{x}\right)^{\alpha}
F(x;α,θ)=1?(xθ?)α,如果一條流已經(jīng)持續(xù)了時(shí)間 t(且
t
≥
θ
t \geq \theta
t≥θ),我們想要知道在此之后的剩余壽命,我們可以考慮事件在 ( t ) 時(shí)刻還未結(jié)束的概率,這實(shí)際上是條件分布的概念。
首先,我們需要計(jì)算該流已至少持續(xù)到時(shí)間 t 的概率,即 P(X>t)。根據(jù) CDF,它是
1
?
F
(
t
;
α
,
θ
)
=
(
θ
t
)
α
1 - F(t; \alpha, \theta) = \left(\frac{\theta}{t}\right)^{\alpha}
1?F(t;α,θ)=(tθ?)α ,接下來,為找到剩余壽命的條件分布,理論上需要對(duì)原始的帕累托分布進(jìn)行適當(dāng)縮放和規(guī)范化,使得它反映的是在 t 后的分布情況。在實(shí)踐中需要依賴于數(shù)值模擬或高級(jí)統(tǒng)計(jì)方法來近似。
在上述理論下,如果我們已有流量長(zhǎng)度的采樣數(shù)據(jù),就可得到一個(gè)更準(zhǔn)確的分布(它不是建模用的帕累托分布),我們可以看出樣本長(zhǎng)度都集中在哪些區(qū)間,比如 80% 的流都只有 200us,有 10% 的流持續(xù) 1ms,8% 的流持續(xù) 5~10ms,1.5% 的流持續(xù) 800ms~20s,0.5% 的流持續(xù)到分鐘級(jí)。如果有個(gè)流已經(jīng)存活了 300us,顯然我們就可以非常斬釘截鐵地將其踢出短突發(fā)類別,以此類推。
實(shí)現(xiàn)很簡(jiǎn)單,借用 linux kernel 的 nf_conntrack,記錄 conntrack 創(chuàng)建時(shí)間 t_start,主機(jī)流量進(jìn)入網(wǎng)絡(luò)前,計(jì)算 len = t_curr - conn.t_start,如果 len 統(tǒng)計(jì)數(shù)據(jù)中短突發(fā)區(qū)間上四分位值(即 p75 長(zhǎng)度),就歸入下一個(gè)類別,以此類推。
這種簡(jiǎn)單直接的做法非常有效,即使存在將流納入大象流后它馬上就結(jié)束了的可能,也不會(huì)有任何損失,首先,它已經(jīng)離開了短流類別,無傷短流,其次它在該類別尚未有所作用力前就結(jié)束了,無傷自己和長(zhǎng)流,如果它還將繼續(xù)存活很久,那它將繼續(xù)上升到更長(zhǎng)的流類別中重復(fù)這樣的事,在它所屬某個(gè)類別的那段時(shí)間,它將和同屬于該類別的其它流進(jìn)入同一個(gè)虛通道。這保證了在某個(gè)特定的虛通道中,流量規(guī)模的差異很小,適合采用同一種調(diào)度策略。
如果不想借用 nf_conntrack,類似的實(shí)現(xiàn)邏輯也差不多,主要因?yàn)楫?dāng)前提到 nf_conntrack 這種老式機(jī)制太 low 了,還是要往 smartnic,ebpf,xdp,dpdk 上靠,但原理大差不差。比如實(shí)現(xiàn)下面的邏輯:
Mark(pkt):
key = hash(pkt)
If flow[key].queue == null
flow[key].queue = new_queue
flow[key].queue.cnt = INIT_CNT
flow[key].queue.cnt += pkt.pacing_gap
flow[key].queue.len += pkt.pacing_gap
pkt.type = flow[key].queue.len
Timer(10us):
for each flow[i]:
flow[i].queue.cnt -= DELTA_GAP
if flow[i].queue.cnt == 0
free flow[i].queue
如果怕短突發(fā)給 hash 沖突到長(zhǎng)流里,就做個(gè)多輪 hash 起個(gè) bloom filter 的作用。
類似的一個(gè)策略我在 dcn 隔離長(zhǎng)短流的 aqm 里提到過,但它側(cè)重隊(duì)列和調(diào)度管理,本文描述的算法是部署在端主機(jī)的,在流量進(jìn)入網(wǎng)絡(luò)之前就將其按大小分門別類后注入特定虛通道,和 aqm 本質(zhì)上不同。
浙江溫州皮鞋濕,下雨進(jìn)水不會(huì)胖。
柚子快報(bào)邀請(qǐng)碼778899分享:在數(shù)據(jù)中心網(wǎng)絡(luò)中隔離大象流
推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。