Фоновое изображение
Сервис представляет собой простую программу 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 в Twitter
Обновление от 16 августа 2019 г.
Я создал очень простой сервис, который печатает букву «А» в ответчике 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
Очень досадно, что это не может быть увеличено и что ошибка не упоминает это ограничение, как и файл журнала.