Google Cloud Run 与本地机器相比非常慢

Posted

技术标签:

【中文标题】Google Cloud Run 与本地机器相比非常慢【英文标题】:Google Cloud Run is very slow vs. local machine 【发布时间】:2020-07-24 00:46:28 【问题描述】:

我们有一个小脚本可以抓取网页(约 17 个条目),并将它们写入 Firestore 集合。为此,我们在 Google Cloud Run 上部署了一项服务。

使用 Docker 容器映像,此代码的执行需要大约 5 秒 when tested locally。 将同一映像部署到 Cloud Run 时需要 1 多分钟。

即使是“删除集合中的所有文档”这样简单的命令(在本地需要 2-3 秒),在 Cloud Run 上部署时也需要超过 10 秒。

我们知道冷启动,因此我们在后续的第三、第四和第五次运行中测试了 Cloud Run 的性能,但仍然很慢。

我们还对 CPU 的数量、实例、并发、内存进行了实验,在两端都使用默认值和极值,但 Cloud Run 的性能很慢。

这是预期的吗? Cloud Run 的个别实例真的这么弱吗?我们可以做点什么让它更快吗?

这种缓慢的问题在于,如果我们为大量条目运行代码,Cloud Run 最终会超时(更不用说 Cloud Run 每秒的成本)

【问题讨论】:

你本地环境的CPU数量是多少?它的速度是 Mhz 吗?您能否尝试创建一个 VM(n1-standard1)并在其上运行您的脚本,以比较它是 Cloud Run 环境(及其 GVisor 沙箱)是否会减慢您的处理速度,或者仅仅是 CPU 的 nb。另一种方式,您的堆栈驱动程序日志中是否有 GVisor 警告? 除上述之外,能否也澄清一下,如果你在文件系统上写了很多东西? Cloud Run 的文件系统比本地机器慢。 感谢 cmets。我们找到了原因,这是我们自己的实现最终转移到了 Cloud Run 文档不推荐的后台调用。 【参考方案1】:

在我们对此进行了大量试验并在我们自己的实施中发现问题时,发布我自己的问题的答案。

在我们的例子中,性能超慢的原因是没有 Promise 或回调的异步调用。

我们最初错过的是这个部分:Avoiding background activities

我们的代码没有等待异步操作结束,而是立即响应请求。然后异步操作转移到后台活动,并且需要很长时间才能完成。


回复 cmets 张贴,或可能出现的类似问题: 1. 我们没有尝试通过设置具有相同配置的虚拟机来尝试本地,因为我们很快就找到了原因。

    我们还没有在文件系统上写任何东西,操作只是简单的调用。但这是个好问题,我们在存储/写入数据时会牢记这一点

【讨论】:

以上是关于Google Cloud Run 与本地机器相比非常慢的主要内容,如果未能解决你的问题,请参考以下文章

使用 GRPC 与 Google Cloud Run 通信的 Google App Engine 给出“错误:14 不可用:连接已断开”

与 GKE 中的普通服务相比,运行 Cloud Run 的价值主张是啥?

Google Cloud Tasks 无法向 Cloud Run 进行身份验证

Stackdriver Trace 与 Google Cloud Run

输入使用 Google Cloud Run 运行的 docker 容器

Google Cloud Run 不加载 .env 文件