我试图找出go was服务器的最大吞吐量。我在8核机器(Intel Xeon 2.5 Mhz)上运行simplewebserver,在另一台8核机器上运行wrk工具。Iperf命令显示这些机器之间的速度约为8-10Gbps。最初,我犯了一个错误,使用apache ab工具,每秒只能发出16k个请求。问题与link相同。现在,当我切换到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 web服务器的最大吞吐量吗?我得到了11MB/秒,这看起来相当小的基本程序。如果我在www.google.com页面上运行wrk工具,我的速度大约是200MB/秒。即使是像kafka(java服务器)这样的大型复杂计算系统,基准测试结果也超过了70MB/秒(https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines)。golang服务器如何处理每秒数百万次请求的极端工作负载(最低超过100MB/秒)?我的假设是错的吗?
更新:
我在一台具有相同规格的16核机器上运行了相同的程序。我将maxprocs更改为16,结果更高,达到了120k次/秒。我觉得我已经达到了golang http服务器的最大值,因此我没有发现每秒请求数有任何显着增加。
发布于 2016-06-11 04:39:45
“过早优化是万恶之源”1
我建议为你的用例构建一些东西,然后尝试优化。很难构建一个好的基准测试来测试您想要的东西,所以要确保您测试的是您想要的东西,而不是路由器的速度。
发布于 2018-06-07 00:44:33
Golang net/http相当慢。如果目标是最大化请求率,还有其他实现。例如,在我的测试中,https://github.com/valyala/fasthttp使查询率加倍。我的测试是一个简短的请求和简短的回复。
这个库有一些限制,比如不支持HTTP/2。如果您需要将HTTP用于REST API,而您又不寻求互操作性,那么fasthttp将非常适合您
https://stackoverflow.com/questions/37714210
复制相似问题