PTT
Submit
Submit
選擇語言
正體中文
简体中文
PTT
C_and_CPP
[問題] 多執行緒伺服器設計問題
作者:
klsdf
(靜雨澪)
2019-03-14 22:53:42
版上各位先進好:
小弟我目前在設計多執行緒的伺服器上遇到效能瓶頸,
底層的Socket Server是用Boost::Asio,
單純用single io_service & multiple thread的架構處理效能還不錯,
但目前系統上都會需要封包指令是要將某個index要對應到某個session,
所以只好在accept時把index跟session存入到map中,這時就需要使用lock去做保護,
因為加了這個lock導致在一秒內如果是上萬的連線數要aceept延遲就會提高,
後面開始run的過程中因為我使用的是shared_mutex,
所以對map純讀(shared_lock)感覺效能還可以。
如果是單純讀寫分離的Queue還可以用boost::lockfree去處理,
但遇到真的架構上就需要有一個map,這種情況就不知道怎麼優化它,
想問版上的各位先進有什麼設計方向可供我參考,謝謝。
作者:
tinlans
( )
2019-03-15 02:30:00
白說這問題打成英文上 stackoverflow 問應該會比較好坦白說目前可以知道的資訊有點少,也許你目前這層可以複製 N 個docker containers 去跑起來,然後最前端再擋個類似負載平衡的東西,譬如根據 index % N 的值來轉發封包給對應的container 處理這個 request。這種解法比較偏向架構解,考量將來 scalability 的話你早晚要做類似的工。如果你只打算先集中在程式解,那試試看起多個 io_context 有沒有什麼用吧。io_service 在新版 boost 已經 deprecated 了。簡單講的話目的都是先增加你程式的入口數,然後把原本因為 lock 變成瓶頸的單一大資料塊拆分成多個。
作者:
easyman
(oops)
2019-03-15 00:27:00
vector 存 index + session, 就不用lock ?
作者:
Schottky
(順風相送)
2019-03-14 23:04:00
問題在於你為什麼會設計成一秒需要 accept 上萬次吧
作者:
sarafciel
(Cattuz)
2019-03-15 14:32:00
int64_t你也用不完呀 實務上你抓個可以涵蓋峰值的大小配就好了 而且vector要鎖最起碼可以個別鎖呀
作者:
ketrobo
(貓蘿蔔)
2019-03-16 07:29:00
每一條連線有平均與最大的耗用資源量,同時估計一下response time/CPU時間,找出一臺機器的服務上限,對應的session數量一次配置完,連線對應固定的索引值就不用map了
作者:
steve1012
(steve)
2019-03-17 01:02:00
寫個load balancer
作者: LiloHuang (十年一刻)
2019-03-17 19:58:00
SO_REUSEPORT
https://goo.gl/4rxJfr
參考看看若非得查表可考慮使用 tbb::concurrent_unordered_map
繼續閱讀
[問題] C不限位數的奇偶位數相減
ann9101245
Re: [問題] Reverse String with recursively
poyenc
[問題] Reverse String with recursively
IhateOGC
[問題] 一樣的碼結果不一樣
a75088285
控制項
GooLoo
[問題] SetPriorityClass 給錯參數
licheer
Re: [問題] 關於i++ & i--的執行效能
cole945
[討論] 給UI層的介面與底層的介面不一致,何解?
zzss2003
[問題] strcmp的輸出怪怪的
st1009
[問題] 推薦書籍?
honestonly
Links
booklink
Contact Us: admin [ a t ] ucptt.com