導航:首頁 > 源碼編譯 > java漏桶演算法

java漏桶演算法

發布時間:2022-10-04 09:31:27

Ⅰ 流量整形的流量整形的核心演算法

流量整形的核心演算法有以下兩種,具體採用的技術為GTS(Generic Traffic Shaping),通用流量整形: 漏桶演算法(Leaky Bucket)
漏桶演算法是網路世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)時經常使用的一種演算法,它的主要目的是控制數據注入到網路的速率,平滑網路上的突發流量。漏桶演算法提供了一種機制,通過它,突發流量可以被整形以便為網路提供一個穩定的流量。 令牌桶演算法(Token Bucket)
有時人們將漏桶演算法與令牌桶演算法錯誤地混淆在一起。而實際上,這兩種演算法具有截然不同的特性並且為截然不同的目的而使用。它們之間最主要的差別在於:漏桶演算法能夠強行限制數據的傳輸速率,而令牌桶演算法能夠在限制數據的平均傳輸速率的同時還允許某種程度的突發傳輸。
在某些情況下,漏桶演算法不能夠有效地使用網路資源。因為漏桶的漏出速率是固定的參數,所以即使網路中不存在資源沖突(沒有發生擁塞),漏桶演算法也不能使某一個單獨的流突發到埠速率。因此,漏桶演算法對於存在突發特性的流量來說缺乏效率。而令牌桶演算法則能夠滿足這些具有突發特性的流量。通常,漏桶演算法與令牌桶演算法可以結合起來為網路流量提供更大的控制。

Ⅱ 什麼是漏桶演算法和令牌桶演算法

什麼是令牌桶
在我們討論突發數據量之前,我們首先要理解令牌桶的概念。令牌桶本身沒有丟棄
和優先順序策略,
令牌桶是這樣工作的:
1. 令牌以一定的速率放入桶中。
2. 每個令牌允許源發送一定數量的比特。
3. 發送一個包,流量調節器就要從桶中刪除與包大小相等的令牌數。
4. 如果沒有足夠的令牌發送包,這個包就會等待直到有足夠的令牌(在整形
器的情況下)或者包被丟棄,也有可能被標記更低的DSCP(在策略者的情況下)。
5. 桶有特定的容量,如果桶已經滿了,新加入的令牌就會被丟棄。因此,在
任何時候,源發送到網路上的最大突發數據量與桶的大小成比例。令牌桶允許突發,
但是不能超過限制。
Cisco IOS 流量策略(Traffic Policers)
IOS支持兩種流量策略:
1. 傳統的Cisco流量策略:CAR承諾接入速率,使用命令
Router(config-if)#rate-limit {input | output} CIR (bps)
Bc(burst-normal) Be(burst-max) conform-action action exceed-action action
2. 新型的Cisco流量策略:基於類的策略(Class-based policer),使用模
塊化Qos CLI(MQC)語法。可以使用MQC命令建立流量策略並把策略應用到介面。
一個流量策略包括一個流量類(traffic class)和一個或多個Qos特性。Policy
命令用來執行流量策略特性,它指定了一個流量類所需要的最大速率,超過這個速
率Qos系統會立刻執行一個操作,標準的操作是丟棄或重置包頭的DSCP欄位。Policy
命令的語法是:
police cir<bps> Bc<bc> Be<be> conform<conform-action> exceed
<exceed-action> violate<violate-action>
理解Bc和Be
對於超額的數據包,流量策略並不會把它們緩存稍候轉發,只有整形器(shaper)
會這樣做。流量策略只執行一個發送或不發送的策略。因為不能緩存數據包,所以
在發生擁塞時,所能做的最好的方法就是通過配置適當的超額突發數據量Be來不那
么過分的丟棄數據包。這一點對理解流量策略使用Bc和Be來保證達到CIR是非常
重要的。
超額參數模仿路由器的通用緩存規則。The rule recommends configuring buffering
equal to the round-trip time bitrate to accommodate the outstanding TCP
windows of all connections in times of congestion.
突發參數 目的 推薦公式
普通突發 · 執行標準的令牌桶 · 設置最大數量的令牌(盡管如
果Be>Bc的話可以借到令牌). · 決定令牌桶有多大,因為如果桶已經滿了那麼令
牌將被丟棄而不會再加入到桶中。 CIR [bps] * (1 byte)/(8 bits) * 1.5
seconds Note: 1.5 seconds is the typical round trip time.
超額突發 · 為令牌桶提供超額突發能力 · 如果Bc = Be那麼不
支持超額突發 · 當Bc = Be,流量調節器就不能借令牌,當令牌不夠時只能丟棄數
據包 兩倍的Bc
對TCP流量的測試表明,Bc 和Be的數值應該近似等於配置的平均速率在兩秒鍾內
的流量。如果你想限制流量在1Mb,應該把Bc 設置在1-2Mb,Be在2-4Mb。
舉個例子,如果我們想把輸出速率限制在1.5Mbps,我們可以做一下步驟:
1. 把承諾速率從比特轉換成位元組,因為突發數據量的單位為位元組。
1500000 bits / 8 bits = 187500 bytes
2. 使用標準的1.5秒往返時間(round-trip time)計算Bc
187500 bytes * 1.5秒 = 281250 bytes
3. 兩倍的Bc為Be
281250 bytes * 2 = 562500 bytes
使用命令
rate-limit input 1500000 281250 562500 conform-action {action}
exceed-action {action}
超額突發數據量
當數據包到達時可用的令牌數目小於包的大小,就可以使用超額突發數據量。包會
請求借用令牌。可以通過配置大於Bc的Be的數值來為令牌桶提供超額突發能力。
可以通過下面兩個例子來理解Be。
第一個例子說明怎樣配置CAR策略來允許所有的IP流量。管理員在T3線路上提供
了便宜的20Mbps的子速率服務。用戶只花費子速率帶寬的金額,也可以按需要增加
帶寬。CAR限制了用戶可用的流量速率,用戶只能使用規定的速率加上承諾的突發
數據量。可以適當的設置Be=32000。
interface hssi 0/0/0
rate-limit output 20000000 24000 32000 conform-action transmit
exceed-action drop
下一個例子,用戶只能發送24000位元組的突發數據量,所有超過限制的數據包都要
被丟棄,因為設置Bc=Be,數據包流不能通過超額突發能力來借用令牌。
interface Hssi0/0/0
rate-limit output 20000000 24000 24000 conform-action transmit
exceed-action drop
正確設置突發數據量的重要性
策略以位元組為單位指定了突發數據量,基於類的策略(class-based policer)支持
最小的突發數據量為1000位元組,包括第二層包頭。
突發數據量的目的是逐漸的丟棄數據包,就像RED那樣,並且避免尾丟棄。設置足
夠高的突發數據量對保證良好的吞吐量是非常重要的。
設置突發數據量時,考慮一下內容:
1. 如果突發數據量設置的過低,數據到達的速率將遠遠低於配置的速率。
2. 懲罰暫時突發對TCP流的吞吐量來說是相當不利的,具體情況請察看RFC
2001 and Random Early Detection (RED) gateways for Congestion Avoidance。
設置突發數據量來允許路由器容納暫時突發。
3. 對離開介面的數據包的處理基於包的大小和桶中剩餘的令牌數。
4. 在基於類的策略中,流量測量器不論介面是否擁塞都是激活的。每個包都
會經過令牌桶測量系統來決定是否符合配置的參數。
5. 如果數據突發量非常大而且非常突然,那麼配置較高的超額突發數據量可
以保證超額令牌桶中存放較多的令牌。而且可以調整介面的MTU等於或大於突發數
據量大小。
允許的突發數據量數值
最初,包括IOS12.0,rate-limit命令支持承諾和超額的突發數據量的范圍是:
Router1(config-if)#rate-limit input 18000000 ?
<8000-2000000> Normal burst bytes
Router1(config-if)#rate-limit input 18000000 2000000 ?
<8000-8000000> Maximum burst bytes
Router1(config-if)#rate-limit input 18000000 2000000
IOS12.1增加了突發數據量的最大值:
7500-107(config)#interface atm 1/0/0
7500-107(config-if)#rate-limit output ?
<8000-2000000000> Bits per second
access-group Match access list
qos-group Match qos-group ID<b

Ⅲ redis和mysql在處理高並發問題時有什麼差異

我的理解:
1、mysql支持sql查詢,可以實現一些關聯的查詢以及統計;
2、redis對內存要求比較高,在有限的條件下不能把所有數據都放在redis;
3、mysql偏向於存數據,redis偏向於快速取數據,但redis查詢復雜的表關系時不如mysql,所以可以把熱門的數據放redis,mysql存基本數據

看項目用在哪個地方吧,根據各自的所長結合起來才好用。

Ⅳ 關於MySQL高並發處理機制是如何實現

限流演算法目前程序開發過程常用的限流演算法有兩個:漏桶演算法和令牌桶演算法。

漏桶演算法

漏桶演算法的原理比較簡單,請求進入到漏桶中,漏桶以一定的速率漏水。當請求過多時,水直接溢出。可以看出,漏桶演算法可以強制限制數據的傳輸速度。如圖所示,把請求比作是水滴,水先滴到桶里,通過漏洞並以限定的速度出水,當水來得過猛而出水不夠快時就會導致水直接溢出,即拒絕服務。

圖片來自網路

漏桶演算法和令牌桶演算法的選擇

兩者的主要區別漏桶演算法能夠強行限制處理數據的速率,不論系統是否空閑。而令牌桶演算法能夠在限制數據的平均處理速率的同時還允許某種程度的突發流量。如何理解上面的含義呢?漏桶演算法,比如系統吞吐量是 120/s,業務請求 130/s,使用漏斗限流 100/s,起到限流的作用,多餘的請求將產生等待或者丟棄。對於令牌桶演算法,每秒產生 100 個令牌,系統容量 200 個令牌。正常情況下,業務請求 100/s 時,請求能被正常被處理。當有突發流量過來比如 200 個請求時,因為系統容量有 200 個令牌可以同一時刻處理掉這 200 個請求。如果是漏桶演算法,則只能處理 100 個請求,其他的請求等待或者被丟棄。

Ⅳ 如何設計一個支持高並發的高可用服務

服務程序最為關鍵的設計是並發服務模型,當前有以下幾種典型的模型:-單進程服務,使用非阻塞IO使用一個進程服務多個客戶,通常與客戶通信的套接字設置為非阻塞的,阻塞只發生在select()、poll()、epoll_wait()等系統調用上面。這是一種行之有效的單進程狀態機式服務方式,已被廣泛採用。缺點是它無法利用SMP(對稱多處理器)的優勢,除非啟動多個進程。此外,它嘗試就緒的IO文件描述符後,立即從系統調用返回,這會導致大量的系統調用發生,尤其是在較慢的位元組傳輸時。select()本身的實現也是有局限的:能打開的文件描述符最多不能超過FD_SETSIZE,很容易耗盡;每次從select()返回的描述符組中掃描就緒的描述符需要時間,如果就緒的描述符在末尾時更是如此(epoll特別徹底修復了這個問題)。-多進程服務,使用阻塞IO也稱作accept/fork模型,每當有客戶連線時產生一個新的進程為之服務。這種方式有時是必要的,比如可以通過操作系統獲得良好的內存保護,可以以不同的用戶身份運行程序,可以讓服務運行在不同的目錄下面。但是它的缺點也很明顯:進程比較占資源,進程切換開銷太大,共享某些信息比較麻煩。Apache1.3就使用了這種模型,MaxClients數很容易就可以達到。-多線程服務,使用阻塞IO也稱之accept/pthread_create模型,有新客戶來時創建一個服務線程而不是服務進程。這解決了多進程服務的一些問題,比如它佔用資源少,信息共享方便。但是麻煩在於線程仍有可能消耗光,線程切換也需要開銷。-混合服務方式所謂的混合服務方式,以打破服務方和客戶方之間嚴格的1:1關系。基本做法是:新客戶到來時創建新的工作線程,當該工作線程檢測到網路IO會有延遲時停止處理過程,返回給Server一個延遲處理狀態,同時告訴Server被延遲的文件描述符,延遲超時時間。Server會在合適的時候返回工作線程繼續處理。注意這里的工作線程不是通過pthread_create()創建的,而是被包裝在專門用於處理延遲工作的函數里。這里還有一個問題,工作線程如何檢測網路IO會有延遲?方法有很多,比如設置較短的超時時間調用poll(),或者甚至使用非阻塞IO。如果是套接字,可以設置SO_RCVTIMEO和SO_SNDTIMEO選項,這樣更有效率。除了延遲線程,Server還應提供了未完成線程的支持。如有有特別耗費時間的操作,你可以在完成部分工作後停止處理,返回給Server一個未完成狀態。這樣Server會檢查工作隊列是否有別的線程,如果有則讓它們運行,否則讓該工作線程繼續處理,這可以防止某些線程挨餓。典型的一個混合服務模型開源實現ServerKitServerkit的這些線程支持功能可簡化我們的服務程序設計,效率上應該也是有保證的。2.隊列(queue)ServerKit提供的隊列是一個單向鏈表,隊列的存取是原子操作,如果只有一個執行單元建議不要用,因為原子操作的開銷較大。3.堆(heap)malloc()分配內存有一定的局限,比如在多線程的環境里,需要序列化內存分配操作。ServerKit提供的堆管理函數,可快速分配內存,可有效減少分配內存的序列化操作,堆的大小可動態增長,堆有引用計數,這些特徵比較適合多線程環境。目前ServerKit堆的最大局限是分配單元必須是固定大小。4.日誌記錄日誌被保存在隊列,有一個專門的線程處理隊列中的日誌記錄:它或者調用syslog()寫進系統日誌,或者通過UDP直接寫到遠程機器。後者更有效。5.讀寫鎖GNUlibc也在pthreads庫里實現了讀寫鎖,如果定義了__USE_UNIX98就可以使用。不過ServerKit還提供了讀寫鎖互相轉換的函數,這使得鎖的應用更為彈性。比如擁有讀鎖的若干個線程對同一個hash表進行檢索,其中一個線程檢索到了數據,此時需要修改它,一種法是獲取寫鎖,但這會導致釋放讀鎖和獲取寫鎖之間存在時間窗,另一種法是使用ServerKit提供的函數把讀鎖轉換成寫鎖,無疑這種方式更有效率。除了以上這些功能,ServerKit還提供了資料庫連接池的管理(當前只支持MySQL)和序列化(Sequences),如感興趣可參見相關的API文檔。二、ServerKit服務模塊編寫ServerKit由3部分組成:server程序,負責載入服務模塊、解析配置文件、建立資料庫連接池;libserver,動態鏈接庫,提供所有功能的庫支持,包括server本身也是調用這個庫寫的;API,編程介面,你編寫的服務模塊和ServerKit框架進行對話的介面。ServerKit需要libConfuse解析配置文件,所以出了安裝ServerKit,還需要安裝libConfuse。關於libConfuse可參考。下面我們看一個簡單的服務模塊FOO:#include#includestaticlongintsleep_ration;staticintFOO_construct(){fprintf(stderr,"FOO_construct\n");return1;}staticintFOO_prestart(cfg_t*configuration){fprintf(stderr,"FOO_prestart\n");return1;}staticvoid*FOO_operator(void*foobar){fprintf(stderr,"FOO_operator\n");for(;;)sleep(sleep_ration);returnNULL;}staticvoidFOO_report(void){fprintf(stderr,"FOO_report\n");}staticcfg_opt_tFOO_config[]={CFG_SIMPLE_INT("sleep_ration",&sleep_ration),CFG_END()};staticchar*FOO_authors[]={"VitoCaputo",NULL};SERVER_MODULE(FOO,0,0,1,"")按以下方法編譯:$gcc-c-fPIC-pthread-D_REENTRANT-gFOO.c$gcc-shared-lserver-lconfuse-lpthread-g-e__server_mole_main-oFOO.soFOO.o-e選項指定程序運行入口,這使得你可以直接在命令行敲./FOO.so運行模塊。server程序根據環境變數SERVER_PERSONALITY_PATH定位主目錄,並查找主目錄下的c11n作為配置文件,動態載入的模塊需放在主目錄下的moles目錄。$exportSERVER_PERSONALITY_PATH=`pwd`$mkdirmoles$cpFOO.somoles$vic11nc11n的內容:identity="any_id"FOO{sleep_ration=1;}identity標識server實例,用ps可看到程序名稱形如server.identity,本例為server.any_id。執行server啟動服務程序。三、ServerKit其他功能缺陷缺乏daemon模式;只能運行在Linuxbox;DBpool只支持MySQL;Heap管理內存的功力有限

Ⅵ mysql資料庫怎麼解決高並發問題

限流演算法目前程序開發過程常用的限流演算法有兩個:漏桶演算法和令牌桶演算法。

漏桶演算法

漏桶演算法的原理比較簡單,請求進入到漏桶中,漏桶以一定的速率漏水。當請求過多時,水直接溢出。可以看出,漏桶演算法可以強制限制數據的傳輸速度。如圖所示,把請求比作是水滴,水先滴到桶里,通過漏洞並以限定的速度出水,當水來得過猛而出水不夠快時就會導致水直接溢出,即拒絕服務。

圖片來自網路

漏桶演算法和令牌桶演算法的選擇

