糟糕的Golang http服务器性能



我试图弄清楚即使有简单的"Hello World"响应,我也有 5600 rps 的情况。我尝试了starndard net/http,echo和fasthttp。以下是后者的示例:

func main() {
    router := routing.New()
    router.Get("/", func(c *routing.Context) error {
        fmt.Fprintf(c, "Hello, world!")
        return nil
    })
    panic(fasthttp.ListenAndServe(":7777", router.HandleRequest))
}

我使用 ab 和 wrk 进行测试。这是 wrk 命令:

$ wrk -t10 -c100 -d10s http://somesite.com
Running 10s test @ http://somesite.com
  10 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    17.05ms    1.08ms  33.46ms   91.30%
    Req/Sec   587.80     33.97   670.00     84.92%
  58603 requests in 10.10s, 8.27MB read
Requests/sec:   5802.71
Transfer/sec:    838.67KB

我在两台不同的服务器上尝试过。其中一个是简单的数字海洋实例,但另一个专用于32G RAM,8个内核和1Gb网络通道。两台服务器的结果相同。我在其中一个上运行fasthttp应用程序,在另一个上运行wrk,反之亦然。

在 HTTP/1.0 基准测试中,每个请求都是自己的 TCP 连接,基准测试实际上是在测试服务器的 TCP 会话设置和拆卸。不是网络服务器。

我刚刚使用 Go 的 net/http 重新运行了您的测试(有点(,服务器进程使用了 150% 的 CPU。在 16 个可用 CPU 中。这是可怜的 CPU 使用率。如果我使用持久的HTTP/1.1连接,它会变得更好(尝试在ab-k(。然后服务器达到 600%。

如果你想提供大量的小型临时TCP连接,专注于提高内核的TCP性能。您可以在线找到指南。这主要是关于禁用任何防火墙或连接跟踪,增加可用的文件描述符并调整TCP快速打开等内容并减少关闭套接字的超时。

最新更新