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

Cloud Run 从 GCS 下载文件非常慢

Cloud Run 从 GCS 下载文件非常慢

Go
慕妹3242003 2022-06-27 15:04:54
我有一个 Go 云运行应用程序,当它启动时,它会从 GCS 下载一个 512mb 的文件(程序需要这个文件)。在本地,在我没什么特别的家庭连接上,它运行良好,它会在几秒钟内下载,但是当我将它部署到云运行时,它会像蜗牛一样下载。我不得不增加超时并记录一个进度计数器,以确保它正在做某事(确实如此)。它可能以大约 30Kb/s 的速度下载,这是行不通的。云运行实例和 GCS 区域存储桶都在 us-east4 中。似乎没有任何我可以玩的旋钮来让它工作,我没有看到这个问题/约束记录。任何人有任何想法可能是什么问题?这是下载的代码,以及大量的日志记录,因为我一开始不知道它是否在做任何事情:func LoadFilter() error {    fmt.Println("loading filter")    ctx := context.Background()    storageClient, err := storage.NewClient(ctx)    if err != nil {        return err    }    defer storageClient.Close()    ctx, cancel := context.WithTimeout(ctx, time.Minute*60)    defer cancel()    obj := storageClient.Bucket("my_slow_bucket").Object("filter_export")    rc, err := obj.NewReader(ctx)    if err != nil {        return err    }    defer rc.Close()    attrs, err := obj.Attrs(ctx)    if err != nil {        return err    }    progressR := &ioprogress.Reader{        Reader: rc,        Size:   attrs.Size,        DrawFunc: func(p int64, t int64) error {            fmt.Printf("%.2f\n", float64(p)/float64(t)*100)            return nil        },    }    fmt.Println("reading filter...")    data, err := ioutil.ReadAll(progressR)    if err != nil {        return err    }    fmt.Println("decoding filter...")    filter, err := cuckoo.Decode(data)    if err != nil {        return err    }    fmt.Println("filter decoded")    cf = filter    fmt.Println("initailized the filter successfully!")    return nil}
查看完整描述

1 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

确实,@wlhee 所说的完全正确。如果您有任何在外部运行或请求管道的活动,这些活动将无法访问提供给您的实例的完整 CPU。正如文档所说:

当运行在 Cloud Run 上的应用完成处理请求时,容器实例对 CPU 的访问将被禁用或受到严重限制。因此,您不应启动在请求处理程序范围之外运行的后台线程或例程。

运行后台线程可能会导致意外行为,因为对同一容器实例的任何后续请求都会恢复任何暂停的后台活动。

我建议您通过点击应用程序中的某个启动端点,根据对您的服务的请求从 Cloud Storage 运行此下载活动,完成下载然后返回响应以指示请求结束。

请查看此文档以获取有关 Cloud Run 的提示


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 230 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号