Как устранить высокую задержку в обработчике приложения, вызванную «Этот запрос вызвал запуск нового процесса для вашего приложения ...»? - PullRequest
0 голосов
/ 22 октября 2019

Приложение, работающее со стандартным ядром приложения среды, Python 3.7 и облачным SQL (Mysql)

При проверке журналов существуют некоторые с очень высокими задержками (более 4 секунд), когда ожидаемые значения составляют 800 мс. Все эти журналы сопровождаются этим сообщением:

"Этот запрос вызвал запуск нового процесса для вашего приложения и, таким образом, вызвал загрузку кода вашего приложения в первый раз. Таким образом, этот запрос можетзанять больше времени и использовать больше ресурсов процессора, чем типичный запрос для вашего приложения. "

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

Мой вопрос: как уменьшить эти задержки?

Конфигурация ядра приложения:

runtime: python37
env: standard
instance_class: F1
handlers:
  - url: /static/(.*)
    static_files: static/\1
    require_matching_file: false
    upload: static/.*
  - url: /.*
    script: auto
    secure: always
  - url: .*
    script: auto
automatic_scaling:
  min_idle_instances: automatic
  max_idle_instances: automatic
  min_pending_latency: automatic
  max_pending_latency: automatic
network: {}

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

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

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

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

В среде выполнения Python 3.7 вы можете добавить элемент «разминки» в директиву inbound_services в app.yaml:

inbound_services:
- warmup

Это отправит запрос на /_ah/warmup где, если вы хотите, вы можете выполнить любую другую инициализацию, необходимую экземпляру (например, запуск пула соединений с БД).

1 голос
/ 23 октября 2019

Существует больше стратегий, которые могут помочь вам уменьшить задержки в вашем приложении.

Вы можете изменить параметры автоматического масштабирования , чтобы использовать то, что лучше подходит для вашего приложения.

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

Использование общедоступных заголовков Cache-Control таким образом позволит прокси-серверам и браузеру ваших клиентов кэшировать ответы в течение указанного периода времени.

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

Вы также можете включить одновременные запросы и написать свой код как асинхронно , как можете.

...