У меня есть сценарий, который запускает 1000 запросов cURL, используя curl_multi_ * функции в PHP.
Какое узкое место у них отстает?
Будет ли это использование ЦП? Есть ли более эффективный способ, с точки зрения того, как это количество исходящих соединений обрабатывается сервером, для этого?
Я не могу изменить функциональность, и сами запросы – это простые вызовы удаленного API. Мне просто интересно, каков предел – мне нужно увеличить память на сервере, а также на подключения Apache или на CPU? (Или что-то еще, что я пропустил)
Ваши запросы выполняются в одном потоке выполнения. Узкое место почти наверняка является процессором, вы когда-нибудь наблюдали за запуском многократного кода? … это невероятно процессор голодный; потому что у вас нет достаточного контроля над обработкой запросов. curl_multi позволяет вам организовывать 1000 запросов одновременно, но это не делает его хорошей идеей. У вас почти нет возможности эффективно использовать curl_multi, потому что вы не можете контролировать поток выполнения достаточно точно, просто обслуживание сокетов и select () на них будет учитывать большое количество использования центрального процессора, которое вы увидите, наблюдая за запуском вашего кода командной строки.
Причины, по которым использование ЦП является высоким во время таких задач, PHP предназначен для работы в течение секунды, делать все как можно быстрее. Как правило, не имеет значения, как используется процессор, потому что он находится на таком коротком промежутке времени. Когда вы продлеваете такую задачу, проблема становится более очевидной, накладные расходы, возникающие при каждом указателе операции, становятся видимыми для программиста.
Я знаю, что вы сказали, что не можете изменить реализацию, но все же, для полного ответа. Такая задача гораздо более подходит для Threading, чем curl multi, и вы должны начать читать http://php.net/pthreads , начиная с http://php.net/Thread
Оставленные на своих устройствах на холостом процессоре даже 1000 потоков потребляли бы столько же CPU, как curl_multi, дело в том, что вы можете точно контролировать код, ответственный за загрузку каждого байта ответа и загрузку каждого байта запроса, и если использование ЦП вы можете реализовать «хороший» процесс, явно называя usleep или ограничивая использование соединения значимым образом, дополнительно ваши запросы могут обслуживаться в отдельных потоках.
Я не предполагаю, что 1000 потоков – это то, что нужно сделать, это более чем вероятно . Дело в том, что это будет проект Stackable (см. Документацию), задачей которого является создание и обслуживание запроса «хорошим», эффективным способом и пулами проектирования (см. Примеры из источников расширения github / pecl) для выполнения ваших недавно спроектированные запросы …