【问题标题】:Go http server slow benchmark performanceGo http 服务器慢速基准性能
【发布时间】:2016-06-08 22:50:55
【问题描述】:

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

更新:

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

【问题讨论】:

  • www.google.com 提供的不仅仅是“你好”。吞吐量和请求率几乎没有关系。
  • 详细说明一下,如果您的 hello world 函数返回磁盘上大文件的内容,我想您会获得更高的吞吐量。
  • 老实说,与其他语言相比,我不知道 golang 的性能如何,但您正在将 http 服务器与接收日志消息的服务器进行比较。解析 http 请求和编码响应可能会有一些开销。您还将对框架的灵活性产生一些开销。如果您想测试纯速度,请尝试制作类似coderwall.com/p/wohavg/creating-a-simple-tcp-server-in-go 的内容,然后添加池,这样您就不会重新分配新的缓冲区。你可能永远无法完全了解 kafka 的性能,但那将是一个很好的比较。
  • 当您访问 google.com 时,很有可能您的每一个请求都会发送到不同的服务器,所以这又是一个非常糟糕的比较。
  • 延迟不是带宽。事实上,唯一的关联是,当您消耗所有带宽时,您的延迟会增加。延迟通常源于其他因素,例如网络的网络类型(无线 == 废话)拓扑,服务器本身的负载(而不是 io)。我真的不能在这里告诉你一些有意义的事情。

标签: performance http go webserver


【解决方案1】:

“过早的优化是万恶之源”1

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

【讨论】:

    【解决方案2】:

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

    该库有一些限制,例如不支持 HTTP/2。如果你需要 REST API 的 HTTP 并且你不是在寻找互操作性,那么 fasthttp 将非常适合

    【讨论】:

      猜你喜欢
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多