为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕妹3242003 2021-08-16 19:04:48
我正在尝试使用该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个赞

想到几件事:

  1. 你没有关闭response.Body,服务器的 FD 用完了。

  2. 垃圾收集器速度很慢,而且您的内存不足,无法使用ReadAll.

  3. 由于#1,您正在阻塞网络。

尝试这样的事情,看看它是否有帮助:

response, err := http.Get("some S3 url")

if err != nil {

    return

}

defer response.Body.Close()

_, err := io.Copy(w, response.Body)


查看完整回答
反对 回复 2021-08-16
  • 1 回答
  • 0 关注
  • 213 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信