去http服务器慢基准性能

时间:2016-06-08 22:50:55

标签: performance http go webserver

我试图找到go webserver的最大吞吐量。我在8核机器(Intel Xeon 2.5 Mhz)上运行simplewebserver,并在另一台8核机器上运行wrk工具。 Iperf命令在这些机器之间显示大约8-10Gbps。最初,我使用apache ab工具犯了一个错误,它只给出了16k请求/秒。问题与link相同。现在当我切换到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)
 }

在另一台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请求/秒。我觉得我达到了golang http服务器的最大值,因此我没有在请求/秒中发现任何显着的增量。

2 个答案:

答案 0 :(得分:2)

“过早优化是所有邪恶的根源”1

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

答案 1 :(得分:1)

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

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