
Я довольно новичок в сочетании apache и django и, честно говоря, довольно наивен в отношении того, как обрабатывается многопоточность. В частности, я работаю на сервере Windows, поэтому я знаю, что MPM основан только на потоках.
У меня есть приложение, которое обслуживает страницы веб-сайта, и другое приложение, которое выполняет ресурсоемкий фоновый процесс, который происходит время от времени и занимает около 30 секунд. Я беспокоюсь, что могу столкнуться с проблемами производительности, и у меня есть несколько вопросов, надеюсь, они помогут и другим...
- Как apache распределяет параллельные запросы между потоками? и между процессорами? Какая логика управляет этим? Каждый запрос порождает отдельный поток?
- Могу ли я вручную указать определенное приложение для запуска на отдельном ЦП? Например, если у меня есть машина с 4 ЦП, могу ли я установить 1 ЦП для запросов веб-сайта и 3 других для запуска фонового процесса по требованию?
- Как несколько потоков читают/пишут в одну и ту же базу данных? Я не ожидаю коллизий, поскольку запись будет выполняться для каждого пользователя, но я не знаю, как это на самом деле обрабатывается.
- Что произойдет, если у меня будет больше одной такой машины, например, работающей на EC2 и имеющей больше одного экземпляра? Как распределяются запросы?
Спасибо
решение1
Для общего чтения см.:
- http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading
- http://blog.dscpl.com.au/2009/03/python-interpreter-is-not-created-for.html
Как Apache распределяет одновременные запросы между потоками?
Для многопоточной конфигурации есть пул предварительно созданных потоков. Когда поступает новый запрос, он передается одному из доступных потоков в пуле для обработки. После завершения поток возвращается в пул.
Как Apache распределяет одновременные запросы между процессорами?
Это не так, где поток выполняется в любой конкретный момент времени, определяется операционной системой. Потоки не привязаны к определенному процессору Apache, поэтому выполнение может перемещаться.
Каждый запрос порождает отдельный поток?
Для веб-запросов, обрабатываемых Apache, ответ — нет.
Могу ли я вручную указать, что определенное приложение должно работать на отдельном процессоре?
Есть способы, которыми вы можете установить привязку процессора, чтобы привязать процессы к процессорам, но как вы это сделаете, зависит от системы. Насколько мне известно, сам Apache не предоставляет никакого механизма конфигурации, чтобы сделать это для себя.
Как несколько потоков читают/пишут в одну и ту же базу данных?
Осторожно. Обычно процесс сервера базы данных заботится обо всем этом, так что вам не о чем беспокоиться. В клиенте вам нужно убедиться, что каждый поток использует свое собственное подключение к базе данных, создавая одно для каждого запроса, или у вас есть пул подключений к базе данных, и потоки берут подключение из пула, когда требуется, и возвращают его, когда все сделано.
Обратите внимание, что это предполагает базу данных, доступ к которой осуществляется через серверный процесс. Если вы используете базу данных на основе файловой системы, то клиентская библиотека базы данных должна гарантировать безопасность многопоточного доступа.
Что произойдет, если у меня будет больше одной такой машины, например, работающей на EC2 и имеющей больше одного экземпляра? Как распределяются запросы?
Вам понадобится какой-то фронтенд-балансировщик нагрузки для распределения запросов. Это может быть правильный балансировщик нагрузки, или вы можете использовать фронтенд nginx в качестве прокси.