ASIO + HTTP 如何打造高性能伺服器?

我最近在做一個遊戲的伺服器,服務端採用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++多線程,需要從哪些方面入手,有推薦的教程或書籍嗎?
多線程引用計數如何釋放?

TAG:伺服器 | C | 多線程 | BoostC庫 | 高性能伺服器 |