5

背景

该服务是一个简单的 Go 程序,它将文件从 Cloud Storage 传输到浏览器。

在我的 Macbook 上一切正常,但在 Cloud-Run(托管)上因某些请求而失败。主要是大型 mp4 文件。

问题

日志只显示500状态,浏览器也是如此。但是我的服务除了开始复制文件之外没有记录任何内容。没有 IO 错误或任何东西。

此消息在500状态前 4 秒显示:

Container Sandbox Limitation: Unsupported syscall membarrier(0x10,0x0,0x0,0x8,0x775dce0b030,0x775dce0b000). Please, refer to https://gvisor.dev/c/linux/amd64/membarrier for more information.

我无法在本地重现此内容。使用相同的配置和 GCP 存储桶在本地正常工作。

该服务在具有较小文件(如图像)的 Cloud-Run 上运行良好。只是不是我尝试过的视频。

我试过了

  • 将所有内容记录到io.Copy. io.Copy没有错误,调用后挂起。
  • 增加容器的内存。它现在运行1G。与512M没有变化。
  • 在本地的 Docker 容器中运行,具有相同的配置、相同的凭据。没问题。
  • 在 Twitter 上联系 GCP

2019-08-16 更新

我创建了一个非常简单的服务,可以将“A”打印到 http responsewriter。它在本地也能完美运行,但在云运行中返回 500 并具有较大的尺寸。1MB OK、5MB OK、50 MB 失败、100MB 失败等。此服务运行时没有成员消息。

代码可在此处获得:https ://github.com/andrioid/reproduce-cloud-run-bug

也报告了问题跟踪器:https ://issuetracker.google.com/issues/139511257

更新 2:可能的原因

似乎对 32MB 的响应大小有硬性限制。

https://cloud.google.com/run/quotas

非常令人失望的是,这不能增加,错误没有提到这个限制,日志文件也没有。

4

3 回答 3

0

HTTP 请求和响应的 32 MB 限制不是 Cloud Run 限制,这是 Cloud Run Managed 前面的 GFE(全局前端服务)的限制。

注意:我在此答案中不包括 Cloud Run on Kubernetes,仅包括 Cloud Run Managed。

GFE 是终止 TCP 连接的反向代理。GFE 为 Cloud Run 提供了其他功能,例如其公共 DNS 名称的公共 IP 托管、拒绝服务 (DoS) 保护和 TLS 终止。

GFE 用于许多 Google 服务,因此,我怀疑这种限制在不久的将来会改变。

于 2019-08-17T05:47:29.630 回答
0

https://github.com/google/gvisor/issues/267有一个悬而未决的问题要实施membarrier,但目前容器沙箱不允许这样做。

于 2019-08-15T22:54:57.907 回答
0

请注意,您始终可以在 Google Cloud 官方问题跟踪器上报告问题。https://cloud.google.com/support/docs/issue-trackers

在大多数情况下,gVisor 中未实现的系统调用不会导致应用程序崩溃(因为大多数语言通过使用更原始或遗留系统调用来使用回退)。

我建议您关注另一个答案中链接的问题,并回复说您在 Cloud Run 上点击了这个,理想情况下提供一个小程序来解决这个问题。根据发布周期,此类问题通常会在几周内得到解决。

看起来 Go 并没有在其高级代码[1]中执行此系统调用,但可能只是用汇编编写的低级 Go 运行时代码导致了这种情况。

于 2019-08-16T03:01:41.127 回答