2016-04-20 4 views
2

Я запускаю PHP-код через CLI, установив cron-job. Сценарий читает около 10000 записей из базы данных и запускает 10000 новых скриптов (командой exec), не дожидаясь выполнения предыдущего скрипта. Я использую это, потому что хочу, чтобы все эти задачи выполнялись быстро. (каждый занимает около 10 секунд).
Когда количество выполняемых задач становится большим, использование ЦП становится 100% и не может работать с сервером (CentOS). Как я могу справиться с этим?Ограничение использования процессора на нескольких скриптах PHP, выполняемых asyncronously

+0

Вы должны увеличить размер оперативной памяти – Monty

+0

1) Не запускайте 10000 новых сценариев, это не умно на всех, вы не имеете 10000 Процессорные ядра. 2) Определите, почему ваши задачи медленны - увеличение количества сценариев не ускоряет их работу. Если вы пишете в базу данных, нерест 10k-скриптов не заставит ее работать быстрее. Вы делаете это неправильно. – Mjh

+0

@Mjh Спасибо. Каждый скрипт выполняет команду curl на внешний url и ждет ответа, а затем записывает их в базу данных. Мне нужен ответ каждого запроса. Я просто пытаюсь проверить [gearman] (http://gearman.org/). У меня есть будущее решение использовать nodejs для обработки этого по очереди. –

ответ

0

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

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

Также проверьте семафоры, они могут быть полезны для этого производителя/потребителя модели

+0

Спасибо @edhurtig. Я попытался ограничить число асинхронных вызовов. Но проблема в том, что если я запускаю сценарий 10000, то использование процессора становится 100% в течение примерно 10 минут (например), и если я запускаю 25 скриптов при одном использовании ЦП, он получает 100% в течение примерно 10 секунд. И проблема все еще существует. –

+0

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

+0

Я также согласен с @mjh, если все эти сценарии идут, это завиток, тогда я бы рекомендовал использовать Guzzle или некоторые другая технология HTTP-запроса синхронизации. Вы по-прежнему можете получить высокую нагрузку на процессор, если тогда мой комментарий о близости процессора и приоритете процесса должен помочь – edhurtig

 Смежные вопросы

  • Нет связанных вопросов^_^