Linux 去HTTP服务器测试ab和wrk的结果有这么大的差异

Linux 去HTTP服务器测试ab和wrk的结果有这么大的差异,linux,go,benchmarking,Linux,Go,Benchmarking,我想看看GoHTTP服务器在我的机器上能处理多少请求,所以我试着做一些测试,但是差异太大了,我感到困惑 首先,我尝试使用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:

我想看看GoHTTP服务器在我的机器上能处理多少请求,所以我试着做一些测试,但是差异太大了,我感到困惑

首先,我尝试使用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之间存在巨大差异呢?

首先:基准测试通常是非常人工的。一旦您开始添加数据库调用、模板呈现、会话解析等,发送回少量字节将使您获得非常不同的结果

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

此外:

  • ab
    不受重视
  • 它仅限于HTTP/1.0,因此不支持keepalives
  • 您的其他指标差异很大-例如,查看每个工具报告的平均延迟-ab具有更高的延迟
  • 您的
    ab
    测试也会运行
    12s
    ,而您的wrk测试不会运行
    5s
  • 即使是8k req/s也是一个巨大的负载—即每小时2800万个请求。即使在进行DB调用、编组JSON结构等降低到3k/req/s之后,您仍然能够处理大量的负载。不要这么早就被这些基准测试束缚住了
我不知道您使用的是哪种机器,但我的iMac带有3.5GHz i7-4771,可以在一个线程上以
w.Write([]字节(“Hello World\n”))响应向上推送64k请求/s


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

。我们还可以批量生产40k qps(实际生产数据)。您是否有关于“ab不受重视”注释的参考资料?