我试图看看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之间存在巨大差异?
答案 0 :(得分:19)
首先:基准通常是非常人为的。一旦开始添加数据库调用,模板渲染,会话解析等,发送回少量字节将使您非常不同的结果(期望一个数量级差异)
然后解决本地问题 - 在开发机器上打开文件/套接字限制与生产,基准测试工具(ab / wrk)和Go服务器之间的竞争,以获取这些资源,本地环回适配器或OS TCP堆栈(以及TCP堆栈调整等等。它继续!
另外:
ab
未受到高度重视ab
测试也适用于12s
而不是5s
您的wrk测试。我不知道你在使用什么样的机器,但是我的iMac配备3.5GHz i7-4771可以在单个线程上推送64k req / s以及w.Write([]byte("Hello World\n"))
简短回答:使用wrk
并记住基准测试工具有很多差异。