Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Распараллеливание задач средствами PHP 
:(
    Опции темы
Fortop
Дата 7.12.2012, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(DimaSiK @  7.12.2012,  08:46 Найти цитируемый пост)
И возникает иногда проблема, что 'менеджер' выбирает данные, которые не являются уже актуальными, то есть они были уже изменены но он еще об этом не знает, а узнает уже в следующей итерации.

Какие именно данные? Новости?  smile Или о числе потоков? 
Т.е. у тебя умерло 50 потоков, а менеджер про это не успел узнать и запустит их только на следующей итерации?
И часто такое происходит? 
И сколько длится итерация? Разве этот простой существенный?

Хотя можешь отдать эту функцию внутрь потока. Передавай ему лимит инстансов, пусть он при своем старте сам проверяет лимит и если процессов больше, то умирает.



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
DimaSiK
Дата 9.12.2012, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



Какие именно данные? Новости?  smile Или о числе потоков? 
- о числе потоков, а именно число активных потоков
Т.е. у тебя умерло 50 потоков, а менеджер про это не успел узнать и запустит их только на следующей итерации?
 - да, что-то вроде этого
И часто такое происходит?
- сейчас уже нет, нашел такую вот опцию \System_Daemon::iterate и это решило проблему.
И сколько длится итерация? Разве этот простой существенный?
- итерация длиться всегда по-разному, так как это полностью зависит от внешних API с которыми мы работаем, а они могу отдавать данные за 1 секунду, а могу и за 10.
Хотя можешь отдать эту функцию внутрь потока. Передавай ему лимит инстансов, пусть он при своем старте сам проверяет лимит и если процессов больше, то умирает.
- можно, но тогда нарушается так сказать консистентность каждой единицы в системе, то есть Worker будет отвечать не за то, за что ему положено. Worker - тупой скрипт, который 
просто фетчит данные, Мфтфпук - крутой скрипт, который следит за всем =)

P.S Как я уже сказал, проблема вроде решилась. Я еще понаблюдаю за поведением но вроде пока все хорошо отрабатывает. А вообще, что можешь сказать, в правильном ли двигаюсь 
направлении использая Sys_Daemon для распараллеливания? В будущем хочу переписать систему, чтобы можно было паралеллить на ноды(отдельные сервера).


--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
Fortop
Дата 9.12.2012, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(DimaSiK @  9.12.2012,  21:43 Найти цитируемый пост)
- итерация длиться всегда по-разному, так как это полностью зависит от внешних API с которыми мы работаем, а они могу отдавать данные за 1 секунду, а могу и за 10.

Подожди, как это?

Ты вообще не должен зависеть от того как долго он возвращает тебе ответ.
Пусть воркер пишет в очередь, посылает сообщения о том что он закончил работу и можно забрать результат.

Примерно так:

Очередь данных.
Очередь результатов.
Менеджер процессов
Процессы

Менеджер контролирует число процессов и запускает их при необходимости.
Процесс получает данные оттуда, откуда ему скажут. И по завершении кладет куда-то. После чего машет Менеджеру - "ау, я закончил".
Сам менеджер вообще не должен ждать данные откуда-либо.

Добавлено через 1 минуту
Цитата(DimaSiK @  9.12.2012,  21:43 Найти цитируемый пост)
. А вообще, что можешь сказать, в правильном ли двигаюсь 
направлении использая Sys_Daemon для распараллеливания?

Без понятия, я с ним не работал и не знаю его возможностей.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
DimaSiK
Дата 12.12.2012, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



Цитата

Менеджер контролирует число процессов и запускает их при необходимости.
Процесс получает данные оттуда, откуда ему скажут. И по завершении кладет куда-то. После чего машет Менеджеру - "ау, я закончил".
Сам менеджер вообще не должен ждать данные откуда-либо.

Все имеено так и происходит =) Видимо непонятно объяснилю


--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
Fortop
Дата 12.12.2012, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(DimaSiK @  9.12.2012,  21:43 Найти цитируемый пост)
Т.е. у тебя умерло 50 потоков, а менеджер про это не успел узнать и запустит их только на следующей итерации?
 - да, что-то вроде этого

Тогда не понял сути терзаний.

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


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
DimaSiK
Дата 15.12.2012, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



Да в приницпе терзания и проблемы уже законичлись. Рассинхронизацию исправил с помощью System_Daemon::iterate - это
аналог sleep только для задач, которые запущены в виде демонов.

Добавлено @ 21:27
Однако меня волнует текущее решение ввиде распараллеливания с помощью System_Daemon так как в системе существует
27000 запросов, которые надо делать к внешним API и распараллеливание даже на 300-400 параллельных потокв не решает полность проблемму. Проблема
опять возникнет, когда увеличиться число запросов к внешним API к примеру с в 2,3 или 4 раза то есть потребуется обрабатывать больше 100.000 запросов. Возникает
вопрос, есть ли другое решение, которое позволит адекватно решить данную задачу, я имею ввиду адекватно с точки зрения времени выполнять такое большое число запросов
к внешним API?

Это сообщение отредактировал(а) DimaSiK - 15.12.2012, 21:31


