从 google 云存储桶下载时如何提高每秒缓慢请求率

How to improve slow requests per second rate when downloading from google cloud storage bucket

我正在使用 @google-cloud/storage 库从我的 google 云存储桶中获取数据。但是我无法从桶中获得超过 ~5 downloads/second。

const Storage = require('@google-cloud/storage');
const storage = Storage({ keyFilename: './gcloud-api-creds.json' });
const bucket = storage.bucket('my-bucket');

Promise.all(Array.from(Array(80)).map(
  (d,i) => bucket.file(`index.html`)
    .download()
    .then(() => console.log(`done ${i}`))
)).then(() => console.log("READY"));

完成 80 个下载请求大约需要 14 秒。我相信我达到了一些每个用户的存储限制。

Google Cloud Storage 文档声称默认支持 ~5000 req/s

There is no limit to reads of an object. Buckets initially support roughly 5000 reads per second and then scale as needed. (https://cloud.google.com/storage/quotas)

我怎样才能达到这个速度?

我认为问题不在于 @google-cloud/storage 库或任何速率限制,而在于如何使用 map 方法。

Array.map is executed synchronously,因此,如果您每次都等待完成下载后再开始新的下载,即使您使用的是 Promise.all 而不是在parallel 因为你在数组上工作时没有创建任何承诺。所以你比预期的要慢。

我认为您可能会发现这个示例非常有用

var arr = [1, 2, 3, 4, 5];

var results: number[] = await Promise.all(arr.map(async (item): Promise<number> => {
    await callAsynchronousOperation(item);
    return item + 1;
}));

根据 MDN docs for Promise.all:

The Promise.all(iterable) method returns a promise that resolves when all of the promises in the iterable argument have resolved, or rejects with the reason of the first passed promise that rejects.

在与 google 云支持团队讨论后,我们发现实际使用的带宽限制了 App Engine Flex 容器上的每秒请求量。

根据 gsutil perf 测试,实例和云存储桶之间的下载带宽似乎只有 65mbit。