去HTTP服务器测试ab vs wrk结果差异很大

Ale*_*lex 5 linux benchmarking go

我试图看看HTTP服务器可以在我的机器上处理多少请求,所以我尝试做一些测试,但差异太大,我很困惑.

首先,我尝试用ab替补并运行此命令

$ ab -n 100000 -c 1000 http://127.0.0.1/
Run Code Online (Sandbox Code Playgroud)

做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
Run Code Online (Sandbox Code Playgroud)

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

但后来我试着用这个命令在wrk上运行它:

$ wrk -t1 -c1000 -d5s http://127.0.0.1:80/
Run Code Online (Sandbox Code Playgroud)

我得到了这些结果:

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

每秒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)
}
Run Code Online (Sandbox Code Playgroud)

我的目标是看看当我增加内核时go服务器可以处理多少请求,但在我开始增加更多CPU功率之前,这是一个太大的差异.有没有人知道Go服务器在添加更多内核时如何扩展?还有为什么ab和wrk之间存在巨大差异?

eli*_*rar 24

首先:基准通常是非常人为的.一旦你开始添加数据库调用,模板渲染,会话解析等,发送回少量字节将会给你带来非常不同的结果(期望一个数量级的差异)

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

此外:

  • ab 没有被高度重视
  • 它只是HTTP/1.0,因此不执行keepalive
  • 您的其他指标变化很大 - 例如,查看每个工具报告的平均延迟 - ab具有更高的延迟
  • 您的ab测试也适用12s5s您的wrk测试,而不是您的测试.
  • 即使是8k req/s也是一个巨大的负载 - 每小时2800 万个请求.即使在进行数据库调用之后,编组JSON结构等等 - 降至3k/req/s,您仍然可以处理大量的负载.这个早期的基准测试不要过于紧张.

我不知道你在使用什么样的机器,但是我的iMac配备3.5GHz i7-4771可以在单个线程上推送64k req/s以上 w.Write([]byte("Hello World\n"))

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

  • 你有关于“ab 不被高度重视”的任何参考资料吗? (7认同)