我想看看 go HTTP 服务器可以在我的机器上处理多少请求,所以我尝试做一些测试,但差异太大了,我很困惑。首先,我尝试使用 ab 进行测试并运行此命令$ ab -n 100000 -c 1000 http://127.0.0.1/做 1000 个并发请求。结果如下:Concurrency Level: 1000Time taken for tests: 12.055 secondsComplete requests: 100000Failed requests: 0Write errors: 0Total transferred: 12800000 bytesHTML transferred: 1100000 bytesRequests 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 readRequests/sec: 26767.50Transfer/sec: 3.27MB每秒 26767 个请求?我不明白为什么会有如此巨大的差异。代码运行是最简单的 Go 服务器package mainimport ( "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 之间的巨大差异?
1 回答

MMTTMM
TA贡献1869条经验 获得超4个赞
首先:基准通常是非常人为的。一旦开始添加数据库调用、模板渲染、会话解析等,发送回少量字节会给你带来非常不同的结果(预计会有一个数量级的差异)
然后解决本地问题 - 开发机器与生产机器上的打开文件/套接字限制、基准测试工具 (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
并记住基准测试工具有很多差异。
- 1 回答
- 0 关注
- 199 浏览
添加回答
举报
0/150
提交
取消