Что может привести к тому, что экземпляр Cloud Run не будет использоваться повторно, несмотря на постоянную загрузку? - PullRequest
3 голосов
/ 04 февраля 2020

Контекст:

Мое приложение Spring-Boot запускается, как и ожидалось, в Cloud Run, когда я развертываю его с max-instance, установленным в 1: оно получает постоянный поток сообщений pubsub через pu sh и выполняет от 0 до 5 операций записи в связанный экземпляр Cloud SQL в зависимости от полезной нагрузки сообщения. Обычно он обрабатывает от 20 до 40 сообщений в секунду. Время задержки / время отклика варьируется от 50 мс до 60 с c, вероятно, из-за некоторой конкуренции за ресурсы.

Чтобы увеличить пропускную способность / уменьшить конкуренцию за ресурсы, я хочу поэкспериментировать с размером пула соединений для приложения -instance, а также параметры параллелизма и max-instances для моего приложения для запуска в облаке.

Я понимаю, что из-за Spring-Boot мое приложение имеет относительно высокое время холодного запуска около 30-40 секунд. , Это приемлемо для использования этой службы.

Проблема:

У меня возникают проблемы при развертывании приложения с весенней загрузкой в ​​облачной среде с установленным параметром max-instances. до значения больше 1:

  • Экземпляры запускаются, успешно обрабатывают один запрос, а затем не генерируют больше журналов.
  • Это происходит несколько раз за минуту, заставляя меня поверить, что экземпляры запускаются (холодный старт), обрабатывают один запрос, d ie, а затем начинают снова Они не используются повторно, как описано в документации, и, как это происходит, когда я устанавливаю max-instance на 1. Официальные документы по параллелизму
  • Вместо этого я ожидаю запуска 3 экземпляров контейнера. , который затем каждый запрашивает в соответствии с настройкой max-параллелизма.

Время оплачиваемого контейнера в макс-экземплярах = 3: Billable container time graph

  • Как показано на графике, количество экземпляров сильно колеблется после развертывания новой ревизии с max-instances = 3.
  • Графики использования процессора и памяти также выглядят следующим образом.
  • Нет журналов ошибок. Как и раньше при max-instaces = 1, появляются предупреждения, указывающие на то, что для обработки запросов недостаточно экземпляров (HTTP 429).
  • Предел подключения облака SQL экземпляр не превышен
  • Запросы обрабатываются со скоростью менее 10 / с

Наконец, эта команда используется для развертывания:

 gcloud beta run deploy my-service --project=[...] --image=[...] --add-cloudsql-instances=[...] --region=[...] --platform=managed --memory=1Gi --max-instances=3 --concurrency=3 --no-allow-unauthenticated

Что может вызвать такое поведение?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

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

Вы упомянули с max-instance, установленным в 1, он работал нормально, но позже вы упомянули, что на самом деле он производил 429 с его установленным также 1. Наблюдение за поведением 429-х, а также всплесками экземпляров может указывать на то, что объем трафика c не обрабатывается плавно.

Стоит также отметить, из-за времени холодного запуска, о котором вы упоминаете, когда экземпляры при обработке первого (ых) запроса (ов) по заданному плану число параллельных запросов фактически устанавливается равным 1. После того, как все полностью готово, применяется только выбранный вами параметр параллелизма.

Была ли какая-то конкретная c причина, по которой вы выбрали 3 и 3 для параметров Max Instance и параллелизма? Также, как был установлен параллелизм, когда у вас был установлен максимальный экземпляр 1? Возможно, вы могли бы попытаться еще больше улучшить параллелизм (максимум 80) и / или Макс. Экземпляры (верхний предел до 1000) и посмотреть, удаляет ли это 429-е.

0 голосов
/ 05 февраля 2020

В какой-то месяц go в частной Альфе я проводил тесты и наблюдал то же поведение. После обсуждения с командой Google я понял, что экземпляры переподготовлены "в случае": экземпляры аварийно завершаются, экземпляры выгружаются, трафик c внезапно увеличивается, ...

Компромисс это то, что у вас будет более холодный старт, чем ваши максимальные значения экземпляров. Хуже , вы будете платить за это за предоставленный холодный старт -> это не проблема, потому что Cloud Run имеет огромный бесплатный уровень, который покрывает такие глюки.

Углубление в журналах (вы можете сделать это, создав в BigQuery приемник журналов Cloud Run и затем запросив их), даже если количество экземпляров больше, чем у максимального, только ваш максимум экземпляры активны в одно и то же время. Я не уверен, что будет ясно. С вашими параметрами это означает, что если у вас есть 5 экземпляров одновременно, только 3 обслуживают трафик c в один и тот же момент времени

Эта часть не задокументирована, потому что она постоянно развивается чтобы найти наилучший баланс между избыточным выделением ресурсов и отсутствием ресурсов (и 429 ошибок).

@ Steren @AhmetB, можете ли вы подтвердить или исправить меня?

...