糟糕的Golang HTTP服务器性能

Jam*_*May -4 high-load go

我试图弄清楚即使使用简单的“ 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))
}
Run Code Online (Sandbox Code Playgroud)

我使用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
Run Code Online (Sandbox Code Playgroud)

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

Zan*_*ynx 9

在每个请求都是其自己的TCP连接的HTTP / 1.0基准测试中,基准测试实际上是在测试服务器的TCP会话建立和拆除。不是Web服务器。

我只是使用Go的net / http重新运行了您的测试(很好),服务器进程使用了​​150%的CPU。16个可用CPU中。那是可悲的CPU使用率。它变得更好,如果我使用持久性HTTP / 1.1连接(试行-kab)。然后服务器上升到600%。

如果您想提供许多小型的临时TCP连接,请着重改善内核的TCP性能。您可以在线找到指南。这主要与禁用任何防火墙或连接跟踪,增加可用文件描述符以及调整诸如TCP Fast Open以及减少封闭套接字的超时等有关。