簡體   English   中英

Cloud Run 從 GCS 下載文件非常慢

[英]Cloud Run downloading a file from GCS is insanely slow

我有一個 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
}

@wlhee 所說的確實完全正確。 如果您有任何在外部運行或請求管道的活動,這些活動將無法訪問為您的實例提供的完整 CPU。 正如文檔所說:

當 Cloud Run 上運行的應用完成處理請求時,容器實例對 CPU 的訪問將被禁用或受到嚴重限制。 因此,您不應啟動在請求處理程序范圍之外運行的后台線程或例程。

運行后台線程可能會導致意外行為,因為對同一容器實例的任何后續請求都會恢復任何掛起的后台活動。

我建議您通過點擊應用程序中的某個啟動端點,根據對您的服務的請求從 Cloud Storage 運行此下載活動,完成下載然后返回響應以指示請求結束。

請查看此文檔以獲取有關 Cloud Run 的提示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM