Тайм-аут развертывания golang в облачной сборке App Engine из-за того, что уровень кэша Go занимает слишком много времени
Мы развертываем сервисы, написанные на Golang, в стандартной среде App Engine.
В течение многих лет у нас не было проблем с этим: развертывание занимало от 2 до 5 минут.
С января мы наблюдали, как время развертывания одной из служб росло, пока в прошлом месяце она не начала иногда отключаться, хотя эта служба существенно не изменилась.
Прямо сейчас он в основном всегда истекает по тайм-ауту, а не развертывается до истечения 10-минутного тайм-аута.
Нашим первым шагом было попытаться увеличить этот предел тайм-аута.
Мы изучили документацию и обнаружили, что
Как было сказано выше, мы не совсем понимаем, почему время развертывания вообще увеличивается, и на самом деле этот сервис правильно развертывается в рабочей среде менее чем за 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".]
Мы пытаемся расследовать это дальше, но пока безуспешно.
Что может быть причиной этого ?
Сердечно.