GoT*_*GoT 5 performance webserver http go
我试图找到 Go 网络服务器的最大吞吐量。我在 8 核机器(Intel Xeon 2.5 Mhz)上运行 simplewebserver 并在不同的 8 核机器上运行 wrk 工具。Iperf 命令在这些机器之间显示大约 8-10Gbps。最初,我使用 apache ab 工具犯了一个错误,该工具仅提供 16k 请求/秒。问题与链接相同。现在,当我切换到 wrk 工具时,我每秒收到大约 9 万个请求,大约为 11MB/秒。
在第一台 8 核机器上,我运行 simplewebserver.go
package main
import (
"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)
}
Run Code Online (Sandbox Code Playgroud)
在不同的 8 核机器上,我跑了
./wrk -t8 -c1000 -d10s http://10.0.0.6:8000/
Run Code Online (Sandbox Code Playgroud)
结果:
Running 10s test @ http://10.0.0.6:8000/
8 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 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 read
Socket errors: connect 0, read 0, write 0, timeout 20
Requests/sec: 91415.11
Transfer/sec: 11.25MB
Run Code Online (Sandbox Code Playgroud)
我可以说我已经达到了 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 服务器的最大值,因此我没有发现请求/秒有任何显着增加。
Golang net/http 相当慢。如果目标是最大化请求率,则还有其他实现。例如https://github.com/valyala/fasthttp在我的测试中,fasthttp 使查询率翻倍。我的测试是一个简短的请求和简短的回复。
该库有一些限制,例如不支持 HTTP/2。如果您需要 HTTP for REST API 并且您不寻求互操作性,fasthttp 将非常适合