云 运行 - 请求延迟

Cloud Run - Requests latency

我正在尝试使用 Cloud 运行 运行 连接到 Firestore 的微服务。微服务根据s2geometry创建对象,创建多个具有特定属性的地理区域,从而帮助本地化用户根据我定位的区域向他们发送信息。

我使用 Python 3.7 和 FastAPI 创建微服务和与之通信的路由。

微服务 运行 在我的本地计算机和 Compute Engines 上运行顺利,因为我的大多数路由在测试时都需要不到 150 毫秒的响应时间。但是,当我使用 Cloud 运行 部署它时,我遇到了延迟问题。 有时,微服务需要很长时间才能回答(最多 15 分钟),我无法确定到底是什么原因造成的。

这是一个屏幕截图,我们可以在其中看到请求计数和请求延迟:

Request Count and Request Latency

请求延迟与请求数量之间没有真正的相关性,或者至少没有微不足道的相关性。 我还查看了服务的内存使用情况,内存使用情况最多为 30%。 CPU 使用率有时会达到 100%,但在请求缓慢时不一定。

最后,当我探索跟踪列表并比较具有高延迟的请求时,我注意到以下差异

Trace of slow request
Trace of fast request

快请求似乎会调用自己,而慢请求则不会,我不知道为什么。

目前我们的用户并不多,所以我认为这可能是冷启动问题,但缓慢的请求不一定是第一个。

现在,老实说,我不知道这里发生了什么,也不知道 Cloud 运行 做了什么(或者我做错了什么),而且我也发现很难找到关于 Cloud 如何运作的详尽解释运行 实际上有效,所以如果你有一个(除了 google 一个)我会很乐意深入研究它。

非常感谢您的帮助

经过多次测试,似乎是cold start问题。 云 运行 容器在一段时间后未被使用时会停止,并且由于我们没有大量流量,每次用户想要访问该应用程序时容器都必须重新启动。

解法:

我创建了一个每分钟运行该函数的 Cloud Function that sends a request to the container when triggered and then created a Cloud Scheduler 作业。

注:

如果将不同的修订路由到您的服务,您需要为每个修订创建一个 Cloud Scheduler 作业。为此,您必须为每个路由修订(当前为测试版)创建一个 Revision URL(标签)。

编辑:

现在正如@Jofre 提到的那样,您可以通过将“最小实例数”设置为 1 来选择始终拥有服务实例 运行。如果您使用的是控制台,GCP 甚至会告诉您“设置为 1 以减少冷启动”。