Плавная задержка асинхронного Python

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

например, в службу gRPC было отправлено 1000 запросов, все они имеют одинаковую логику для выполнения, один и тот же экземпляр базы данных, один и тот же запрос к базе данных, одно и то же время для получения результатов из базы данных и т. д., все то же самое. Я вижу, что напр. Задержка 10-го запроса составляет 10 секунд, а задержка 13-го запроса — 5 секунд. Я также вижу в журналах, что запросы к БД имеют почти одинаковое время выполнения.

Какие-либо предложения? может я что-то не так понимаю

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
418
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

  • Какой тип нагрузки у вас есть? Это связано с вводом-выводом или процессором?

  • Ваш код блокирует цикл событий в какой-то момент? Путь для каждого запроса полностью асинхронный? В документе довольно ясно сказано, что блокировка цикла событий обходится дорого:

Блокирующий (привязанный к ЦП) код не должен вызываться напрямую. Например, если функция выполняет вычисления с интенсивным использованием ЦП в течение 1 секунды, все параллельные асинхронные задачи и операции ввода-вывода будут задержаны на 1 секунду.

Это правильный ответ! Извините за поздний ответ, я решил свою проблему через неделю после того, как задал этот вопрос, основная проблема была в коде блокировки, привязанном к ЦП, теперь я использую asgiref.sync_to_async для запуска всего кода, привязанного к ЦП, в ThreadPoolExecutor, я ускорил свой код 60%+

Nikita Davydov 11.01.2021 00:44

Другие вопросы по теме

Как я могу дождаться, когда таблица пуста/обработана очередь сообщений?
С# Асинхронная рекурсивная функция не работает должным образом?
Как добавить тайм-аут к этой асинхронной функции
В iOS 13 и ниже, как WKWebView может вызывать асинхронную функцию Javascript (то есть ту, которая возвращает обещание)?
С#, каков риск вызова асинхронного метода и никогда не ожидание возвращенной задачи или сохранение ссылок на указанную задачу
Почему моя маленькая программа продолжает использовать все больше и больше оперативной памяти и большую часть процессора?
Django/Ajax: как асинхронно фильтровать набор запросов поля формы?
Время выполнения измерения узла — возвращаемое значение из асинхронного режима, переданного в качестве параметра другой функции
Асинхронный JavaScript и ввод/вывод
Угловой асинхронный канал не работает для обновления источника изображения