我正在尝试查看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之间的巨大差异?
首先:基准测试通常是虚假的。一旦开始添加数据库调用,模板渲染,会话解析等,发送回几个字节将为您 带来 截然不同的结果(请注意数量级的差异)
然后解决本地问题-开发机器与生产之间的开放文件/套接字限制,基准测试工具(ab / wrk)与Go服务器之间的资源竞争,本地环回适配器或OS TCP堆栈(以及TCP堆栈调整) ),等等。
此外:
ab
12s
5s
我不知道您使用的是哪种机器,但我的3.5GHz i7-4771的iMac可以在单线程上以每秒64k req / s的速度响应,并响应 w.Write([]byte("Hello World\n"))
w.Write([]byte("Hello World\n"))
简短答案:使用wrk并牢记基准测试工具存在很大差异。
wrk