Google AppEngine отправляет все запросы одному экземпляру - PullRequest
0 голосов
/ 05 февраля 2012

В последнее время я видел, что GAE требовалось намного больше времени для обработки запросов, чем всего неделю назад.Ничего не изменилось в моем коде, но GAE теперь требует 4000-12000 мс для ответа на запросы.Хуже всего то, что у меня есть много доступных экземпляров с 0 запросами.
Кто-нибудь еще видел, чтобы это произошло?Что я могу сделать, чтобы это исправить? Я зашел так далеко, что раскрутил 15 лишних экземпляров (и заплатил через них за нос), но, похоже, ничто не позволяет надежно отправлять запросы другим бездействующим экземплярам.Мой счет вырос с 70-90 центов в день до 5-8 долларов в день без каких-либо изменений кода или увеличения трафика.Фактически, я теряю трафик из-за огромных задержек.

    QPS*    Latency*    Requests    Errors  Age Memory  Availability
    0.000   0.0 ms  1378    0   10:10:09    57.9 MBytes Dynamic
    0.000   0.0 ms  1681    0   15:39:57    57.2 MBytes Dynamic
    0.017   9687.0 ms   886 0   10:19:10    56.7 MBytes Dynamic

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

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

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

0 голосов
/ 06 февраля 2012

У нас похожая проблема в нашем приложении.В нашем случае у нас сложилось впечатление, что планировщик GAE плохо справился с балансировкой запросов к существующим экземплярам.

В некоторых случаях планировщик решил ускорить новые экземпляры вместо повторного использования уже существующих.Поскольку вращение нового экземпляра заняло от 5 до> 45 секунд, я подозреваю, что это могло произойти с вами.

Попробуйте изучить следующее и посмотреть, поможет ли оно вам:

  1. Убедитесь, что в вашем приложении включена поддержка потоковой обработки , чтобы вы могли обрабатывать параллельные запросы.Вы можете настроить это в своем app.yaml , если вы используете Python, или в своем appengine-web.xml , если вы используете Java.Конечно, вам также необходимо убедиться, что код в вашем приложении является поточно-ориентированным.
  2. Если в настройках приложения установлено автоматическое значение, изменить минимальную задержку ожидания на неавтоматическую.настройка. Я бы посоветовал около 10 секунд, но позже вы можете поэкспериментировать, какая настройка подойдет вам больше всего.Это вынуждает планировщика ждать определенное время, чтобы увидеть, доступен ли какой-либо экземпляр за это время, прежде чем раскрутить новый экземпляр.

Теперь, чтобы ответить на ваш первоначальный вопрос относительно sending all requests to same instance, насколько это возможно.как я знаю, нет способа обратиться к конкретному внешнему экземпляру, чтобы направить запросы к этому конкретному экземпляру.

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

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

...