高並發系統有三把利器用來保護系統:緩存、降級和限流。
- 緩存:緩存的目的是提升系統訪問速度和增大系統處理容量
- 降級:降級是當服務器壓力劇增的情況下,根據當前業務情況及流量對一些服務和頁面有策略的降級,以此釋放服務器資源以保證核心任務的正常運行
- 限流:限流的目的是通過對並發訪問/請求進行限速,或者對一個時間窗口內的請求進行限速來保護系統,一旦達到限制速率則可以拒絕服務、排隊或等待、降級等處理
要實現流量的控制,必須有一種機制可以對通過設備的流量進行度量。令牌桶(Token-Bucket)是目前最常采用的一種流量測量方法,用來評估流量速率是否超過了規定值。這里的令牌桶是指網絡設備的內部存儲池,而令牌則是指以給定速率填充令牌桶的虛擬信息包。
令牌桶可以看作是一個存放令牌的容器,預先設定一定的容量。系統按設定的速度向桶中放置令牌,當桶中令牌滿時,多余的令牌溢出。令牌桶只是一種流量測量方法,並不能對流量進行過濾或采取某種措施,比如說丟棄數據包等,這些操作由其他功能完成,而且令牌桶中裝的是令牌而不是報文分組。
圖1 令牌桶示意圖
當數據流到達設備時首先會根據數據的大小從令牌桶中取出與數據大小相當的令牌數量用來傳輸數據(RFC 標准中定義的大小以 b/s 為單位)。也就是說要使數據被傳輸必須保證令牌桶里有足夠多的令牌,如果令牌數量不夠,則數據會被丟棄或緩存。這就可以限制報文的流量只能小於等於令牌生成的速度,達到限制流量的目的。
圖2 使用令牌桶處理報文示意圖
關於令牌桶處理報文的方式,RFC中定義了兩種令牌桶算法
- 單速率三色標記(single rate three color marker,srTCM,RFC2697 定義,或稱為單速雙桶算法)算法,主要關注報文尺寸的突發。
- 雙速率三色標記(two rate three color marker,trTCM,RFC2698 定義,或稱為雙速雙桶算法)算法,主要關注速率的突發。
兩種算法的評估結果都是為報文打上紅、黃、綠三種顏色的標記,所以稱為“三色標記”。 QoS 會根據報文的顏色,設置報文的丟棄優先級,兩種算法都可工作於色盲模式和非色盲模式。
單速雙桶算法(srTCM)
- 單速雙桶令牌桶參數
- CIR(Committed Information Rate):承諾信息速率,單位是 bit/s,表示向令牌桶中投放令牌的速率。
- CBS(Committed Burst Size):承諾突發尺寸,單位是 bit,用來定義在部分流量超 過CIR之前的最大突發流量,即為令牌桶的容量(深度)。承諾突發尺寸必須大於報文的最大長度(最大時一個分組可以領取桶中的全部令牌)。CBS 越大,表示所允許的突發量越大。
- EBS(Extended burst size):超額突發尺寸,用來定義在所有流量超過CIR之前的 最大突發量。
- 單速雙桶令牌桶結構 雙桶結構由兩個桶實現,為方便將兩個令牌桶稱為C桶和E桶。C 桶容量為CBS, E 桶容量為EBS,總容量是CBS+EBS。如果不允許有突發流量,EBS 則設置成 0。 當 EBS≠0 時,稱為單速雙桶。當 EBS=0,E桶的令牌數始終為 0,相當於只使用了一個令牌桶——C桶,這種情況也稱為單速單桶。
圖3 單速雙令牌桶示意圖
- 單速雙桶令牌添加方式
單速雙桶令牌添加方式比較簡單,先以CIR的速率往C桶中添加令牌,當C桶容 量到達 CBS 后(C桶滿了),再以相同的速率往E 桶中添加令牌(E 桶的令牌用做 以后臨時超過CIR的突發流量),當E桶容量到達 EBS 后(E 桶也滿了),則新產 生的令牌將會被丟棄。 初始狀態下,C 桶和 E桶都是滿的。
- 單速雙桶流量評估規則
當報文到來后,直接與桶中的令牌數相比較,如果有足夠的令牌就轉發(通常用一個令牌關聯一個比特的轉發權限),如果沒有足夠的令牌則丟棄或緩存。 為方便表示,用 Tc 和 Te 表示桶中的令牌數量,Tc 和 Te 初始化等於CBS 和EBS。
色盲模式下,在對到達報文(假設報文大小為B)進行評估時,遵循以下規則:
- 對於單速單桶(EBS=0):
- 如果報文長度不超過 C桶中的令牌數 Tc,則報文被標記為綠色,且 Tc=Tc-B;
- 如果報文長度超過C 桶中的令牌數 Tc,報文被標記為紅色,Tc 值不變。
- 對於單速雙桶(EBS≠0):
- 如果報文長度不超過 C桶中的令牌數 Tc,則報文被標記為綠色,且 Tc=Tc-B;
- 如果報文長度超過C 桶中的令牌數 Tc 但不超過E 桶中的令牌數 Te,則報文被 標記為黃色,且 Te=Te-B;
如果報文長度超過E 桶中的令牌數 Te,報文被標記為紅色,但 Tc 和 Te 不變。
色敏模式下,在對到達報文(假設報文大小為B)進行評估時,遵循以下規則:
- 對於單速單桶(EBS=0):
- 如果報文已被標記為綠色但報文長度不超過C 桶中的令牌數 Tc,則報文被標記為綠色,且 Tc=Tc-B;
- 如果報文已被標記為綠色且報文長度超過 C桶中的令牌數 Tc,則報文被標記為紅色,Tc 保持不變;
- 如果報文已被標記為黃色或紅色,都直接將報文標記為紅色,Tc 保持不變;
- 對於單速雙桶(EBS≠0):
- 如果報文已被標記為綠色且報文長度不超過C桶中的令牌數 Tc,則報文被標記為綠色,且 Tc=Tc-B;
- 如果報文已被標記為綠色且報文長度超過C桶中的令牌數Tc但不超過E桶中的令牌數Te,則報文被標記為黃色,且 Te=Te-B;
- 如果報文已被標記為黃色但報文長度不超過E桶中的令牌數 Te,則報文被標記為黃色,且 Te=Te-B;
- 如果報文已被標記為黃色且報文長度超過E桶中的令牌數 Te,則報文被標記為紅色,且Te保持不變;
- 如果報文已被標記為紅色,直接將報文標記為紅色,Tc 和Te不變。
雙速雙桶算法(trTCM)
- 雙速雙桶令牌桶參數
- CIR(Committed Information Rate):承諾信息速率,表示端口允許的信息流平均速率,單位是 bit/s。
- CBS(Committed Burst Size):承諾突發尺寸,用來定義在部分流量超過CIR之前 的最大突發流量,單位為 bit。承諾突發尺寸必須不小於報文的最大長度。
- PIR(Peak Information Rate):表示峰值信息速率,表示端口允許的突發流量的最大速率,單位是 bit/s。該值必須不小於CIR的設置值。
- PBS(Peak Burst Size):表示峰值突發尺寸,用來定義每次突發所允許的最大的流量尺寸。
- 雙速雙桶令牌桶結構
雙速率三色標記算法業界都使用兩個令牌桶,但它關注的是速率的突發,所以不像單速率三色標記算法那樣把第一個桶中溢出的令牌放到第二個桶中,而是使用兩個獨立的令牌桶,存在兩個令牌填充速率。為方便將兩個令牌桶稱為C桶和P桶,C桶容量為CBS,令牌填充速率為CIR,P桶容量為PBS,令牌填充速率為 PIR。
圖4 雙速雙桶示意圖
- 雙速雙桶令牌添加方式
初始狀態時C桶和P桶都是滿的。往C桶和P桶分別以CIR和PIR的速率填充令牌。因這兩個令牌桶是相互獨立的,當其中一個桶被填滿時,這個桶新產生的令牌將會被丟棄,而另一個桶則不受影響,繼續填充令牌。
- 雙速雙桶流量評估規則
雙速率三色標記算法關注的是速率的突發,首先評估的是數據流的速率是否符合規定的突發要求,其規則是先比較P桶,再比較C桶。 雙速率三色標記算法也有色盲模式和色敏模式兩種。為方便用Tc和Tp表示桶中的令牌數量,Tc 和 Tp 初始化等於CBS 和PBS。
色盲模式下,在對到達報文(假設數據包大小為B)進行評估時,遵循以下規則:
- 如果報文長度超過P桶中的令牌數Tp,則報文被標記為紅色,且Tc和Tp保持 不變,
- 如果報文長度不超過P桶中的令牌數 Tp 但超過C桶中的令牌數 Tc,則報文被標記為黃色,且 Tp=Tp-B,
- 如果報文長度不超過C桶中的令牌數Tc,報文被標記為綠色,且 Tp=Tp-B, Tc=Tc-B。
色敏模式下,在對到達報文(假設報文大小為 B)進行評估時,遵循以下規則:
- 如果報文已被標記為綠色且報文長度超過P桶中的令牌數Tp,則報文被標記為紅色,且 Tp 和 Tc 不變。
- 如果報文已被標記為綠色且報文長度不超過P桶中的令牌數Tp但超過C桶中的令牌數 Tc,則報文被標記為黃色,且 Tp=Tp-B,Tc 不變。
- 如果報文已被標記為綠色且報文長度不超過C 桶中的令牌數 Tc,則報文被標記為綠色,且 Tp=Tp-B,Tc=Tc-B。
- 如果報文已被標記為黃色,則只比較P桶,如果報文長度超過P桶中的令牌數 Tp,則報文被標記為紅色,且 Tp 和 Tc 不變。
- 如果報文已被標記為黃色,且報文長度不超過P桶的令牌數,則報文被標記為 黃色,且 Tp=Tp-B,Tc 不變。
- 如果報文已被標記為紅色,直接將報文標記為紅色,Tc 和 Tp 不變。