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