※ [本文轉錄自 C_and_CPP 看板 #1QyTR0gb ]
作者: carylorrk (carylorrk) 看板: C_and_CPP
標題: [問題] Linux Socket Performance
時間: Wed May 9 00:56:28 2018
開發平台(Platform): (Ex: Win10, Linux, ...)
Ubuntu 16.04
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
gcc-5.5
問題(Question):
先承認這是作業文
小弟對網路程式不熟悉
第一次使用 Linux TCP socket 實作簡單的 RPC
但是不知道是哪裡的問題
performance 大概只有原本使用 gRPC 的一半
可能只是很蠢的操作方式錯誤
又或者是哪裡 implement 太慢
還請各位鞭小力一點
整個系統的架構是
每臺電腦之間都會互相溝通
主要程式部分是 multithread
可能會同步呼叫通訊部分的函式
並且每次傳送數百 bytes 到 mega bytes 不等的內容
次數頻繁,可能是一秒就好幾次呼叫
通訊部分架構
我一開始就把每臺之間的 socket 創好
用一個 bind & listen & accept 的 thread
加上 connet 到所有比自己後面的機器取得 sockets
並建立兩個 thread 分別負責傳送和接收(init.h)
傳送的 thread 是一個 task queue
有人需要傳送時先把資料加到 queue 裡
這個 thread 就負責一直從 queue 裡拿資料
然後利用 send 把資料傳到對應 socket 去 (sender.cc)
接收的 thread 則是利用 epoll
來等待所有 sockets 的訊息進來
讀進來之後會根據 command
創一個 thread call 相對應的 handler function (receiver.cc)
目前測量應該不是 serialize 方面的問題
也有試過在 receiver 創 thread 的部分使用 thread pool
但是暫時還沒有找到效能的問題點
不知道有沒有先進能給點意見?感謝~
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
https://gist.github.com/CaryLorrk/12726181cd3ebd79a1c6ccdedeb8c29f
不是完整的程式碼
不過網路部分都有出來了
我知道架構很醜,傷眼了 XD