Экземпляры AppEngine Flexible постоянно возрождаются

Я развертываю приложение Go с помощью гибкого AppEngine. Ниже мой app.yaml. Иногда после развертывания он стабилизируется на 1 экземпляре (это приложение с очень низкой нагрузкой), но в большинстве случаев он постоянно возрождается до 6 экземпляров. Мои журналы заполнены сообщениями о создании новых экземпляров. Нагрузка на это приложение почти нулевая, почему гибкий AppEngine постоянно уничтожает и перезапускает экземпляры?

Лог, показывающий постоянное возрождение:

Журнал, показывающий постоянное возрождение.

app.yaml

runtime: go
api_version: go1
env: flex

handlers:
- url: /.*
  script: _go_app

health_check:
  enable_health_check: True
  check_interval_sec: 10
  timeout_sec: 4
  unhealthy_threshold: 2
  healthy_threshold: 2

automatic_scaling:
  min_num_instances: 1
  max_num_instances: 10
  cool_down_period_sec: 120 # default value
  cpu_utilization:
    target_utilization: 0.5

person Kevin Flanagan    schedule 30.12.2016    source источник
comment
Что произойдет, если вы отправите запрос на получение по адресу '/_ah/health' любого из ваших экземпляров?   -  person Anthony Kong    schedule 11.01.2017
comment
Я получаю 200 «хорошо» от моей конечной точки проверки работоспособности.   -  person Kevin Flanagan    schedule 11.01.2017
comment
Это может быть проблема с платформой. Сначала мы должны исключить, что экземпляр действительно неработоспособен. Возрождения чаще всего вызваны неудачными или не отвечающими на запросы проверками здоровья. В соответствии с вашими настройками экземпляр должен быть бездействующим в течение 20 секунд (2 проверки работоспособности), чтобы потенциально вызвать возрождение (3, чтобы быть в безопасности). Показывают ли ваши журналы проверки работоспособности /_ah/health какие-либо сбои или ответы с промежутком более 30 секунд? Каковы сроки этой проблемы возрождения? Каково использование ЦП и памяти для экземпляров вашего приложения? Делает ли это гибкое приложение Hello World go?   -  person Nicholas    schedule 12.01.2017
comment
Журнал nginx.health_check не показывает неудачных проверок работоспособности. Это часто происходит после нового развертывания, но прекращается через несколько часов. Существует постоянное возрождение инстансов в течение нескольких часов, затем оно в конечном итоге стабилизируется на 2 инстансах. Я не тестировал приложение Hello World golang flex.   -  person Kevin Flanagan    schedule 12.01.2017
comment
Я пробовал различные настройки переменных timeout_sec, unhealthy_threshold и cool_down_period_sec, все с теми же результатами. Значительное возрождение экземпляра в течение нескольких часов, а затем окончательное заселение.   -  person Kevin Flanagan    schedule 13.01.2017


Ответы (1)


Проблема была с моей функцией проверки здоровья. Первоначально это выглядело так:

func healthCheckHandler(w http.ResponseWriter, r *http.Request) {
    return
}

Затем я обнаружил это предложение в документации о том, как управляются экземпляры:

Вы можете написать свой собственный код проверки работоспособности. Он должен отвечать на запросы /_ah/health с кодом состояния HTTP 200. Ответ должен включать тело сообщения, однако значение тела игнорируется (оно может быть пустым).

Поэтому я изменил функцию проверки работоспособности, чтобы в ответ она писала простое «ок»:

func healthCheckHandler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("ok"))
    return
}

Экземпляры теперь ведут себя в соответствии с моими настройками автомасштабирования! Респаун пропал.

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

person Kevin Flanagan    schedule 14.01.2017