Asynchronous ioutil.ReadAll是否正在阻止我的服务器?

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秒内得到回复。但这个数

我正试图用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秒内得到回复。但这个数字一直在上升,直到45秒后才开始响应。我在一台40核的机器上运行它,带有
GOMAXPROCS=40
。我开始怀疑下载是否不是同时进行的

但如果我把这句话注释掉:

body, err := ioutil.ReadAll(response.Body)

只要返回一些长度相等的垃圾数据,我的服务器就会在0.25秒内做出一致的响应。为什么删除
ReadAll
后速度会更快?

我想到的事情很少:

  • 您没有关闭
    response.Body
    ,服务器的FDs即将用完
  • 垃圾回收器速度很慢,您正在使用
    ReadAll
    读取这么多文件,导致内存不足
  • 你因为#1而阻塞了网络
  • 尝试类似的方法,看看是否有帮助:

    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。复制总是解决这类问题的方法。