iT邦幫忙

0

C#在TCP Socket Server中用MariaDb insert效能

  • 分享至 

  • xImage

小弟使用C# .NET7.0做個TCP Socket Server(使用linq2db),想取代原本使用的舊程式

我們在外面有一些設備,每30秒左右會傳一筆資料回來,Server處理後寫到資料庫中。目前是每個設備一個connection,每次收到資料就執行一次寫入

我測了一下insert,穩定後每次大概在5ms-15ms間,以前沒量過,這個速度有在平均範圍嗎?資料量不到300Byte,目前也只寫入1個表,十幾個欄位而已

以這個速度,每秒能同時處理的設備還不到100台,感覺好像有點弱…。
雖然設備不同在同一時間回傳,在分散的情況下應該問題不大。

我想到一些可能的改善方式,主要就是多收集幾筆資料後再一次寫入資料庫,比如:

  • 用sqlite做暫存,然後定時讀出整批寫入資料庫。
  • 純開Buffer來暫存,速度很快,但又擔心出問題掉資料。
  • 也可能也試試用MySqlConnector自己寫sql?

因為設備數大概也就幾百個,目前問題應該不大,但想看看有沒有更好的處理方式

請問各位先進這種情況一般是怎麼處理,才能使處理效能改善?

看更多先前的討論...收起先前的討論...
powerc iT邦研究生 5 級 ‧ 2022-12-22 14:33:05 檢舉
感覺你想多了,單次新增花費5~15ms,並不代表每秒只能處理200~66筆資料(依你文中說的數量像是用倒數來看),建議你可以可以試著幾台設備同時發送多次新增,看看會不會影響到處理時間,再來做決定
rofellos iT邦新手 2 級 ‧ 2022-12-22 16:47:41 檢舉
你沒多執行緒?
froce iT邦大師 1 級 ‧ 2022-12-23 09:06:26 檢舉
看要不要用redis之類的在server做cache,先寫到redis,然後批次寫入db。
ntustzeus iT邦新手 2 級 ‧ 2022-12-23 09:28:56 檢舉
好像滿有道理的,每個client是各別的task,各自寫入資料庫,不是全部在一起排隊。承受上限應該是資料庫的連線數
比較少寫這種的程式,一下轉不過來,謝謝啦
player iT邦大師 1 級 ‧ 2022-12-23 10:54:19 檢舉
怕掉資料嗎?
有考慮使用MSMQ嗎?
ntustzeus iT邦新手 2 級 ‧ 2022-12-26 16:12:13 檢舉
我研究一下,但我們的設備是嵌入式的,沒有OS,可能不太適用,感謝啦
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
japhenchen
iT邦超人 1 級 ‧ 2022-12-22 12:15:15
最佳解答

改寫成API REST,另,SQL執行盡可能使用帶async字尾的方式執行,避免前後端等待時間過長,會timeout

ntustzeus iT邦新手 2 級 ‧ 2022-12-22 13:09:56 檢舉

感謝提示,但因為設備數量不多,目前Socket Server程式與DB在同一個主機上,這樣加一個後端API的話還多了http request,對效能可能沒什麼幫助?

但iis或nginx或node.js至少都會做執行緒分流,估且不管他們怎麼做,都至少比自己背sockets卻不知怎麼面對突然來的連接,少還好講,幾千個出現,你有何應對?做個多工緩衝池(spool)來接受連接並記錄需要做的工作,以先進先出的方式一個個處理掉(寫多執行緒或另寫程序解決),而不是一收到socket連接請求就馬上處理工作,別的連接就只能等或是直接timeout~

ntustzeus iT邦新手 2 級 ‧ 2022-12-23 09:37:02 檢舉

了解,感謝提示
最近也寫些網頁,也有分前後端,但沒想到Socket程式的資料庫操作也可這樣處理~

我要發表回答

立即登入回答