Процесс 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, и по этой причине я сомневаюсь, что это ограничение будет изменено в ближайшем будущем.