Go HTTP服务器测试ab和wrk结果差异如此之大

16

我正在尝试查看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之间巨大的差异?

我的目标是观察增加核心数后Go服务器能够处理多少请求,但即使在增加更多CPU之前就已经存在巨大的差异。请问有人知道在增加更多的核心时Go服务器如何扩展?另外,为什么ab和wrk之间会有如此巨大的差异?

2个回答

33
首先:基准测试通常是相当人工的。仅返回少量字节将导致在添加数据库调用、模板渲染、会话解析等后,结果有非常不同的表现。 (预计会有数量级的差异)
然后加上本地问题 - 开发机器与生产环境上的打开文件/套接字限制、基准测试工具(ab / wrk)和您的Go服务器之间的竞争,本地环回适配器或OS TCP堆栈(以及TCP堆栈优化)等。其中还有更多!
此外:
- ab并不受高度评价 - 它仅支持HTTP/1.0,因此不支持保持活动连接 - 您的其他指标变化很大-例如查看每个工具报告的平均延迟-ab具有更高的延迟 - 您的ab测试也运行了12秒,而不是wrk测试的5秒。 - 即使8k req/s是巨大的负载量 - 每小时2800万个请求。即使在进行DB调用、组合JSON结构等操作之后,这些请求数量降至3k/req/s,您仍然可以处理大量负载。不要在这种早期就过于关注这些基准测试。
我不知道您使用的是什么类型的机器,但是我的iMac配备了3.5GHz i7-4771处理器,在单个线程上可以推动高达64k req/s的响应,方法是使用w.Write([]byte("Hello World\n")) 简而言之:使用wrk,并牢记基准测试工具存在很多差异。

就像 ^^ 所说的,我们也在使用 wrk/wrk2 进行 GO 应用程序负载测试。我们还可以通过批处理实现 40k qps(使用真实生产数据)。 - Varun
10
你有任何关于“ab不受高度评价”的参考资料吗? - cherouvim

1
主要的区别在于,默认情况下ab使用HTTP/1.0,因此每个请求后关闭传输,而wrk使用HTTP/1.1,因此保持连接并重用它以进行下一个请求。
因此,添加-k开关,您将看到类似的数字,我猜:
$ ab -n 100000 -c 1000 -k http://127.0.0.1/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接