#python-3.x #google-cloud-platform #google-cloud-run #fastapi #s2
#python-3.x #google-облачная платформа #google-облачный запуск #fastapi #s2
Вопрос:
Я пытаюсь использовать облачный запуск для запуска микросервиса, подключенного к Firestore. Микросервис создает объекты на основе s2geometry для создания нескольких географических зон с определенными атрибутами и, таким образом, помогает локализующим пользователям отправлять им информацию в соответствии с зоной, в которой я их нахожу.
Я использовал Python 3.7 и FastAPI для создания микросервиса и маршрутов для связи с ним.
Микросервис работает бесперебойно на моем локальном компьютере и на вычислительных машинах, поскольку для большинства моих маршрутов требуется менее 150 мс, чтобы ответить, когда я их тестирую. Однако у меня возникает проблема с задержкой при развертывании с помощью Cloud Run. Время от времени микросервису требуется очень много времени для ответа (до 15 минут), и я не могу точно указать, что именно вызывает это.
Вот снимок экрана, на котором мы можем видеть количество запросов и задержку запроса :
Количество запросов и задержка запроса
Реальных корреляций между задержкой запросов и количеством запросов нет или, по крайней мере, нет тривиальных. Я также посмотрел на использование памяти службой, и использование памяти составляет не более 30%. Однако загрузка процессора несколько раз достигала 100%, но не обязательно, когда запросы выполняются медленно.
Наконец, когда я изучил список трассировки и сравнил запросы с высокой задержкой, я заметил следующее различие
Отслеживание медленного запроса
Трассировка быстрого запроса
Быстрые запросы, похоже, называют себя, тогда как медленные запросы этого не делают, и я не знаю почему.
На данный момент у нас не так много пользователей, поэтому я подумал, что это может быть проблема с холодным запуском, но медленные запросы не обязательно являются первыми.
Теперь, честно говоря, я не знаю, что здесь происходит и что делает Cloud Run (или что я сделал неправильно), и мне также довольно сложно найти подробное объяснение того, как на самом деле работает Cloud Run, поэтому, если у вас есть (кроме Google) Я бы с удовольствием погрузился в это.
Большое вам спасибо за помощь
Комментарии:
1. Вы рассчитали, сколько времени требуется s2geometry для создания геометрий? Также, сколько места он использует. Поскольку это общедоступный сервер, вполне вероятно, что вы запрашиваете больше ресурсов, чем у вас есть. Если вы используете контейнеры, проверьте «физические» пределы таких.
2. Привет, @Isabi, изображение docker само по себе весит 2,19 ГБ. Мой шаг инициализации занимает около 2 минут при общем размере 226210319 байт, что составляет 226 МБ (гуппи-вывод hpy.heap). Честно говоря, я не думал об этом, поскольку не думаю, что мой микросервис настолько тяжелый, но я рассмотрю это. Спасибо
3. Обратите внимание: вес образа docker может быть ДИСКОВЫМ ПРОСТРАНСТВОМ, которое он использует, а не необходимой оперативной памятью. Попробуйте проверить оба, но обычно дисковое пространство не является проблемой, поскольку оно немедленно выдает ошибку.
4. Спасибо, что напомнил мне об этом. Я проверил через статистику docker, и для этого требуется всего 271 МБ оперативной памяти. Я попробую отслеживать статистику контейнера при развертывании в облаке.
5. @Isabi Я призываю вас опубликовать свой комментарий в качестве ответа на благо сообщества.
Ответ №1:
После нескольких тестов кажется, что это была проблема с холодным запуском. Контейнеры для запуска в облаке останавливаются через определенный период, если они не используются, и, поскольку у нас не было большого трафика, контейнер приходилось перезагружать каждый раз, когда пользователь хотел получить доступ к приложению.
Решение :
Я создал облачную функцию, которая отправляет запрос в контейнер при запуске, а затем создал задание облачного планировщика, которое запускает функцию каждую минуту.
Примечание :
Если в вашу службу направляются разные ревизии, вам необходимо создать задание планировщика облачных вычислений для каждой ревизии. Для этого вам необходимо создать URL-адрес редакции (тег) для каждой из маршрутизируемых версий (в настоящее время бета-версия).
Редактировать :
Теперь, как упоминал @Jofre, вы можете выбрать, чтобы экземпляр вашей службы всегда был запущен, установив «Минимальное количество экземпляров» равным 1. Если вы используете консоль, GCP даже сообщает вам «Установить значение 1, чтобы уменьшить количество холодных запусков».
Комментарии:
1. Вы можете использовать
gcloud beta update <SERVICE> --min-instances 1
, чтобы сохранить теплый экземпляр и избежать холодного запуска. Этот параметр задокументирован здесь . Это позволит избежать необходимости периодического вызова службы функцией.2. Теперь есть даже некоторая реальная документация, объясняющая, как
min-instance
помогает при холодных запусках: cloud.google.com/run/docs/configuring/min-instances3. @Jofre Да, я заметил это не так давно. Теперь все зависит от оптимизации затрат, учитывая, что наличие контейнера всегда имеет стоимость. В любом случае , большое спасибо !