Go http服务器性能测试慢

5
我试图找到Go Web服务器的最大吞吐量。我在一台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 / sec,看起来非常小。如果在www.google.com页面上运行wrk工具,则获得约200MB / sec。即使对于像Kafka(Java服务器)这样的更大复杂计算系统,基准测试结果也可超过70MB / sec(https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines)。如何才能使Golang服务器处理数百万次每秒的极端工作负载(最少100MB / sec)?我有任何错误的假设吗?
更新:
我在一个16核机器上用相同规格运行了相同的程序。我将maxprocs更改为16,结果提高到120k个请求/秒。我感觉已经达到了Golang http服务器的最大值,因此在请求/秒中没有找到任何显着的增加。

4
Google.com不仅仅提供“你好”这个功能。吞吐量和请求率几乎没有关系。 - JimB
4
更具体地说,我想象如果你的 "hello world" 函数返回磁盘上一个大文件的内容,那么你会获得更高的吞吐量。 - Josh Wilson
1
我不知道golang相对于其他编程语言的表现如何,但您正在比较一个处理日志消息的服务器和一个处理HTTP请求的服务器。解析HTTP请求并编码响应可能需要一些开销。你也会在框架的灵活性方面有一点开销。如果想测试纯速度,请尝试制作像 https://coderwall.com/p/wohavg/creating-a-simple-tcp-server-in-go 这样的东西,然后添加池化以便不用重新分配新的缓冲区。您或许永远不会达到kafka的性能水平,但这将是一个很好的比较。 - Josh Wilson
1
当你访问google.com时,很有可能每个请求都会发送到不同的服务器,因此这并不是一个很好的比较。 - Josh Wilson
1
延迟并不等同于带宽。实际上,唯一的相关性在于当你消耗完所有带宽时,延迟会上升。延迟通常源于其他因素,例如网络类型(无线 == 糟糕)、网络拓扑结构、服务器本身的负载(而非io)。我真的无法在这里告诉你有意义的东西。 - RickyA
显示剩余12条评论
2个回答

4

Golang中的net/http速度较慢。如果目标是最大化请求数,可以使用其他实现方式。例如https://github.com/valyala/fasthttp。在我的测试中,fasthttp将查询速率提高了一倍。我的测试是短请求和短响应。

该库带有一些限制,比如不支持HTTP/2。如果您需要用于REST API的HTTP并且不需要互操作性,则fasthttp将非常适合。


3
"过早的优化是万恶之源"1 我建议先为您的用例构建一个东西,然后尝试进行优化。很难构建一个良好的基准测试来测试您想要的内容,因此请确保您正在测试您想要的内容,而不是像路由器速度这样的其他内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接