--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
Fortop
Дата 16.12.2012, 02:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цифры запросов не имеют никакого значения без указания времени, за которое они должны выполниться.
Ну будет у тебя 100к запросов в секунду, ну поставишь еще 1,2,3 сервера под обработчик....



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
DimaSiK
Дата 16.12.2012, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



Цитата(Fortop @ 16.12.2012,  02:55)
Цифры запросов не имеют никакого значения без указания времени, за которое они должны выполниться.
Ну будет у тебя 100к запросов в секунду, ну поставишь еще 1,2,3 сервера под обработчик....

Цифры должны быть адекватными:1-3 час на обработку весх запросов, а вообще чем меньше тем естественно круче. С серверами идея хорошая, я уже об этом думал,
но для этого нужно продумывать орхетектуру, которая позволила бы подключать новые ноды, когда текущие уже
не справляются с нагрузкой и менеджер должен сам организовывать корректную балансировку меджу всеми нодами.

Это сообщение отредактировал(а) DimaSiK - 16.12.2012, 11:59


--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
Fortop
Дата 16.12.2012, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(DimaSiK @  16.12.2012,  11:55 Найти цитируемый пост)
Цифры должны быть адекватными:1-3 час на обработку весх запросов

У нас с одной машины свыше 10млн запросов в сутки бывало. И около 1200 пхп задач.

так что смотри по конкретному железу.

Для балансировки смотри HAproxy 


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
DimaSiK
Дата 16.12.2012, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



Цитата(Fortop @ 16.12.2012,  14:05)
Цитата(DimaSiK @  16.12.2012,  11:55 Найти цитируемый пост)
Цифры должны быть адекватными:1-3 час на обработку весх запросов

У нас с одной машины свыше 10млн запросов в сутки бывало. И около 1200 пхп задач.

так что смотри по конкретному железу.

Для балансировки смотри HAproxy

Понял, спасибо. Скорее всего буду разрабатывать систему, которая позволит подключать новые ноды при увеличении нагрузки и произовдить
атобалансировки нагрузки.


--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
DimaSiK
Дата 16.12.2012, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



Как думаешь, сколько процессов потянет такая конфигурация: Ubuntu Server, Intel® Xeon® CPU X5650 @ 2.67GHz, 2 cores, 6gb RAM - это виртуальный сервер


--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
Fortop
Дата 17.12.2012, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Без понятия. Зависит от нагрузки создаваемой процессами.
300-400 запросов внешних страничек выдержать должен


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
DimaSiK
Дата 20.12.2012, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



Столкнулся со следующей проблеммой и ничего толковго не могу найти в интернете. Я создаю потоки обычным циклов foreach в котором идет вызов срипта, что-то типа такого:
Код

foreach($keywords as $keyword) {
    system(sprintf('php %s/public/index.php fetcherworker run --mode=console --hash=%s --id=%s > /dev/null', $this->_dir, $hash, $keyword['id']));       
}

Лимит создаваемый такии образом потоков - 400. Когда я запустил всю систему в тестовом режим, я обнаружил что менеджер никогда не заполянет пул из 400 потоков. Обычно работает 20-30 ну максимум 40 потоков. Далее я начал искать узкое место и проблема оказалось именно в использовании system. Цикл по созданию 400 потоков занимает добрых 4 минут и мне кажется это долго. Таким образом я имею не совсем параллельное создание всех 400 потоков, вернее невозможность создания одновременно 400 потоков сразу. Тестирую на слабеньком неттопе, который работает у меня в качестве домашнего dev сервера. Естественно на настоящем сервере будет быстрее и естественно будет больше больше одновременных потоков. Однако меня терзает данный момент который связан с system, может стоит попробовать исзпользваоть curl_exec или curl_multi_exec и в таком случае получить прирост к скорости создания параллельных потоков?

Добавлено через 4 минуты и 15 секунд
Может быть стоит посмотреть в сторону Python, который имеет полноценную работу с тредами да и вообще быстре в работе чем PHP?


--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
Fortop
Дата 21.12.2012, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



pcntl_fork

Насчет питона ничего не скажу в синтетических тестах он не быстрее.
Код нашего питониста если и работал быстрее, то разница максимум в десятках процентов, но не в разы.
В итоге он переделал все на jython а потом и полностью на java

Но даже в этом случае скорость увеличилась всего лишь в несколько раз.
Зато было угроблено примерно 7 человеко-месяцев работы (т.е. оно себя окупит лет через 5ть не ранее)


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
DimaSiK
Дата 22.12.2012, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



pcntl_fork - извиняюсь, но не совсем понял приминительно к моей болячке. Блин, тогда я совсем не знаю какой выход из данной ситуации, который бы позволил обрабатывать большое количество запросов. В данный момент 26000 запросов обрабатывается примероно в течении 2-3 часов, но если количество выростет то будет задница. Я понимаю, что такого рода задачи не решаются средставми одного PHP, тогда хоть куда смотреть и на чем писать решени или что искать? какая-то тупиковая ситуация возникла. Я даже не знаю, что ответить клиенту, когда мой механизм перестанет справляться с большим наплывом запросов. Какое решение тогда ему предложить, не знаю  smile 


--------------------
Мы не стараемся быть первыми, мы стараемся быть лучшими.

PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.