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

标签 linux go benchmarking

我想看看 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 之间的巨大差异?

最佳答案

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

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

此外:

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

我不知道您使用的是哪种机器,但我的配备 3.5GHz i7-4771 的 iMac 可以在使用 w.Write([] byte("Hello World\n"))

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

关于linux - Go HTTP 服务器测试 ab vs wrk 结果差异如此之大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31174076/

相关文章:

c++ - Linux 内核事件 : timeval or timespec

c - hciattach 在蓝牙中的工作原理

c - 如何知道程序是否通过信号结束执行?

linux - 由于 Bison 设置问题,RHEL 5 中的单声道设置问题

performance - Go:Seek+Write 与 WriteAt 性能对比

PHP检查字符串是否为UTF-8的最快方法?

go - 如何使用 golang imap 获取 UID?

python - 保存使用 keras 训练的 TF 模型,然后在 Go 中进行评估

performance - 宗。具有变量值的 contents_from_file 属性

sqlite - Berkeley DB SQL 与 SQLite 相比有多快?