Назад | Перейти на главную страницу

Запускать несколько копий скрипта - используя ядра или просто замедляя работу сервера?

У меня есть небольшой компактный PHP-скрипт, который отслеживает очередь сообщений beanstalk на сервере CentOS 5. Когда он получает сообщение, он начинает выполнять определенное действие, а после его завершения возвращается в очередь и ожидает дополнительной работы.

Все работает отлично и пока никаких проблем. Мой друг сказал мне несколько дней назад во время случайного разговора, что это будет идеальный сценарий, который может использовать несколько ядер на сервере. Это позвонило мне - хорошая идея! Если мне нужно запустить два процесса, я думал, что мне понадобятся два сервера, но, возможно, нет.

Итак, вопрос в том, что если бы я запустил две, три, четыре ... x копии скрипта на ОДНОМ сервере, это замедлило бы выполнение других скриптов или они не пострадали бы? Учитывая, что сценарий просто прослушивает, затем выполняет действия и возвращается, чтобы снова прослушать, возможны ли какие-либо конфликты? Я понимаю, что последнее может быть скорее вопросом программирования, чем сервером!

Я так понимаю: есть очередь сообщений. Скрипт PHP использует сообщения из этой очереди. Предпринимаемые действия зависят от доступа к диску, сетевой активности и задач, интенсивно использующих ЦП.

(что coredump сказал об управлении использованием нескольких процессов вообще.)

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

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

Если это работает на apache, используя mpm_prefork (потому что это php), тогда ядро ​​Linux будет балансировать дочерние процессы между несколькими ядрами.

Если вы запускаете их в командной строке, то они не обязательно работают на разных ядрах, и для их запуска на разных ядрах требуется использовать taskset или cpuset чтобы определить привязку процессора каждого экземпляра к другому ядру.

Теоретически вы могли бы запустить количество сценариев, равное или меньшее, чем количество ядер на вашем сервере, но на практике вам все еще нужен ЦП для запуска ядра и другого программного обеспечения / демонов, поэтому YMMV. Все это зависит от типа приложения, подключений, зависимости от внешнего программного обеспечения и сети и так далее, поэтому вам действительно нужно протестировать свою собственную инфраструктуру, чтобы быть уверенным.