接續上一篇「如何在云端平臺上建立 30,000 名用戶的網頁 MMO游戲環境」,接下來討論模擬連結上的問題。
最初計劃使用35臺伺服器來完成這個實驗,希望能夠有大量的用戶連接,以驗證真實的連接狀況。然而,我們高估了這方面,最終我們只維護了26臺核心伺服器以及東京和法蘭克福的一臺邊緣伺服器。
接下來,這些是用來模擬真實連接的機器人伺服器。如圖所示,每5分鐘,他們收到24GB的數據,但只發送了337MB。這與游戲客戶端接收超過傳輸的典型情況一致。在大規模擁塞實驗中,發送和接收資料之間的差異可能高達 8 倍。 CPU 使用率始終維持在 98% 以上。雖然我們的伺服器采用了第三代 AMD EPYC 4C8T 處理器,但我們的機器人程式可能沒有得到適當的最佳化,我們仍在尋找有問題的部分。結果,每個伺服器的連線數從最初的 2400 個減少到 1760 個。
接下來,關于邊緣伺服器,我們使用了第三代 AMD EPYC 2C4T 處理器。影像顯示了接收機器人連接的伺服器的數據。我們控制每個邊緣伺服器來處理 2000 個機器人連線。數據方面,每5分鐘,每臺伺服器接收490MB數據,發送13GB數據。資料包處理數量為每 5 分鐘接收 3,000k 個資料包,發送 5,500k 個資料包。 CPU 使用率約為55%。在我們正在進行的測試中,我們計劃增加連接數量以驗證最大負載。然而在這個過程中,我們遇到了意外中斷的問題。
為了優化我們的網路以進行 TCP WebSocket 連接,我們采用了以下設定:
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
網.ipv4.tcp_fastopen=3
net.ipv4.tcp_abort_on_overflow=0
net.ipv4.tcp_notsent_lowat=16384
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_fin_timeout=10
net.ipv4.tcp_keepalive_time=600
net.ipv4.tcp_keepalive_probes=3
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_max_syn_backlog=8192
網.ipv4.tcp_max_tw_buckets=16384
net.ipv4.tcp_window_scaling=1
網.ipv4.tcp_sack=1
網.ipv4.tcp_fack=0
網路.ipv4.tcp_mem=8388608 12582912 16777216
網路.ipv4.tcp_rmem=8192 262411 8388608
網路位址:
net.ipv4.tcp_reordering=5
net.ipv4.tcp_slow_start_after_idle=0
核心.msgmnb=65535
核心.msgmax=65535
net.core.rmem_max=8388608
凈.核心.wmem_max=8388608
但是tcp_mem、tcp_rmem 和 tcp_wmem 的設定導致了問題。由于機器人伺服器最初 CPU 超載,資料包無法順利處理。由于伺服器設定了較大的資料包緩沖區,導致核心記憶體不足,系統以「記憶體不足」錯誤終止該進程。最終我們刪除了這些設置,因為不可以讓伺服器受到客戶端影響而產生中斷。
但奇怪的是,在我們之前對以「G」開頭的平臺進行的測試中,我們運行了 60,000 個機器人連接,接收 3,000 個連接的邊緣伺服器每分鐘僅傳輸了 900 MiB 的數據。相比之下,在這個平臺上大約有2,000個連接,數據流量每分鐘高達2.5 GB,這顯示出明顯的差異。
(續)
馬上進來看:
https://demo.mb-funs.com/
ps. ?ios手機開網頁跑多人3D可能因為記憶體限制踢掉
回饋與申請代碼:https://wj.qq.com/s2/18654558/0558/
如果本文對你有幫助,歡迎點贊/關注獲取更多技術解析!
也歡迎留下 ?開發中遇到問題 ?或是 ?應用面向 ?