Go HTTP 服务器测试 ab vs wrk 结果差异如此之大
Go HTTP server testing ab vs wrk so much difference in result
我想看看 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 -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 之间的巨大差异?
首先:基准通常是非常人为的。一旦您开始添加数据库调用、模板渲染、会话解析等(预计会有一个数量级的差异)
然后解决本地问题 - 打开 file/socket 开发机器与生产机器的限制,你的基准测试工具 (ab/wrk) 和你的 Go 服务器之间对这些资源的竞争,本地环回适配器或 OS TCP 堆栈(和 TCP 堆栈调整)等。继续!
另外:
ab
评价不高
- 它只是 HTTP/1.0,因此不执行 keepalives
- 您的其他指标差异很大 - 例如查看每个工具报告的平均延迟 - ab 的延迟要高得多
- 您的
ab
测试也会运行 12s
而不是 5s
您的 wrk 测试。
- 即使是 8k req/s 也是一个巨大的负载 - 一个小时有 28 百万 请求。即使在进行数据库调用、编组 JSON 结构等之后下降到 3k/req/s,您仍然能够处理大量负载。这么早不要太拘泥于这些基准测试。
我不知道您使用的是哪种机器,但我的配备 3.5GHz i7-4771 的 iMac 可以在单个线程上推高 64k req/s w.Write([]byte("Hello World\n"))
简短回答:使用 wrk
并记住基准测试工具有很大差异。
主要区别在于默认情况下ab
使用HTTP/1.0,所以在每次请求后关闭每次传输,而wrk
使用HTTP/1.1,所以保持连接并重新用于下一个请求。
所以添加 -k
开关,你会看到类似的数字,我猜:
$ ab -n 100000 -c 1000 -k http://127.0.0.1/
我想看看 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 -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 之间的巨大差异?
首先:基准通常是非常人为的。一旦您开始添加数据库调用、模板渲染、会话解析等(预计会有一个数量级的差异)
然后解决本地问题 - 打开 file/socket 开发机器与生产机器的限制,你的基准测试工具 (ab/wrk) 和你的 Go 服务器之间对这些资源的竞争,本地环回适配器或 OS TCP 堆栈(和 TCP 堆栈调整)等。继续!
另外:
ab
评价不高- 它只是 HTTP/1.0,因此不执行 keepalives
- 您的其他指标差异很大 - 例如查看每个工具报告的平均延迟 - ab 的延迟要高得多
- 您的
ab
测试也会运行12s
而不是5s
您的 wrk 测试。 - 即使是 8k req/s 也是一个巨大的负载 - 一个小时有 28 百万 请求。即使在进行数据库调用、编组 JSON 结构等之后下降到 3k/req/s,您仍然能够处理大量负载。这么早不要太拘泥于这些基准测试。
我不知道您使用的是哪种机器,但我的配备 3.5GHz i7-4771 的 iMac 可以在单个线程上推高 64k req/s w.Write([]byte("Hello World\n"))
简短回答:使用 wrk
并记住基准测试工具有很大差异。
主要区别在于默认情况下ab
使用HTTP/1.0,所以在每次请求后关闭每次传输,而wrk
使用HTTP/1.1,所以保持连接并重新用于下一个请求。
所以添加 -k
开关,你会看到类似的数字,我猜:
$ ab -n 100000 -c 1000 -k http://127.0.0.1/