背景
该服务是一个简单的Go程序,将Cloud Storage中的文件传输到浏览器。
在我的Macbook上一切正常,但对于某些请求,例如大型mp4文件,在Cloud-Run(托管)上失败。
问题
日志只显示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。它在本地也完美工作,但在Cloud-Run上返回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
非常失望,无法增加此限制,并且错误没有提及此限制,日志文件也没有提及。