我正在使用谷歌云存储来存储和检索一些文件,我的问题是我得到的响应时间不一致,有时甚至很慢。
我的应用程序是在Google容器引擎中运行的ASP.NET核心应用程序。 Container Engine集群位于europe-west1-c
。云存储桶是多区域的,位于EU
,它是一个安全的存储桶(不可公开访问)。我正在使用最新版本的官方Google.Cloud.Storage.V1
SDK包来访问云存储。 (我尝试了1.0.0
和新的2.0.0-beta01
。)我正在使用StorageClient
对象的单例实例,它应该在引擎盖下进行连接池。
我正在测量并记录从云存储下载文件所需的时间,这是我所做的测量。
var sw = Stopwatch.CreateNew();
await client.DownloadObjectAsync(googleCloudOptions.StorageBucketName, filepath, ms);
sw.Stop();
所以我在没有任何自己的应用程序逻辑的情况下直接测量SDK调用。
我在这个测量中获得的数字在平均时间内看起来像这样。
44ms
56ms
501ms
274ms
90ms
237ms
145ms
979ms
446ms
148ms
您可以看到方差已经非常大(并且响应时间通常非常缓慢)。
但偶尔我会得到这样的响应时间(我见过的最慢的时间超过10秒)。
172ms
4,348ms
72ms
51ms
179ms
2,508ms
2,592ms
100ms
考虑到我正在下载的文件大小约为2 KB,而我的应用程序每秒执行的请求少于1个,并且我在Google Cloud中运行我的应用程序,这真的很糟糕。我不认为没有预热的桶可能是一个问题,因为我主要是下载相同的少量文件,而且我每分钟至少要做几次请求。
有谁知道这种缓慢的原因是什么,或者我如何调查出了什么问题?
更新:按照@ jterrace的建议,我在生产环境中运行gsutil perfdiag
,并上传了终端输出和生成的json报告here。
我还收集了一些测量值,在这里你可以看到过去7天的统计数据。
因此,您可以看到缓慢的请求不会经常发生,但超过半秒的响应时间并不罕见,我们甚至每天都会有超过5秒的请求。
我想弄清楚的是我们是否做错了什么,或者这是云存储的预期,我们必须准备好能够处理这些缓慢的响应。
我们与GCS有同样的问题。我们得到的唯一答案(来自GCS支持)是使用指数退避。第一个请求应该是200ms超时,接下来尝试400ms等等。
我在GCE中看到的一个常见问题是,由于gcloud客户端具有严重的DNS依赖性,因此DNS查询会限制流量突发,而不是实际客户端(存储或其他)。我强烈建议您将etcd或其他DNS缓存添加到容器中。 GCE中任何实际的流量都会窒息。