背景
该服务是一个简单的 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
非常令人失望的是,这不能增加,错误没有提到这个限制,日志文件也没有。