我正在尝试使用该net/http包在 Go 中编写服务器。我只有一条路线,而且很简单。它从 S3 下载一个文件并将其返回给客户端:response, err := http.Get("some S3 url")if err != nil { return}body, err := ioutil.ReadAll(response.Body)w.Write(body)自己下载 url 大约需要 0.25 秒。所以我启动这个服务器并发送 250 个请求/秒。最初我在 0.25 秒内得到回复。但是这个数字一直在上升,直到开始需要 45 秒才能做出响应。我在一台 40 核机器上运行它,使用GOMAXPROCS=40. 我开始想知道下载是否不会并行发生。但如果我注释掉这一行:body, err := ioutil.ReadAll(response.Body)并且只返回一些等长的垃圾数据,突然我的服务器在 0.25 秒内始终响应。为什么删除后速度更快ReadAll?
1 回答
HUH函数
TA贡献1836条经验 获得超4个赞
想到几件事:
你没有关闭
response.Body
,服务器的 FD 用完了。垃圾收集器速度很慢,而且您的内存不足,无法使用
ReadAll
.由于#1,您正在阻塞网络。
尝试这样的事情,看看它是否有帮助:
response, err := http.Get("some S3 url")
if err != nil {
return
}
defer response.Body.Close()
_, err := io.Copy(w, response.Body)
- 1 回答
- 0 关注
- 213 浏览
添加回答
举报
0/150
提交
取消