загрузка процессора и приложение django, которое выполняет запросы с длительным временем отклика на внешний API - PullRequest
1 голос
/ 20 января 2012

Я разрабатываю веб-приложение на python, для которого каждый пользовательский запрос выполняет вызов API для внешней службы и для получения ответа требуется около 20 секунд .В результате в случае нескольких одновременных запросов загрузка ЦП сводится с ума (> 95%) из-за нескольких незанятых процессов.

Сервер состоит из двухъядерного процессора Atom 330 с тактовой частотой 1,6 ГГц и 2 ГБ ОЗУ.

Веб-приложение разработано на Python, который обслуживается через Apache с mod_wsgi

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

Ответы [ 3 ]

1 голос
/ 22 января 2012

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

Вы можете заглянуть в python libs kombu и celery для обработки сообщений и задач.

1 голос
/ 23 января 2012

Скорее всего, вы используете prefork MPM со встроенным режимом Apache и mod_wsgi. Это плохая комбинация по умолчанию, потому что Apache настроен на PHP, а не на толстые веб-приложения Python. Читайте:

http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html

, который объясняет именно эту проблему.

Используйте как минимум режим демона mod_wsgi и предпочтительно также измените его на рабочий MPM для Apache.

1 голос
/ 20 января 2012

Это действительно не имеет ничего общего с блокировкой; это так, но это не так. 20-секундный запрос блокирует один поток, поэтому для следующего запроса используется другой. В то время как с быстрыми запросами потоки в основном циклические.

Тем не менее, это действительно не должно пикировать производительность вашего процессора. Веб-серверы имеют верхний предел «рабочих», которые порождаются, и когда они все связаны, они все связаны. Он не будет превышать лимит, поэтому, если вы не установили его или значение по умолчанию не превышает установленного значения, которое у вас есть, оно не должно нагружать ваш ЦП так высоко.

Несмотря ни на что, все это просто информационное и не решает вашу проблему. Однако с таким длительным запросом вы должны как можно быстрее разгрузить его со своего веб-сервера. Веб-сервер должен просто передать запрос другому процессу, который может асинхронно обработать его, а затем использовать опрос, чтобы уведомить клиента о готовности ответа. Node.js часто используется в подобных сценариях, но у меня действительно нет достаточного опыта, чтобы дать вам какое-либо реальное руководство помимо этого.

...