精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

優(yōu)化 Golang 分布式行情推送的性能瓶頸

開發(fā) 前端 分布式
最近一直在優(yōu)化行情推送系統(tǒng),有不少優(yōu)化心得跟大家分享下。性能方面提升最明顯的是時延,在單節(jié)點8萬客戶端時,時延從1500ms優(yōu)化到40ms,這里是內(nèi)網(wǎng)mock客戶端的得到的壓測數(shù)據(jù)。

[[409249]]

本文轉(zhuǎn)載自微信公眾號「碼農(nóng)桃花源」,作者峰云就她了 。轉(zhuǎn)載本文請聯(lián)系碼農(nóng)桃花源公眾號。

最近一直在優(yōu)化行情推送系統(tǒng),有不少優(yōu)化心得跟大家分享下。性能方面提升最明顯的是時延,在單節(jié)點8萬客戶端時,時延從1500ms優(yōu)化到40ms,這里是內(nèi)網(wǎng)mock客戶端的得到的壓測數(shù)據(jù)。

對于訂閱客戶端數(shù)沒有太執(zhí)著量級的測試,弱網(wǎng)絡(luò)下單機(jī)8w客戶端是沒問題的。當(dāng)前采用的是kubenetes部署方案,可靈活地擴(kuò)展擴(kuò)容。

架構(gòu)圖

push-gateway是推送的網(wǎng)關(guān),有這么幾個功能:第一點是為了做鑒權(quán);第二點是為了做接入多協(xié)議,我們這里實現(xiàn)了websocket, grpc, grpc-web,sse的支持;第三點是為了實現(xiàn)策略調(diào)度及親和綁定等。

push-server 是推送服務(wù),這里維護(hù)了訂閱關(guān)系及監(jiān)聽mq的新消息,繼而推送到網(wǎng)關(guān)。

問題一:并發(fā)操作map帶來的鎖競爭及時延

推送的服務(wù)需要維護(hù)訂閱關(guān)系,一般是用嵌套的map結(jié)構(gòu)來表示,這樣造成map并發(fā)競爭下帶來的鎖競爭和時延高的問題。

  1. // xiaorui.cc  
  2. {"topic1": {"uuid1": client1, "uuid2": client2}, "topic2": {"uuid3": client3,  "uuid4": client4}   ... }  

已經(jīng)根據(jù)業(yè)務(wù)拆分了4個map,但是該訂閱關(guān)系是嵌套的,直接上鎖會讓其他協(xié)程都阻塞,阻塞就會造成時延高。

加鎖操作map本應(yīng)該很快,為什么會阻塞?上面我們有說過該map是用來存topic和客戶端列表的訂閱關(guān)系,當(dāng)我進(jìn)行推送時,必然是需要拿到該topic的所有客戶端,然后進(jìn)行一個個的send通知。(這里的send不是io.send,而是chan send,每個客戶端都綁定了緩沖的chan)

解決方法:在每個業(yè)務(wù)里劃分256個map和讀寫鎖,這樣鎖的粒度降低到1/256。除了該方法,開始有嘗試過把客戶端列表放到一個新的slice里返回,但造成了 GC 的壓力,經(jīng)過測試不可取。

  1. // xiaorui.cc 
  2.  
  3. sync.RWMutex 
  4. map[string]map[string]client 
  5.  
  6. 改成這樣 
  7.  
  8. m *shardMap.shardMap 

分段map的庫已經(jīng)推到github[1]了,有興趣的可以看看。

問題二:串行消息通知改成并發(fā)模式

簡單說,我們在推送服務(wù)維護(hù)了某個topic和1w個客戶端chan的映射,當(dāng)從mq收到該topic消息后,再通知給這1w個客戶端chan。

客戶端的chan本身是有大buffer,另外發(fā)送的函數(shù)也使用 select default 來避免阻塞。但事實上這樣串行發(fā)送chan耗時不小。對于channel底層來說,需要goready等待channel的goroutine,推送到runq里。

