Процесс Cloud-Run завершается с ошибкой 500 кодов состояния и ошибкой диспетчера

Фон

Сервис представляет собой простую программу Go, которая передает файл из облачного хранилища в браузер.

Все отлично работает на моем Macbook, но не работает в Cloud-Run (управляемом) для некоторых запросов. В основном большие mp4 файлы.

проблема

Логи просто показывают 500 статус, как и браузер. Но мой сервис не регистрирует ничего, кроме начала копирования файла. Нет ошибок ввода-вывода или что-нибудь.

Это сообщение отображается за 4 секунды до 500 статус:

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 локально с той же конфигурацией и теми же учетными данными. Нет проблем.
  • Связаться с GCP в Твиттере

Обновление 2019-08-16

Я создал очень простой сервис, который печатает "А" на http-автореферат. Он также отлично работает локально, но возвращает 500 в облачной среде с большими размерами. 1 МБ ОК, 5 МБ ОК, 50 МБ не удается, 100 МБ не удается, и т. Д. При запуске этой службы сообщения о нарушении отсутствуют.

Код доступен здесь: https://github.com/andrioid/reproduce-cloud-run-bug

Об этом также сообщается в системе отслеживания проблем: https://issuetracker.google.com/issues/139511257

Обновление 2: вероятная причина

Похоже, существует жесткое ограничение на размер ответа до 32 МБ.

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

Очень разочаровывает, что это не может быть увеличено и что ошибка не упоминает этот предел, равно как и файл журнала.

3 ответа

На https://github.com/google/gvisor/issues/267 существует нерешенная проблема для реализации. membarrier, но пока это не разрешено в песочнице контейнера.

Обратите внимание, что вы всегда можете сообщать о проблемах на официальных трекерах проблем Google Cloud. https://cloud.google.com/support/docs/issue-trackers.

В большинстве случаев нереализованные системные вызовы в gVisor не вызывают сбои в приложении (так как большинство языков используют запасные варианты, используя более примитивные или устаревшие системные вызовы).

Я бы порекомендовал следить за проблемой, связанной с другим ответом, и ответить, сказав, что вы столкнулись с этим в Cloud Run, и в идеале предоставьте небольшую программу для решения этой проблемы. Такие проблемы часто устраняются в течение нескольких недель в зависимости от циклов выпуска.

Не похоже, что Go выполняет этот системный вызов в своем высокоуровневом коде [1], но это может быть просто из-за того, что низкоуровневый код времени выполнения Go, написанный на ассемблере, вызывает это.

Ограничение в 32 МБ для HTTP-запросов и ответов не является ограничением Cloud Run, это ограничение GFE (Global Frontend Service), которое находится перед Cloud Run Managed.

Примечание. В этот ответ я не включаю Cloud Run on Kubernetes, а только Cloud Run Managed.

GFE является обратным прокси-сервером, который завершает TCP-соединения. GFE предоставляет дополнительные функции для Cloud Run, такие как общедоступный IP-хостинг с его общедоступным DNS-именем, защита от отказа в обслуживании (DoS) и завершение TLS.

GFE используется во многих сервисах Google, и по этой причине я сомневаюсь, что это ограничение будет изменено в ближайшем будущем.

Другие вопросы по тегам