2016-01-22 4 views
4

У нас есть задание cron, которое работает каждый час на backend-модуле и создает задачи. Задача cron запускает запросы в базе данных Cloud SQL, а задачи выполняют HTTP-вызовы на другие серверы, а также обновляют базу данных. Обычно они работают отлично, даже когда тысячи заданий создаются, но иногда он «застревает», и в журналах ничего не может пролить свет на ситуацию. Например, вчера мы отслеживали задание cron, когда оно создало несколько десятков задач, а затем оно остановилось, а также 8 задач, которые также застряли в очереди. Когда было очевидно, что ничего не происходит, мы запускаем процесс еще несколько раз и каждый раз успешно завершаем.Почему процессы, запущенные в Google App Engine, зависают?

После того, как первоначальная задача была убита с помощью DeadlineExceededException, а затем 8 других задач, которые, очевидно, работали в одном экземпляре, были убиты следующим сообщением: Проблема возникла с процессом, который обрабатывал этот запрос , заставляя его выйти. Вероятно, это приведет к тому, что новый процесс будет использоваться для следующего запроса вашего приложения. Если вы часто видите это сообщение, вы можете бросать исключения во время инициализации своего приложения. (Код ошибки 104)

До тех пор, пока процессы не были убиты, мы не увидели их записи в журналах, и теперь, когда мы видим их, нет записей журнала до времени DeadlineExceededException, поэтому мы понятия не имеем, что что они застряли. Мы подозревали, что есть некоторая блокировка в базе данных, но мы видим в следующей ссылке, что есть 10 минут предел запросов, так что может вызвать процесс на провал гораздо раньше, чем за один день: https://cloud.google.com/appengine/docs/java/cloud-sql/#Java_Size_and_access_limits

Нашего модуля класс и масштабирование конфигурации:

<instance-class>B4</instance-class> 
<basic-scaling> 
    <max-instances>11</max-instances> 
    <idle-timeout>10m</idle-timeout> 
</basic-scaling> 

конфигурация очереди:

<rate>5/s</rate> 
<max-concurrent-requests>100</max-concurrent-requests> 
<mode>push</mode> 
<retry-parameters> 
    <task-retry-limit>5</task-retry-limit> 
    <min-backoff-seconds>10</min-backoff-seconds> 
    <max-backoff-seconds>200</max-backoff-seconds> 
</retry-parameters> 

Я загрузил некоторые изображения данных трассировки для хрон: http://imgur.com/a/H5wGG. Сюда входит сводка трассировки и начало/окончание временной шкалы. Нет данных трассировки для 8 завершенных задач.

Что может быть причиной этого и как мы можем его исследовать дальше?

+0

Не могли бы вы попробовать включить [Cloud Trace] (https://cloud.google.com/trace/), а затем включить трассировку одного из ваших медленных запросов? – David

+0

@David Я редактировал свой вопрос, чтобы включить данные трассировки для работы cron: http://imgur.com/a/H5wGG. он включает в себя краткое описание трассы и начало/окончание временной шкалы. Нет данных трассировки для 8 завершенных задач. – Avital

+0

Стандартная практика заключается в том, чтобы изолировать проблему в первую очередь. Можете ли вы просто сделать свой запрос в базе данных и посмотреть, сколько времени потребуется на выполнение запроса?Возможно, это не так, если вы используете Google App Engine, поэтому вам может потребоваться выполнить запрос с вашего локального компьютера после авторизации IP-адреса вашего локального компьютера на экземпляр Cloud SQL и т. Д. – Herman

ответ

1

в конце концов, нам удалось решить эту проблему с помощью следующих шагов:

  1. Мы разделили модуль на два - один модуль для запуска задания хрон и один модуль для обработки сгенерированных задач. Это позволило нам увидеть , что проблема заключалась в обработке заданий, поскольку это был единственный модуль , который постоянно застревал.
  2. Мы ограничили количество одновременных задач до 2, что, как представляется, является максимальным количеством задач, которые могут обрабатываться одновременно, без застревания системы.
+0

Вы видели замедленность при работе с задачами, потому что вы устанавливаете параллельные задачи на 2. Любые другие проблемы вы сталкиваетесь с этим подходом? – Rams

+0

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