兩者的主要區別漏桶演算法能夠強行限制處理數據的速率,不論系統是否空閑。而令牌桶演算法能夠在限制數據的平均處理速率的同時還允許某種程度的突發流量。如何理解上面的含義呢?漏桶演算法,比如系統吞吐量是 120/s,業務請求 130/s,使用漏斗限流 100/s,起到限流的作用,多餘的請求將產生等待或者丟棄。對於令牌桶演算法,每秒產生 100 個令牌,系統容量 200 個令牌。正常情況下,業務請求 100/s 時,請求能被正常被處理。當有突發流量過來比如 200 個請求時,因為系統容量有 200 個令牌可以同一時刻處理掉這 200 個請求。如果是漏桶演算法,則只能處理 100 個請求,其他的請求等待或者被丟棄。

Ⅶ 如何搭建億級並發的系統架構

想設計億萬級高並發架構,你要先知道高並發是什麼?

面對流量高峰,不同的企業是如何通過技術手段解決高並發難題的呢?

0、引言

軟體系統有三個追求:高性能、高並發、高可用,俗稱三高。三者既有區別也有聯系,門門道道很多,全面討論需要三天三夜,本篇討論高並發。

高並發(High Concurrency)。並發是操作系統領域的一個概念,指的是一段時間內多任務流交替執行的現象,後來這個概念被泛化,高並發用來指大流量、高請求的業務情景,比如春運搶票,電商雙十一,秒殺大促等場景。

很多程序員每天忙著搬磚,平時接觸不到高並發,哪天受不了跑去面試,還常常會被面試官犀利的高並發問題直接KO,其實吧,高並發系統也不高深,我保證任何一個智商在線的看過這篇文章後,都能戰勝恐懼,重拾生活的信心。

本文先介紹高並發系統的度量指標,然後講述高並發系統的設計思路,再梳理高並發的關鍵技術,最後結合作者的經驗做一些延伸探討。

1、高並發的度量指標

既然是高並發系統,那並發一定要高,不然就名不副實。並發的指標一般有QPS、TPS、IOPS,這幾個指標都是可歸為系統吞吐率,QPS越高系統能hold住的請求數越多,但光關注這幾個指標不夠,我們還需要關注RT,即響應時間,也就是從發出request到收到response的時延,這個指標跟吞吐往往是此消彼長的,我們追求的是一定時延下的高吞吐。

比如有100萬次請求,99萬次請求都在10毫秒內響應,其他次數10秒才響應,平均時延不高,但時延高的用戶受不了,所以,就有了TP90/TP99指標,這個指標不是求平均,而是把時延從小到大排序,取排名90%/99%的時延,這個指標越大,對慢請求越敏感。

除此之外,有時候,我們也會關注可用性指標,這可歸到穩定性。

一般而言,用戶感知友好的高並發系統,時延應該控制在250毫秒以內。

什麼樣的系統才能稱為高並發?這個不好回答,因為它取決於系統或者業務的類型。不過我可以告訴你一些眾所周知的指標,這樣能幫助你下次在跟人扯淡的時候稍微靠點兒譜,不至於貽笑大方。

通常,資料庫單機每秒也就能抗住幾千這個量級,而做邏輯處理的服務單台每秒抗幾萬、甚至幾十萬都有可能,而消息隊列等中間件單機每秒處理個幾萬沒問題,所以我們經常聽到每秒處理數百萬、數千萬的消息中間件集群,而像阿某的API網關,每日百億請求也有可能。

2、高並發的設計思路

高並發的設計思路有兩個方向:

閱讀全文

與java漏桶演算法相關的資料

熱點內容
h3c伺服器怎麼看功率 瀏覽:119
前端錄制文件如何上傳伺服器 瀏覽:536
雅黑pdf 瀏覽:457
python使用領域 瀏覽:880
買蘭博基尼用什麼app 瀏覽:137
android關閉後台運行 瀏覽:505
python輸出路徑為超鏈接 瀏覽:533
caxa為什麼沒有加密鎖 瀏覽:792
伺服器怎麼設置才能用IP訪問 瀏覽:663
郵件附件加密後打開能顯示嗎 瀏覽:724
榮耀x10拍照演算法 瀏覽:569
androidgradle配置簽名 瀏覽:96
文件夾左邊的空心三角符號是什麼 瀏覽:287
app英語音頻試卷掃碼怎麼聽 瀏覽:613
字元串編譯預處理 瀏覽:704
蘋果手機怎麼會顯示多個App 瀏覽:241
不去互聯網程序員 瀏覽:555
電腦qq郵箱解壓的圖片保存在哪裡 瀏覽:548
嵌入命令行 瀏覽:94
檔案為什麼被加密 瀏覽:487