ioutil.ReadAll 是否阻塞了我的服务器?

我正在尝试使用该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?


慕妹3242003
浏览 214回答 1
1回答

HUH函数

想到几件事:你没有关闭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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go