我試圖找到 Go 網絡服務器的最大吞吐量。我在 8 核機器(Intel Xeon 2.5 Mhz)上運行 simplewebserver,并在不同的 8 核機器上運行 wrk 工具。Iperf 命令顯示這些機器之間的速度約為 8-10Gbps。最初,我使用 apache ab 工具犯了一個錯誤,該工具每秒只提供 16k 個請求。問題與鏈接相同。現在,當我切換到 wrk 工具時,我每秒收到大約 90k 個請求,大約 11MB/秒。在第一臺 8 核機器上,我運行了 simplewebserver.gopackage mainimport ( "io" "net/http" "runtime")func hello(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "Hello world!")} func main() { runtime.GOMAXPROCS(8) http.HandleFunc("/", hello) http.ListenAndServe(":8000", nil) }在另一臺 8 核機器上,我跑了 ./wrk -t8 -c1000 -d10s http://10.0.0.6:8000/結果:Running 10s test @ http://10.0.0.6:8000/8 threads and 1000 connectionsThread Stats Avg Stdev Max +/- StdevLatency 42.65ms 114.89ms 1.96s 91.33%Req/Sec 11.54k 3.01k 25.10k 74.88%923158 requests in 10.10s, 113.57MB readSocket errors: connect 0, read 0, write 0, timeout 20Requests/sec: 91415.11Transfer/sec: 11.25MB我可以說我已經達到了 golang Web 服務器的最大吞吐量嗎?我得到 11 MB/秒的速度,這對于基本程序來說看起來很小。如果我在 www.google.com 頁面上運行 wrk 工具,我會得到大約 200 MB/秒。即使對于像 kafka(java 服務器)這樣的大型復雜計算系統,基準測試結果也超過 70 MB/秒(https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-三便宜的機器)。golang 服務器如何處理每秒數百萬個請求的極端工作負載(至少超過 100MB/秒)?我有什么假設錯了嗎?更新:我在具有相同規格的 16 核機器上運行相同的程序。我將 maxprocs 更改為 16,結果提高到 120k 請求/秒。我覺得我已經達到了 golang http 服務器的最大值,因此我沒有發現請求/秒有任何顯著增加。
2 回答

慕斯王
TA貢獻1864條經驗 獲得超2個贊
Golang net/http 相當慢。如果目標是最大化請求率,還有其他實現。例如https://github.com/valyala/fasthttp在我的測試中,fasthttp 使查詢率翻倍。我的測試是一個簡短的請求和簡短的回復。
該庫有一些限制,例如不支持 HTTP/2。如果您需要 REST API 的 HTTP 并且您不是在尋找互操作性,fasthttp 將非常適合
- 2 回答
- 0 關注
- 236 瀏覽
添加回答
舉報
0/150
提交
取消