Тайм-аут развертывания golang в облачной сборке App Engine из-за того, что уровень кэша Go занимает слишком много времени

Мы развертываем сервисы, написанные на Golang, в стандартной среде App Engine.

В течение многих лет у нас не было проблем с этим: развертывание занимало от 2 до 5 минут.

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

Прямо сейчас он в основном всегда истекает по тайм-ауту, а не развертывается до истечения 10-минутного тайм-аута.

Нашим первым шагом было попытаться увеличить этот предел тайм-аута.

Мы изучили документацию и обнаружили, чтоможно использовать для увеличения этого времени ожидания до 15 минут. Итак, мы попробовали это, но время ожидания все равно истекает через 10 минут. Теперь мы узнали в документации, что это изменит таймаут для среды Flex, но не для среды Standard.

Как было сказано выше, мы не совсем понимаем, почему время развертывания вообще увеличивается, и на самом деле этот сервис правильно развертывается в рабочей среде менее чем за 5 минут.

Сейчас мы изучаем сводную информацию о сборке облака, чтобы увидеть, в чем различия, и вот наш вывод.

Сборки с тайм-аутом используют слой кэша Go, выполнение которого занимает много времени.

По истечении времени сводка сборки будет выглядеть следующим образом:

  • Сборщик шага 0 завершит работу через 2 секунды.
  • Шаг 1. Подготовка завершится за 0 секунд.
  • Шаг 2 до тегирования завершится через 7 секунд.
  • Детектор шага 3 завершит работу за 17 секунд.
  • Шаг 4. Анализатор завершит работу за 2 секунды.
  • Шаг 5. Реставратор завершит работу за 1 минуту 4 секунды.
  • Строитель завершил шестой этап за 34 секунды.
  • Тайм-аут экспортера шага 7 через 7 минут 54 минуты

В сборке, которая развернута правильно (еще в январе или в рабочей среде, где она все еще развертывается правильно), мы видим, что шаг 5 занимает несколько секунд, а шаг 7 — ~2 минуты.

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

Вот журнал из сводки сборки, касающейся этого уровня кэша на шаге 5.

      2021-04-27 17:16:44.658 ICTStarting Step #5 - "restorer"
Info
2021-04-27 17:16:44.660 ICTStep #5 - "restorer": Already have image (with digest): eu.gcr.io/gae-runtimes/buildpacks/go113/builder:go113_20210406_1_13_15_RC00
Info
2021-04-27 17:16:46.238 ICTStep #5 - "restorer": Restoring data for "google.go.build:gocache" from cache
Info
2021-04-27 17:16:46.238 ICTStep #5 - "restorer": Retrieving data for "sha256:2b4be425fac1c997f7350663ff0406cc65bcff4acc894f8b07c0af09284a950e"
Info
2021-04-27 17:17:39.732 ICTFinished Step #5 - "restorer"

Здесь получение данных для уровня кэша заняло 53 секунды, тогда как раньше это занимало несколько секунд.

А вот лог с шага 7

      Info
2021-04-27 18:33:29.861 ICTStep #7 - "exporter": Adding cache layer 'google.go.build:gocache'
Info
2021-04-27 18:33:29.861 ICTStep #7 - "exporter": Layer 'google.go.build:gocache' SHA: sha256:6851017222d45b350217544670d113df46d630ffb51fc0c0a4bbb669c65d2178
Info
2021-04-27 18:39:57.199 ICTTIMEOUT
Info
2021-04-27 18:39:57.199 ICTERROR: context deadline exceeded

Здесь добавление уровня кэша не удалось завершить, поскольку вся сборка теперь занимала более 10 минут, тогда как раньше выполнение шага 7 занимало от ~15 до ~25 секунд.

Мы также заметили некоторые ошибки, связанные с этим слоем кэша, которые иногда возникают при успешных сборках, но мы не уверены, что это связано с увеличением времени.

Unable to delete previous cache image: DELETE https://eu.gcr.io/v2/xxxx/app-engine-tmp/build-cache/ttl-7d/xxxx/buildpack-cache/manifests/sha256:872c0a8965bc92689e2184fb277146bb05716e38352fb539115485c7d982dbcc: GOOGLE_MANIFEST_DANGLING_TAG: Manifest is still referenced by tag: dcd74554-d009-4147-8ddf-8fb36a67e92f

Или

Warning: Failed to export cache: committing cache: saving image 'eu.gcr.io/xxx/app-engine-tmp/build-cache/ttl-7d/xxx/buildpack-cache:latest': failed to write image to the following tags: [eu.gcr.io/xxx/app-engine-tmp/build-cache/ttl-7d/xxx/buildpack-cache:latest: PUT https://eu.gcr.io/v2/xxx/app-engine-tmp/build-cache/ttl-7d/xxx/buildpack-cache/manifests/latest: MANIFEST_INVALID: Failed to parse manifest for request "/v2/xxx/app-engine-tmp/build-cache/ttl-7d/xxx/buildpack-cache/manifests/latest": Manifest is missing required field "layers".]

Мы пытаемся расследовать это дальше, но пока безуспешно.

Что может быть причиной этого ?

Сердечно.

0 ответов

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