go - 糟糕的 Golang http 服务器性能

标签 go high-load

我想弄清楚即使是简单的“Hello World”响应,我也能达到 5600 rps。我尝试了 standard 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

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

最佳答案

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

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

如果你想为很多小的临时 TCP 连接提供服务,请专注于提高内核的 TCP 性能。您可以在线查找指南。它主要是关于禁用任何防火墙或连接跟踪、增加可用的文件描述符和调整诸如 TCP 快速打开之类的东西以及减少关闭套接字的超时。

关于go - 糟糕的 Golang http 服务器性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55561495/

相关文章:

data-structures - 有没有提供关联数组功能的 go 库?

amazon-web-services - 如果我们为 Node 应用程序配备了 AWS 应用程序负载均衡器,Nginx 会变得多余吗?

php - 将 mysql 查询移出循环

去处理工作区中的多个项目

go - 如何在 slice 中分配动态类型

linux - 用于创建高性能服务器应用程序的库

rest - 提高网络服务器性能

java - Spring Boot Netty Web 应用程序的吞吐量

go - 使用反射取消引用结构指针和访问字段

macos - 如何配置 Go 以便它可以访问 OSX 中的环境变量