В каких случаях многократный вызов одного скрипта с разными параметрами ускорит выполнение задачи, а в каких — нет?



@eugene159

Есть скрипт на PHP CLI, который парсит Excel и добавляет товары в CMS.

Предположим, что на добавление одного товара уходит примерно секунд 30. Всего товаров — 3000.

Я могу одновременно запустить скрипт 3 раза:
1 запуск: 1-1000 товаров
2 запуск 1001-2000 товаров
3 запуск 2001-3000 товаров

А могу запустить скрипт всего 1 раз: 1-3000 товаров.

Я слышал, что web однопоточный. Да и в целом ведь ресурсы процессора делятся на все запуски скрипта.
В каких случаях многократный запуск скрипта ускорит выполнение задачи?
• Если на VPS больше одного ядра?
• Всегда?
• Еще при каких-либо обстоятельствах?

Как это узнать (кроме тестирования — запуска с засеканием времени — я хочу узнать теорию)?
Как рассчитать оптимальное количество запусков скрипта для определенной конфигурации сервера? Кол-во ядер * 2 (ведь в одном ядре 2 потока)?


Решения вопроса 0


Ответы на вопрос 3



@ipatiev Куратор тега PHP

Если у вас задача потребляет CPU по максимуму, то да — распараллеливать её на большее количество процессов, чем имеется в наличии потоков — бессмысленно.
Но обычно задача по добавлению записи в БД потребляет не слишком много поцессора. А если речь про «парсинг», где процессор 99% времени ждет пакет из сети, распараллеливать можно хоть на десятки процессов.
Конкретное количество зависит от потребления процессора конкретной задачей.

Количество потоков не всегда равно количеству ядер, умноженному на два. Надо смотреть на конкретный процессор. Тем более на VPS, где процессор тоже виртуальный.

Если говорить про конкретный пример, то в идеале конечно надо написать нормальный код, который запишет в БД несчастные 3 тыщи товаров меньше чем за секунду. А заниматься параллелизмом уже когда счет пойдет на сотни тысяч. Тем более что цифра скорее всего взята с потолка. Я много повидал говнокода на своем веку, но такой, чтобы добавление одного товара занимало 30 секунд я даже вообразить себе не могу.

Единственная загадка — при чем тут «web», если речь идет про CLI. И, если уж говорить про веб, то с какой радости он «однопоточный».



@maksam07

А если попробовать разобрать эту задачу с другой стороны:

SQL-запрос на добавление данных имеет вид: INSERT INTO table_name
VALUES (value1, value2, value3, …)
что подразумевает добавление нескольких данных за один запрос. Возможно вы сможете сформировать все свои 3к товаров в один запрос, что, собственно, позволит вам сделать всего 1 запрос к БД, вместо 3-х тысяч и ожидать выполнения скрипта вообще не нужно будет.



@aleksejjjjj

Общего ответа нет, зависит от задачи.

Условно, если ваш скрипт грузит БД, и она забирает 100% времени процессора/диска и прочее — запуск второй копии может даже замедлить процесс.

Если же сам скрипт выполняет сложные вычисления, то запуск инстансов по количеству потоков процессора может ускорить процесс.

И даже это лишь предположения, пальцем в небо. По факту, на реальном железе вы можете увидеть ровно противоположные результаты.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *