Приложение Django на Google App Engine замедляется после 15 запросов
Я развернул приложение Django на Google App Engine Standard с машиной F4. API выполняет некоторое машинное обучение, и обработка занимает около 4 с в локальном режиме (между 3,5 и 4 с). Для моего случая использования было бы нормально иметь задержки в 4-5 с в развернутом приложении. Однако, когда я тестирую развернутое приложение, выполняя один и тот же запрос несколько раз, я вижу, что первые запросы занимают 3-4 секунды, но после 10-15 итераций они занимают около 8 с.
Вот код, который я использовал для тестирования своего приложения:
session = requests.Session()
all_times = []
for i in range(50):
try:
t0 = time.time()
resp = session.post(url_api, headers=headers, json=data)
t1 = time.time()
print(t1 - t0)
all_times.append(t1 - t0)
except Exception as e:
print("Err", e)
Результаты продолжительности запросов следующие:
Интересно, почему существует такой разрыв после 15 запросов и почему некоторые баллы намного выше средних 7-8 (например, 10).
Я получаю ту же картину, глядя на задержку в Google Cloud Console:
Что я пробовал
Я пытался изменить параметры автомасштабирования, думая, что это может быть связано с созданием экземпляров. Но я получил ту же картину, когда я ограничил количество экземпляров до 1 с помощью этого в app.yaml:
automatic_scaling:
max_instances: 1
Я также пытался:
- Используйте сессию в
requests, чтобы избежать создания новой сессии на каждой итерации. - Делайте мои запросы с помощью curl, что приводит к тем же результатам.
Моя цель - минимизировать изменчивость и сохранить длительность запросов менее 5 с.
При сравнении производительности Google Cloud Platform с локальной следует учитывать, что развертывание на GCP требует больше времени на импорт всех необходимых библиотек и настройку фреймворка Django.
В общем случае не имеет особого смысла сравнивать производительность на локальной машине с производительностью на GCE, так как на локальных машинах, скорее всего, установлены разные ОС. Но да, я согласен, что разница в задержке между запросами, обслуживаемыми GAE после 10-15 запросов, неприемлема и довольно странная.
Проверьте следующее :
- Если экземпляр превысил максимальный объем памяти для своего настроенного instance_class, который в вашем случае является F4, что может привести к отключению вашего экземпляра и App Engine создаст новый на его месте, так как это может быть вызвано отсутствием доступных экземпляров, так как это примерно время, необходимое для развертывания экземпляра, и вы установили max_instances на 1.
- Если вы задали какое-либо значение target_cpu_utilization. Он определяет порог использования процессора порог использования, при котором будут запускаться новые экземпляры для обработки трафика, когда старые экземпляры достигнут целевого использования процессора.
- Интервал, с которым вы посылаете запросы, имеет значение, как вы упомянули в своем комментарии, "вы делаете запросы один за другим". Когда объем запросов уменьшается, App Engine уменьшает количество экземпляров. Когда приложение вообще не используется, App Engine отключает связанные с ним динамические экземпляры, но с готовностью перезагружает их. как только они потребуются. Перезагрузка экземпляров может привести к дополнительным задержкам для пользователей. Чтобы убедиться, что вы не перезагружаете экземпляров, укажите минимальное количество неработающих экземпляров. Установите соответствующее количество простаивающих экземпляров для вашего приложения на основе объема запросов, позволяет вашему приложению обслуживать каждый запрос с небольшой задержкой, если только вы не испытываете аномально высокий объем запросов. объем.
Также, согласно документации, если класс экземпляра установлен на F2 или выше, вы можете оптимизировать свои экземпляры, установив max_concurrent_requests на значение выше, чем значение по умолчанию 10. Чтобы определить оптимальное значение, постепенно увеличивайте его и следите за производительностью вашего приложения.
Просмотрите PageSpeed Insights, который анализирует содержимое веб-страницы, а затем генерирует предложения, чтобы сделать эту страницу быстрее, и это может быть полезно. Я бы также предложил вам обратиться в службу поддержки Google для взаимодействия 1:1, так как этот случай/проблема зависит от конкретной среды.

