go - Cloud-Run 进程失败,出现 500 状态代码和 membarrier gvisor 错误

标签 go google-cloud-platform google-cloud-run gvisor

背景

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

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

问题

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

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

容器沙盒限制:不支持的系统调用 membarrier(0x10,0x0,0x0,0x8,0x775dce0b030,0x775dce0b000)。请参阅 https://gvisor.dev/c/linux/amd64/membarrier 了解更多信息。

我无法在本地复制这个。使用相同的配置和 GCP 存储桶在本地运行良好。

该服务在 Cloud-Run 上可以很好地处理较小的文件,例如图像。只是不是我试过的视频。

我试过了

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

2019-08-16 更新

我创建了一个非常简单的服务,可以将“A”打印到 http 响应编写器。它在本地也能完美运行,但在云运行时返回 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

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

最佳答案

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

关于go - Cloud-Run 进程失败,出现 500 状态代码和 membarrier gvisor 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57506187/

相关文章:

gcloud - 尝试创建 gcloud 云运行服务,它说 "Cloud Run is not available in the regions allowed by your organization. "

go - 如何从 Docker 容器中检索 GOPATH?

go - 在字段(golang)中嵌入结构的目的是什么?

google-cloud-storage - 如何保持存储桶与 Google Cloud Source Repository 同步

google-cloud-platform - (gcloud.run.deploy)Cloud Run错误: Container failed to start.无法启动然后监听端口

google-cloud-sql - Cloud Run 和 Cloud SQL 之间的连接(内部 IP)

arrays - Golang中如何返回未知类型的数组?

go - 从 slice 中移除接口(interface)项

google-cloud-storage - 我可以将 Google Cloud Storage 用于 Apache DocumentRoot 吗?

firebase - 为什么我的项目 firestore 是 eu3,但 firebase 云功能位置是 US1?