Cloud-Run 进程失败并显示 500 状态代码和 membarrier gvisor 错误

And*_*oid 5 go google-cloud-platform google-cloud-run gvisor

背景

该服务是一个简单的 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,50MB 失败,100MB 失败等等。这个服务运行时没有 membarrier 消息。

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

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

更新 2:可能的原因

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

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

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

Dus*_*ram 0

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