Cloud-Run进程失败,并显示500个状态代码和一个错误的gvisor错误

时间:2019-08-15 07:26:32

标签: go google-cloud-run gvisor

背景

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

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

问题

与浏览器一样,日志仅显示dr("ClockType")状态。但是我的服务除了开始复制文件外不记录任何其他信息。没有IO错误或其他任何内容。

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

500

我无法在本地复制。在相同配置和GCP存储桶的情况下,可以在本地正常运行。

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

我已经尝试过

  • 将所有内容记录到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.。没有错误,挂起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

非常令人失望的是,它不能增加,并且错误未提及此限制,日志文件也没有。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

我建议遵循另一个答案和答案上链接的问题,说您在Cloud Run上遇到了这个问题,并且最好提供一个解决此问题的小程序。这些问题通常会在几周内解决,具体取决于发布周期。

看起来好像Go不在其高级代码[1]中执行此系统调用,但可能很简单地是用汇编语言编写的Go较低的运行时代码导致了此问题。

答案 2 :(得分:0)

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

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

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

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