golang下極致效能socket開發

2021-10-03 16:48:55 字數 1811 閱讀 1129

1. sendmessage時,一定是呼叫方將message轉換為byte資料序列,避免在其他執行緒轉換時引發併發問題

2.socket寫資料優化。socket寫資料核心流程:message序列化->寫入socket,有些socket庫,存在重複拷貝的問題,基於核心流程,減少不必要的拷貝和記憶體分配,進行如下優化:

每個連線定義乙個write_buffer,用來減少tcp報文數量:假如同時傳送多個消 息時,不需要每個訊息都要立即寫入socket,只需每個訊息呼叫session的writemessage介面暫時寫入到write_buffer,最後呼叫flush時統一寫入到socket

減少message序列化時記憶體分配,session中定義cachebufferlist chan byte快取資料列表,每次序列化時從其中拿乙個buffer,寫入到socket後返還回去,如果取不到再使用`make(byte, ***_size)直接分配buffer。估測90%以上的訊息都能通過該流程簡化(比直接從記憶體中make快,並且減少記憶體碎片)

`減少記憶體重複拷貝:如果是直接send資料,那麼無需拷貝到writebuffer,可直接寫入到socket

4.socket讀資料優化。socket讀資料核心流程:socket讀資料到buffer->根據buffer序列化message

每個連線定義乙個read_buffer和read_decode_buffer:socket讀入到read_buffer,然後直接根據read_buffer中的資料解析出message,迴圈復用read_buffer,並且減少拷貝

5. 分包策略

目前大部分解包/封包都會寫入訊息的長度,一般都是用int(4個位元組)表示,採用socket封包和解包動態策略可以給絕大部分訊息節省2/3個位元組

6. 減少read和write協程中select的chan數量

由於select操作每增加乙個chan的查詢,會帶來一定得查詢消耗,為了提高read和write效率,因此建議這倆協程select的chan數量嚴格控制(看到有些socket庫在select加上quitchan,可以去除,提高效能)

7. encodemessage時使用sync.pool分配writebuffer,減少gc壓力

將pool按照buffer大小分段:32、64、128、256、512、1024

當buffersize越小make(byte, 0, size)越快

當buffersize越大sync.pool越快

如下是測試10000000次分配buffer時,不同buffersize下的耗時對比

其中testmakebytes是採用make(byte, 0, buffersize)分配

testmakebufferbysyncpool是採用sync.pool分配

golang效能優化

效能優化 cpu 1去除不必要的序列化 反序列化 2控制goroutine數量,避免goroutine洩露 3提公升cpu利用率,使用中斷機制讓cpu以更少代價io 記憶體 1減少gc 減少string值拷貝,使用byte string.stringbuilder 2struct型別字段順序 3預分...

React同構與極致的效能優化

本文發表於注 本文為第12屆d2前端技術論壇 打造高可靠與高效能的react同構解決方案 分享內容,已經過資料脫敏處理。效能是乙個綜合性的問題,不能簡單地斷言同構應用一定比非同構應用效能好,只能說合適的場景加上合理的運用,同構應用確實能帶來一定的效能提公升,先來看乙個線上的案例。通常來說,網路狀況越...

戴爾成就5000 輕薄效能商務本 極致效能玩出花樣

高效完成任務,不放過任何乙個細節 這是每位職場 精英 對自我工作最基本的要求,他們被統稱為 極致追求者 如何讓檔案處理再快一步?如何應對更多挑戰?這些在 戴爾成就5000 14 15 英吋 輕薄效能商務本 得到詮釋。專業服務,用的放心 電腦故障不再東奔西跑,第一時間解決電腦故障,應對不時只需。提前程...