Asynchronous ioutil.ReadAll是否正在阻止我的服务器?
我正试图用Go编写一个服务器,使用Asynchronous ioutil.ReadAll是否正在阻止我的服务器?,asynchronous,go,Asynchronous,Go,我正试图用Go编写一个服务器,使用net/http包。我只有一条路线,而且很简单。它从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秒内得到回复。但这个数
net/http
包。我只有一条路线,而且很简单。它从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
后速度会更快?我想到的事情很少:
response.Body
,服务器的FDs即将用完ReadAll
读取这么多文件,导致内存不足response, err := http.Get("some S3 url")
if err != nil {
return
}
defer response.Body.Close()
_, err := io.Copy(w, response.Body)
公平地说,我会做出这两个改变。我不认为我的网络链接已经饱和,因为我可以在服务器工作时
curl
S3 url,它仍然可以在0.25
秒内为我下载。@VladtheImpala很高兴能帮上忙,但是的io。复制总是解决这类问题的方法。