ASIO + HTTP 如何打造高性能伺服器?
01-15
我最近在做一個遊戲的伺服器,服務端採用boost asio io_services池來實現,但是遇到這樣一個問題,我這個伺服器(比如Game Server)在與客戶端通信的過程中,會比較頻繁的往另一台伺服器(Store Server)進行通信,GameServer與Store Server之間的方式為HTTP,請問大家一個怎樣的架構設計會提升伺服器的性能。
你的首要性能指標是什麼?latency? throughput? QPS?
你希望性能有多高?拿QPS來說,1k 夠不夠?10k 夠不夠?100k 呢?Game Server 運行在什麼硬體上?幾核?多大內存?是否獨佔?
Store Server 呢?二者之間通過何種方式聯通?千兆網?萬兆網?帶寬是否保證?你遇到性能問題了嗎?「提升」的基礎是什麼?現在baseline有多快?為什麼不滿足需求?瓶頸在哪裡?你希望能做到多快?不要說越快越好這種無意義的話。
一既然是用asio.記得你的G和S之間的http交互,也要寫成非同步方式。
二不要急著用多io_service。單一io_service模式多數可以滿足你的性能所需,甚至會由於整體架構簡化,而避免基本功能搞錯。瓶頸在 Game Server - Store Server 之間?
- 哪一端慢?
- CPU 還是 I/O?
- 協議處理、邏輯處理、調度
- 相比而言客戶過來的延遲應該更大吧
- 頻率太高?
必須是 HTTP?
- payload 和 http header 的尺寸比例太小?
必須用 Boost ASIO?
高並發網路伺服器無非是:- 綁定線程到 CPU
- 綁定 socket 到線程,避免調度切換
- 減小每會話的內存佔用
- 榨乾每個步驟的處理時間
這就是為什麼會有 pb,會有 thrift,redis 會堅持單線程+私有協議。
要怎麼把 io_service, proactor 和各種 C++ 對象一一映射到位,隔著千百種包裝確定在最底層做對該做的事?性能問題真的存在么?
雖然對題主真正的問題在哪裡還不太理解,但手裡有把鎚子就忍不住往上套。
不知道boost asio一般情況下都怎麼用,以我的理解如果覺得它的corotine好用的一般都會忍不住要用,這基本等同於c#的await關鍵字。對處理線性非同步事件這是夠用了,但無法對付並行。
還有一種不知道是否標準用法,就是拿一個io service作為同步調度器,然後可並行的任務在不同io service上執行,這樣可以提高多核時性能或響應特性(見到有人這麼用)。首先要考慮的不是單機性能,而應該是伺服器的負載均衡,怎樣擴展伺服器,如你所述,瓶頸是業務邏輯計算耗時,採用多線程並行處理遊戲業務似乎不是一個好的方案。在gamesvr與客戶端中間加一個模塊,專門用來處理首發包並且添加負載均衡功能,gamrsvr採用單線程進行計算,通過部署多個gamesvr來擴展計算能力,實際運營時可以動態擴展。在單線程模型下,對gamesvr進行優化。限制單個gamesvr的用戶上限,保證服務質量。
推薦閱讀:
※為什麼`atomic::fetch_add()`可以 relaxed memory order?
※make 多線程編譯會出錯么?
※CLion 鏈接庫?如 lpthread 怎麼設置?
※剛學c++多線程,需要從哪些方面入手,有推薦的教程或書籍嗎?
※多線程引用計數如何釋放?