【问题标题】:Go HTTP server testing ab vs wrk so much difference in resultGo HTTP 服务器测试 ab vs wrk 结果差异很大
【发布时间】:2015-07-02 01:03:23
【问题描述】:

我正在尝试查看 go HTTP 服务器在我的机器上可以处理多少个请求,因此我尝试进行一些测试,但差异太大以至于我感到困惑。

首先我尝试使用 ab 来代替并运行这个命令

$ ab -n 100000 -c 1000 http://127.0.0.1/

执行 1000 个并发请求。

结果如下:

Concurrency Level:      1000
Time taken for tests:   12.055 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Total transferred:      12800000 bytes
HTML transferred:       1100000 bytes
Requests per second:    8295.15 [#/sec] (mean)
Time per request:       120.552 [ms] (mean)
Time per request:       0.121 [ms] (mean, across all concurrent requests)
Transfer rate:          1036.89 [Kbytes/sec] received

每秒 8295 个请求,这似乎是合理的。

然后我尝试使用以下命令在 wrk 上运行它:

$ wrk -t1 -c1000 -d5s http://127.0.0.1:80/

我得到了这些结果:

Running 5s test @ http://127.0.0.1:80/
  1 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    18.92ms   13.38ms 234.65ms   94.89%
    Req/Sec    27.03k     1.43k   29.73k    63.27%
  136475 requests in 5.10s, 16.66MB read
Requests/sec:  26767.50
Transfer/sec:      3.27MB

每秒 26767 个请求?我不明白为什么会有这么大的差异。

运行的代码是最简单的 Go 服务器

package main

import (
    "net/http"
)

func main() {

    http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
        w.Write([]byte("Hello World"))
    })

    http.ListenAndServe(":80", nil)
}

我的目标是查看当我增加内核时 go 服务器可以处理多少请求,但在我开始增加更多 CPU 能力之前,这相差太大了。有谁知道添加更多内核时 Go 服务器如何扩展?还有为什么 ab 和 wrk 有这么大的区别?

【问题讨论】:

    标签: linux go benchmarking


    【解决方案1】:

    首先:基准测试通常是非常人为的。一旦您开始添加数据库调用、模板渲染、会话解析等,发回少量字节将会为您带来非常不同的结果(预计会有一个数量级的差异)

    然后解决本地问题 - 开发机器与生产机器上的打开文件/套接字限制、基准测试工具 (ab/wrk) 和 Go 服务器之间对这些资源的竞争、本地环回适配器或操作系统 TCP 堆栈(以及TCP 堆栈调整)等。继续!

    另外:

    • ab 不被重视
    • 它仅适用于 HTTP/1.0,因此不执行 keepalives
    • 您的其他指标差异很大 - 例如查看每个工具报告的平均延迟 - ab 的延迟要高得多
    • 您的ab 测试也适用于12s,而不是您的wrk 测试适用的5s
    • 即使 8k 请求/秒也是一个巨大的负载 - 即每小时 28 百万 个请求。即使——在进行数据库调用、编组 JSON 结构等之后——下降到 3k/req/s,您仍然能够处理大量负载。不要这么早就被这些基准测试所束缚。

    我不知道您使用的是哪种机器,但我的 iMac 配备 3.5GHz i7-4771 可以在以w.Write([]byte("Hello World\n")) 响应的单线程上推动超过 64k req/s

    简短回答:使用 wrk 并记住基准测试工具有很多差异。

    【讨论】:

    • 什么 ^^ 说的,我们也在使用 wrk/wrk2 进行 GO 应用负载测试。我们还可以通过批处理进行 40k qps(使用真实生产数据)。
    • 您对“ab 不被高度重视”注释有任何参考吗?
    【解决方案2】:

    主要区别在于默认情况下ab 使用 HTTP/1.0,因此在每次请求后关闭每次传输,而wrk 使用 HTTP/1.1,因此保持连接并在下一个请求中重用它。

    所以添加-k 开关,我猜你会看到类似的数字:

    $ ab -n 100000 -c 1000 -k http://127.0.0.1/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      • 2015-10-21
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      相关资源
      最近更新 更多