Linux 去HTTP服务器测试ab和wrk的结果有这么大的差异
我想看看GoHTTP服务器在我的机器上能处理多少请求,所以我试着做一些测试,但是差异太大了,我感到困惑 首先,我尝试使用ab进行测试并运行此命令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:
$ 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
,而您的wrk测试不会运行12s
5s
- 即使是8k req/s也是一个巨大的负载—即每小时2800万个请求。即使在进行DB调用、编组JSON结构等降低到3k/req/s之后,您仍然能够处理大量的负载。不要这么早就被这些基准测试束缚住了
w.Write([]字节(“Hello World\n”))响应向上推送64k请求/s
简短回答:使用wrk
并记住,基准测试工具有很多差异。。我们还可以批量生产40k qps(实际生产数据)。您是否有关于“ab不受重视”注释的参考资料?