下面是我寫的benchmark[2],可以對比串行和并發(fā)的耗時對比。在mac下效果不是太明顯,因為mac cpu頻率較高,在服務(wù)器里效果明顯。

串行通知,拿到所有客戶端的chan,然后進(jìn)行send發(fā)送。

  1. for _, notifier := range notifiers { 
  2.     s.directSendMesg(notifier, mesg) 

并發(fā)send,這里使用協(xié)程池來規(guī)避morestack的消耗,另外使用sync.waitgroup里實現(xiàn)異步下的等待。

  1. // xiaorui.cc 
  2.  
  3. notifiers := []*mapping.StreamNotifier{} 
  4. // conv slice 
  5. for _, notifier := range notifierMap { 
  6.     notifiers = append(notifiers, notifier) 
  7.  
  8.  
  9. // optimize: direct map struct 
  10. taskChunks := b.splitChunks(notifiers, batchChunkSize) 
  11.  
  12.  
  13. // concurrent send chan 
  14. wg := sync.WaitGroup{} 
  15. for _, chunk := range taskChunks { 
  16.     chunkCopy := chunk // slice replica 
  17.     wg.Add(1) 
  18.     b.SubmitBlock( 
  19.         func() { 
  20.             for _, notifier := range chunkCopy { 
  21.                 b.directSendMesg(notifier, mesg) 
  22.             } 
  23.             wg.Done() 
  24.         }, 
  25.     ) 
  26. wg.Wait() 

按線上的監(jiān)控表現(xiàn)來看,時延從200ms降到30ms。這里可以做一個更深入的優(yōu)化,對于少于5000的客戶端,可直接串行調(diào)用,反之可并發(fā)調(diào)用。

問題三:過多的定時器造成cpu開銷加大

行情推送里有大量的心跳檢測,及任務(wù)時間控速,這些都依賴于定時器。go在1.9之后把單個timerproc改成多個timerproc,減少了鎖競爭,但四叉堆數(shù)據(jù)結(jié)構(gòu)的時間復(fù)雜度依舊復(fù)雜,高精度引起的樹和鎖的操作也依然頻繁。

所以,這里改用時間輪解決上述的問題。數(shù)據(jù)結(jié)構(gòu)改用簡單的循環(huán)數(shù)組和map,時間的精度弱化到秒的級別,業(yè)務(wù)上對于時間差是可以接受的。

Golang時間輪的代碼已經(jīng)推到github[3]了,時間輪很多方法都兼容了golang time原生庫。有興趣的可以看下。

問題四:多協(xié)程讀寫chan會出現(xiàn)send closed panic的問題

解決的方法很簡單,就是不要直接使用channel,而是封裝一個觸發(fā)器,當(dāng)客戶端關(guān)閉時,不主動去close chan,而是關(guān)閉觸發(fā)器里的ctx,然后直接刪除topic跟觸發(fā)器的映射。

  1. // xiaorui.cc 
  2.  
  3. // 觸發(fā)器的結(jié)構(gòu) 
  4. type StreamNotifier struct { 
  5.     Guid  string 
  6.     Queue chan interface{} 
  7.  
  8.  
  9.     closed int32 
  10.     ctx    context.Context 
  11.     cancel context.CancelFunc 
  12.  
  13.  
  14. func (sc *StreamNotifier) IsClosed() bool { 
  15.     if sc.ctx.Err() == nil { 
  16.         return false 
  17.     } 
  18.     return true 
  19.  
  20. ... 

問題五:提高grpc的吞吐性能

grpc是基于http2協(xié)議來實現(xiàn)的,http2本身實現(xiàn)流的多路復(fù)用。通常來說,內(nèi)網(wǎng)的兩個節(jié)點使用單連接就可以跑滿網(wǎng)絡(luò)帶寬,無性能問題。但在golang里實現(xiàn)的grpc會有各種鎖競爭的問題。

如何優(yōu)化?多開grpc客戶端,規(guī)避鎖競爭的沖突概率。測試下來qps提升很明顯,從8w可以提到20w左右。

可參考以前寫過的grpc性能測試[4]。

問題六:減少協(xié)程數(shù)量

有朋友認(rèn)為等待事件的協(xié)程多了無所謂,只是占內(nèi)存,協(xié)程拿不到調(diào)度,不會對runtime性能產(chǎn)生消耗。這個說法是錯誤的。雖然拿不到調(diào)度,看起來只是占內(nèi)存,但是會對 GC 有很大的開銷。所以,不要開太多的空閑的協(xié)程,比如協(xié)程池開的很大。

在推送的架構(gòu)里,push-gateway到push-server不僅幾個連接就可以,且?guī)资畟€stream就可以。我們自己實現(xiàn)大量消息在十幾個stream里跑,然后調(diào)度通知。在golang grpc streaming的實現(xiàn)里,每個streaming請求都需要一個協(xié)程去等待事件。所以,共享stream通道也能減少協(xié)程的數(shù)量。

問題七:GC 問題

對于頻繁創(chuàng)建的結(jié)構(gòu)體采用sync.Pool進(jìn)行緩存。有些業(yè)務(wù)的緩存先前使用list鏈表來存儲,在不斷更新新數(shù)據(jù)時,會不斷的創(chuàng)建新對象,對 GC 造成影響,所以改用可復(fù)用的循環(huán)數(shù)組來實現(xiàn)熱緩存。

后記

有坑不怕,填上就可以了。

參考資料

[1]github: https://github.com/rfyiamcool/ccmap/blob/master/syncmap.go

[2]benchmark: https://github.com/rfyiamcool/go-benchmark/tree/master/batch_notify_channel

[3]github: https://github.com/rfyiamcool/go-timewheel

[4]測試: https://github.com/rfyiamcool/grpc_batch_test

 

責(zé)任編輯:武曉燕 來源: 碼農(nóng)桃花源
相關(guān)推薦

2022-08-16 09:23:54

分布式系統(tǒng)

2023-11-19 23:24:21

Golang開發(fā)

2010-07-06 09:39:20

SQL Server分

2019-06-19 15:40:06

分布式鎖RedisJava

2024-05-20 09:14:20

2019-10-10 09:16:34

Zookeeper架構(gòu)分布式

2023-05-12 08:23:03

分布式系統(tǒng)網(wǎng)絡(luò)

2023-05-29 14:07:00

Zuul網(wǎng)關(guān)系統(tǒng)

2017-09-01 05:35:58

分布式計算存儲

2022-12-08 08:13:11

分布式數(shù)據(jù)庫CAP

2022-06-08 07:36:03

LocustKubernete微服務(wù)

2018-07-19 14:53:23

秒殺websocket異步

2023-02-11 00:04:17

分布式系統(tǒng)安全

2017-10-27 08:40:44

分布式存儲剪枝系統(tǒng)

2024-05-23 10:19:57

2023-10-26 18:10:43

分布式并行技術(shù)系統(tǒng)

2024-01-10 08:02:03

分布式技術(shù)令牌,

2018-07-17 08:14:22

分布式分布式鎖方位

2024-03-01 09:53:34

2013-12-27 10:56:42

分布式對象存儲Sheepdog性能測試
點贊
收藏

51CTO技術(shù)棧公眾號

国产自产2019最新不卡| 日韩中文字幕高清在线观看| 五月激情综合婷婷| 日韩一区免费观看| 亚洲va天堂va欧美ⅴa在线| 国产精品毛片| 久久夜色精品国产亚洲aⅴ| 久久久久成人精品无码中文字幕| 日韩不卡视频在线观看| 一区二区激情视频| 日产中文字幕在线精品一区| 99热这里只有精品在线| 欧美亚洲三区| 久久99亚洲热视| 大胸美女被爆操| 精品综合久久88少妇激情| 欧美日韩不卡一区| 少妇高潮喷水久久久久久久久久| 黄色在线免费看| 久久婷婷综合激情| 成人一区二区三区四区| 中国女人真人一级毛片| 日韩视频一区二区三区在线播放免费观看| 在线观看精品国产视频| www.88av| youjizz欧美| 51精品久久久久久久蜜臀| 欧美在线观看www| 好久没做在线观看| 亚洲六月丁香色婷婷综合久久 | 日韩中文字幕在线| 欧洲一级黄色片| 亚洲高清在线一区| 欧美日韩激情在线| 日本免费观看网站| 日韩毛片免费观看| 欧美午夜激情在线| 波多野结衣之无限发射| 国产美女情趣调教h一区二区| 综合久久国产九一剧情麻豆| 亚洲国产日韩综合一区| 欧美女同网站| 久久久噜噜噜久久人人看 | 欧美亚洲伦理www| 国产在线拍揄自揄拍| 91成人网在线观看| 久久精品亚洲热| 久久久99999| 国产高清一区| 久久精品国产久精国产一老狼| 一级黄色录像毛片| 日韩免费av| 上原亚衣av一区二区三区| 久久国产柳州莫菁门| 国产一区二区三区四区大秀| 亚洲人成网在线播放| 巨胸大乳www视频免费观看| 亚洲三级性片| 国产小视频国产精品| 色无极影院亚洲| av资源久久| 日韩在线观看网站| wwwav国产| 亚洲经典自拍| 欧洲亚洲妇女av| 中文字幕欧美色图| 国内不卡的二区三区中文字幕| 亚洲在线一区二区| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 国产成人免费av在线| 国产精品视频入口| 亚洲日本国产精品| 国产精品妹子av| 91九色国产ts另类人妖| heyzo在线欧美播放| 精品久久久久人成| 网站一区二区三区| 欧美9999| 日韩精品久久久久| 大吊一区二区三区| 自由日本语亚洲人高潮| 97国产精品免费视频| 中文字幕高清在线免费播放| 久久精品国产第一区二区三区| 91亚洲国产成人精品性色| 蜜桃av噜噜一区二区三区麻豆| 92国产精品观看| 亚洲a∨一区二区三区| 91福利国产在线观看菠萝蜜| 欧美日韩国产精品一区二区三区四区 | a'aaa级片在线观看| 日本电影亚洲天堂一区| 欧美精品 - 色网| 免费看久久久| 日韩中文理论片| xxxx 国产| 美腿丝袜亚洲综合| 国产欧美日韩视频一区二区三区| 国产乱子伦三级在线播放| 亚洲乱码精品一二三四区日韩在线 | aaaa黄色片| 欧美大片aaaa| 欧美一级bbbbb性bbbb喷潮片| 亚洲专区第一页| av动漫一区二区| 正在播放国产精品| 伊人久久综合一区二区| 欧美一区二区三区系列电影| 男女做爰猛烈刺激| 在线成人亚洲| 91免费精品国偷自产在线| 欧美高清电影在线| 亚洲成人动漫av| 深爱五月综合网| 成人情趣视频网站| 国产999精品久久久影片官网| 亚洲a视频在线| 亚洲欧洲无码一区二区三区| 国产福利视频在线播放| 在线综合色站| 久久视频在线播放| 中文字幕在线视频免费| 26uuu成人网一区二区三区| 国产成人生活片| 欧美视频免费看| 亚洲性线免费观看视频成熟| 欧美一级片免费在线观看| 国产精品1区二区.| 中日韩在线视频| 福利一区二区免费视频| 亚洲日韩第一页| 综合激情网五月| 99久精品国产| 精品丰满人妻无套内射| 亚洲码欧美码一区二区三区| 久久天天躁狠狠躁夜夜爽蜜月| 自拍偷拍精品视频| 国产喂奶挤奶一区二区三区| 成人小视频在线看| 美日韩中文字幕| 欧美自拍视频在线| 色播色播色播色播色播在线| 天天影视网天天综合色在线播放 | 久久日韩精品一区二区五区| 国产伦精品一区二区三区四区视频_ | 丰满圆润老女人hd| 美女爽到呻吟久久久久| 欧美国产一二三区| 欧美人与性动交xxⅹxx| 一本一道久久a久久精品逆3p | 久久亚洲风情| 视频一区二区在线观看| 91精品店在线| xxxxx成人.com| 99精品视频在线播放免费| 亚洲人成7777| 色姑娘综合天天| 亚洲性人人天天夜夜摸| 国产一区二区三区奇米久涩 | 欧美国产精品| 国产精品一区二区你懂得| 激情国产在线| 这里只有视频精品| 国产露脸91国语对白| 亚洲综合成人在线| 久久久久久久久免费看无码| 手机精品视频在线观看| 亚洲精品日韩在线观看| 日韩激情精品| 97色在线视频| 97电影在线看视频| 日韩无一区二区| 黑人一级大毛片| 国产精品视频一区二区三区不卡| 五月天婷婷在线观看视频| 黄色成人91| 无遮挡亚洲一区| 亚洲一区二区三区在线免费| 91国内免费在线视频| 国产黄色免费在线观看| 欧美一区二区三区精品| 免费在线不卡视频| 日韩毛片精品高清免费| 国产免费一区二区三区最新6| 久久久久久久欧美精品| 自拍另类欧美| 日韩av不卡一区| 91理论片午午论夜理片久久| 77thz桃花论族在线观看| 少妇精69xxtheporn| 丰满熟女一区二区三区| 欧美性生活一区| 日本三级网站在线观看| 中文字幕欧美激情| 国产黄色三级网站| 久久国产乱子精品免费女| 男人添女人荫蒂免费视频| 国产精品亚洲片在线播放| 91国产在线播放| 成人av集中营| 欧美一区二三区| 1769免费视频在线观看| 中日韩午夜理伦电影免费| 日本美女一级视频| 欧美精品第1页| 欧美成人一区二区三区四区| 亚洲综合免费观看高清在线观看| 日本美女bbw| 北条麻妃国产九九精品视频| 一本一道久久a久久综合蜜桃| 性欧美精品高清| 欧美人成在线观看| 欧美一区久久| 一本色道久久综合亚洲精品婷婷| 日韩精品导航| 成人资源视频网站免费| 日韩一区中文| 国产精品免费一区豆花| 在线观看福利电影| 久久久久久久91| 羞羞视频在线观看免费| 久久精视频免费在线久久完整在线看| 黄色av网站在线看| 国产视频精品一区二区三区| 免费的黄色av| 精品福利一区二区三区| 亚洲精品久久久久avwww潮水 | 九九热在线免费| 亚洲男人影院| 国产原创中文在线观看| 亚洲日本激情| www.日本少妇| 在线国产日韩| 成人免费视频91| 在线成人黄色| 亚洲一区二区三区av无码| 国产精品sm| www.日本在线视频| 国产综合网站| 国产96在线 | 亚洲| 精久久久久久| 青青青在线视频播放| 精品999成人| 91好吊色国产欧美日韩在线| 日韩亚洲国产精品| 国产性xxxx18免费观看视频| 在线午夜精品| 黄色国产小视频| 热久久一区二区| 国产无色aaa| 国产精品综合视频| 亚洲免费观看在线| aaa亚洲精品| 国产 欧美 在线| 国产精品传媒在线| 性生交大片免费全黄| 亚洲精品菠萝久久久久久久| 久久网中文字幕| 午夜日韩在线电影| 国产污视频网站| 欧美日韩在线播放三区| 国产男女猛烈无遮挡| 精品日韩在线一区| 青青青手机在线视频观看| 夜夜嗨av一区二区三区四区| 麻豆视频网站在线观看| 欧美精品xxx| 依依综合在线| 成人精品福利视频| 成人福利一区| 日本欧美精品久久久| 图片小说视频色综合| 国产精品视频一二三四区| 日韩午夜精品| 污视频网站观看| 成人av电影免费观看| 亚洲午夜福利在线观看| 中文字幕一区二区三| 国产在线拍揄自揄拍| 色婷婷亚洲精品| 国产乱淫片视频| 亚洲国产欧美在线成人app | 色综合天天狠天天透天天伊人| av毛片午夜不卡高**水| 国产精品香蕉在线观看| 极品国产人妖chinesets亚洲人妖| 欧美亚洲免费高清在线观看| 亚洲精品a级片| 国产乱子夫妻xx黑人xyx真爽| 久久99最新地址| 先锋资源av在线| 亚洲美女屁股眼交| 在线观看污污网站| 精品乱码亚洲一区二区不卡| 国产三区四区在线观看| 欧美日韩xxxxx| 成人av集中营| 女同一区二区| 午夜欧美精品| 中文字幕 91| 91麻豆高清视频| 欧美精品一级片| 欧美人xxxx| 毛片在线免费| 97在线视频免费| 久久精品九色| 亚洲一卡二卡三卡| 天堂av在线一区| 在线天堂www在线国语对白| 亚洲视频小说图片| 中文字幕第三页| 日韩成人在线视频网站| 羞羞的视频在线看| 91精品久久久久久久| 欧美男gay| 男女午夜激情视频| 99re热这里只有精品视频| 青娱乐av在线| 欧美一级高清片| 国产一二区在线| 91精品久久久久久久| 日韩dvd碟片| 亚洲性生活网站| 久久午夜色播影院免费高清| 国产免费av一区二区| 精品国产人成亚洲区| 在线看福利影| 91在线看www| 欧美一区亚洲| 日本高清免费观看| 亚洲视频一区二区在线| 国产精品区在线观看| 最近更新的2019中文字幕| 国产精品伊人| 正在播放一区| 国产在线麻豆精品观看| 97精品在线播放| 4438x成人网最大色成网站| 日本三级视频在线播放| 国产精品免费电影| 97精品国产一区二区三区| 麻豆三级在线观看| 国产精品久久久久久久第一福利| 国产天堂第一区| 日韩在线观看成人| 久久久久毛片免费观看| 中国老女人av| 成人黄页毛片网站| 在线观看亚洲天堂| 亚洲跨种族黑人xxx| 怡红院成人在线| 亚洲一区二区精品在线| 久久国产露脸精品国产| 欧美视频一二三| 欧美日韩视频精品二区| 国产精品高精视频免费| 欧美成人激情| 秘密基地免费观看完整版中文| 亚洲一二三区在线观看| 天天操天天干天天爽| 青青在线视频一区二区三区| 精品国产一区二区三区久久久蜜臀| 福利在线一区二区三区| 中文字幕中文字幕在线一区| 国产情侣av在线| 97在线视频免费| 精品国产91久久久久久浪潮蜜月| 羞羞的视频在线| 亚洲综合一二区| 毛片在线能看| 亚洲精品欧美极品| 亚洲精品社区| 亚洲一级理论片| 精品欧美久久久| 日本不卡一二三| 影音欧美亚洲| 成人aaaa免费全部观看| av首页在线观看| 久久99国产精品自在自在app| 秋霞蜜臀av久久电影网免费| 亚洲高清免费在线观看| 亚洲大片一区二区三区| 国产日本在线视频| 超碰97在线资源| 日韩精品一二区| 久久精品免费av| 中文字幕不卡av| 国产精品毛片av| 亚洲视频第二页| 五月天亚洲精品| 午夜老司机在线观看| 黄色99视频| 激情综合一区二区三区| 亚洲天堂一区在线观看| 久久精品视频在线播放| 亚洲免费福利一区| 波多野结衣电影免费观看| 色综合久久88色综合天天免费| av电影免费在线观看| 亚洲国产精品一区二区第一页 |