猿问

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

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


万千封印
浏览 200回答 1
1回答

MMTTMM

首先:基准通常是非常人为的。一旦开始添加数据库调用、模板渲染、会话解析等,发送回少量字节会给你带来非常不同的结果(预计会有一个数量级的差异)然后解决本地问题 - 开发机器与生产机器上的打开文件/套接字限制、基准测试工具 (ab/wrk) 和 Go 服务器之间针对这些资源的竞争、本地环回适配器或 OS TCP 堆栈(以及 TCP 堆栈调整) ),等等。它继续!此外:ab 不被高度重视它只是 HTTP/1.0,因此不做 keepalives您的其他指标差异很大 - 例如查看每个工具报告的平均延迟 - ab 的延迟要高得多您的ab测试也运行,12s而不是5s您的 wrk 测试。即使 8k req/s 也是一个巨大的负载量 - 即每小时2800万个请求。即使在进行数据库调用、编组 JSON 结构等之后,速度下降到 3k/req/s,您仍然能够处理大量负载。不要太早被这些基准测试所束缚。我不知道你用的是什么类型的机器,但我的 iMac 配备 3.5GHz i7-4771 可以在单线程上推动高达 64k req/s w.Write([]byte("Hello World\n"))简短回答:使用wrk并记住基准测试工具有很多差异。
随时随地看视频慕课网APP

相关分类

Go
我要回答