Go http服务器慢速基准测试性能



我试图找到go Web服务器的最大吞吐量。我在一台8核机器(Intel Xeon 2.5 Mhz)上运行simplewebserver,并在另一台8核心机器上运行wrk工具。Iperf命令显示这些机器之间的速率约为8-10Gbps。最初,我犯了一个错误,使用的apacheab工具每秒只提供16k个请求。问题与链接相同。现在,当我切换到wrk工具时,我每秒收到大约90k个请求,大约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)
}

在另一台8核机器上,我运行

./wrk -t8 -c1000 -d10s http://10.0.0.6:8000/

结果:

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

我可以说我已经达到了golang网络服务器的最大吞吐量吗?我得到了11 MB/秒,这对于基本程序来说看起来很小。如果我在www.google.com页面上运行wrk工具,我的速度大约是200 MB/秒。即使对于像kafka(java服务器)这样的大型复杂计算系统,基准测试结果也超过70 MB/秒(https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines)。golang服务器如何处理每秒数百万个请求(至少超过100MB/秒)的极端工作负载?我的假设错了吗?

更新:

我在一台规格相同的16核机器上运行了同样的程序。我将maxprocs更改为16,结果提高到120k请求/秒。我觉得我已经达到了golanghttp服务器的最大值,因此我没有发现每秒请求量的任何显著增加。

Golang net/http相当慢。如果目标是最大化请求率,那么还有其他实现。例如https://github.com/valyala/fasthttp在我的测试中,fasthttp将查询率提高了一倍。我的测试是一个简短的请求和简短的答复。

该库有一些限制,比如不支持HTTP/2。如果您需要HTTP for REST API,并且您不寻求互操作性,那么fasthttp将非常适合

"过早优化是万恶之源"1

我建议为您的用例构建一些东西,然后尝试优化。很难建立一个测试你想要什么的好基准,所以要确保你在测试你想要的东西,而不是像路由器的速度这样的东西。

最新更新