Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Многоядерность


Автор: frenkys 25.3.2008, 02:27
Вот интересует такой вопрос:

сейчас уже везде почти много-ядерные процессоры.
Пишут ли под веб на перле именно с поддержкой много-ядерности, или уж сама технология веба это подразумевает?
Или же это должно быть реализовано на уровне компилятора?
Например fastcgi - они ж не отточены под многоядерные процессоры.

Автор: GoDleSS 25.3.2008, 09:05
Веб-скрипты нет смысла писать многопоточными/многопроцессовыми, т.к. у любого нормальном динамическом сайте:
1. Много пользователей. И даже если мы говорим о мод_перл или фаст сиджиай - 
2. Много скриптов. Ну и на последок, если мы говорим о мод_перл + системой с единным сценарием:
3. Перл взаимодействует с несколькими сервисами/демонами - СуБД, мейл демон и т.д.


Автор: sir_nuf_nuf 25.3.2008, 13:36
Скрипт должен отрабатывать быстро.
Поэтому распараллеливание - это бессмыслено, больше времени будет уходить на форки и синхронизацию.
Другое дело, что один и тот же скрипт зачастую обрабатывает несколько запросов одновременно.
Тогда каждый запрос - в своем потоке и процессе.

Например Apache - всегда запущено несколько процессов, 
Apache2 поддерживает многопоточность, поэтому один скрипт может работать параллельно.

потоки и процессы операционка раскидывает по процессорам.

вывод: не парься! =)
P.S. если только сам не задумал веб-сервер писать

Автор: frenkys 25.3.2008, 18:11
Просто тогда чтобы писать быстрые приложения под веб 
например Java те же JSP  будет быстрее за счет многоядерного процессора, ведь даже уже при соединении с мускулем, а оно там всего идет один раз а не кучу висящих коннектов к бд (фастцги).

Неужели придеться смотреть в сторону явы?

Автор: sir_nuf_nuf 25.3.2008, 19:04
Ты не понял:
многопоточность и многопроцессорность УЖЕ поддерживаются!
На уровне apache + OS.
тебе при написании скриптов даже думать об этом не прийдется, твои скрипты и так будут использовать все ядра (если конечно apache + OS нормально настроены)

Другое дело, что java действительно несколько быстрее чем perl. 
Именно платформа - т.е. JVM работает чуток эффективней perl,
Но это не повод переходить на java.
Как показывает опыт тормоза в 90 % случаях - из-за алгоритмов, а не из-за
используемого языка.

По поводу соединений с DB.. 
Да в web серверах написанных на java это сделано немного прозрачнее,
но и в perl не все так плохо - есть Apache::DBI и Apache::DBI::Cache, 
которые делают приблизительно тоже самое.

Мне кажется, они не умеют разделять подключения между потоками, что конечно плохо.. 
число подключений будет равно числу потоков. В j2ee подключений меньше. 

собираюсь обсудить эту тему на форуме сейчас =)

Автор: vadiml 25.3.2008, 20:46
sir_nuf_nuf
По поводу соединений с DB.. ... Мне кажется, они не умеют разделять подключения между потоками, что конечно плохо.. 
число подключений будет равно числу потоков


подключение к базе -- это очень затратное удовольствие, поэтому
всё делается гораздо проще -- при первом выполнении скрипта делается подключение и dbh пишется в shared memory, все остальные копии скриптов считывают этот dbh и работаю через него

если есть какой-то запрос, которые выполняется очень часто, то он делается параметризированным, т.е. dbh->prepare("запрос с параметрами;"), благодаря чему база парсит его только 1 раз, а потом только постоянно выпоняет с разными условиями, а в дальнейшем вызывается только execute("$param1, $param2, ...");

ЗЫ для mysql prepare() & Co давно есть, для постгреса написаны недавно, если в Вашем дистрибутиве этого еще нет, советую обновить DBD-Pg, в нем было очень много доработок

Автор: sir_nuf_nuf 26.3.2008, 00:37
Цитата(vadiml @ 25.3.2008,  20:46)
sir_nuf_nuf
По поводу соединений с DB.. ... Мне кажется, они не умеют разделять подключения между потоками, что конечно плохо.. 
число подключений будет равно числу потоков


подключение к базе -- это очень затратное удовольствие, поэтому
всё делается гораздо проще -- при первом выполнении скрипта делается подключение и dbh пишется в shared memory, все остальные копии скриптов считывают этот dbh и работаю через него

если есть какой-то запрос, которые выполняется очень часто, то он делается параметризированным, т.е. dbh->prepare("запрос с параметрами;"), благодаря чему база парсит его только 1 раз, а потом только постоянно выпоняет с разными условиями, а в дальнейшем вызывается только execute("$param1, $param2, ...");

ЗЫ для mysql prepare() & Co давно есть, для постгреса написаны недавно, если в Вашем дистрибутиве этого еще нет, советую обновить DBD-Pg, в нем было очень много доработок

я в курсе как это прибризительно работает. меня интересуют детали.

как то - что такое "shared memory"  ?

Это POSIX shared memory ?
или это просто аресное простанство процесса, которое по умолчанию разделено междк потоками ?
или это разделяемая память на уровне perl ? в котором вообще говоря память (perlовая) не разделяется между потоками .
или это особенность mod_perl ?

Автор: ginnie 26.3.2008, 11:50
vadiml, есть еще один вопрос: как потоки используя одно соединение с базой будут использовать транзакции?

Автор: vadiml 26.3.2008, 20:57
sir_nuf_nuf
что такое "shared memory"  ? Это POSIX shared memory ?
это я по привычке с С  назвал, вот:
"memcached is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load" http://www.danga.com/memcached/
думаю в http://search.cpan.org/~bradfitz/Cache-Memcached-1.24/lib/Cache/Memcached.pm написано достаточно 
и ссылки есть
так же есть есть куча подмодулей, но я их не смотрел -- не понадобились
ЗЫ я вообще редко для web'а пишу, 

ginnie
как потоки используя одно соединение с базой будут использовать транзакции?
как все базы -- каждая транзакция живёт сама по себе, если возник конфлик по записи данных -- ждёт освобождения, если возникла взаимная блокировка транзакций -- откат одной из них по таймауту.
если, конечно, Вы firebird не используете, в котором уже несколько лет обещают многопоточноть, а воз и ныне там smile

Автор: Ramirez 31.3.2008, 11:28
это фича mod_perl и апача. пул коннектов к бд или чего угодно можно реализовать, на базе apache + mod_perl
вот тут у меня была похожая задача: http://forum.vingrad.ru/topic-166437.html только мне нужен был пул конектов к телнету, но чтобы общий на всех воркеров апача.

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

но почему это так работает, мне никто объяснить не смог =)

Автор: ginnie 31.3.2008, 11:40
Уважаемый vadiml, проблема в том, что в одном соединении может осуществляться только одна транзакция, соответственно, потоки не могут использовать одновременно одно соединение, если они явно используют транзакции.

Автор: frenkys 19.10.2009, 01:38
Поскольку больше люблю fastcgi а не mod_perl то приходиться выкручиваться по другому.


Ребята а действительно, кто-то пробывал $dbh хранить в мемкеше и разными скриптами оттуда его брать, при условии что коннект живой?

Добавлено через 57 секунд
Цитата(vadiml @  25.3.2008,  20:46 Найти цитируемый пост)
если есть какой-то запрос, которые выполняется очень часто, то он делается параметризированным, т.е. dbh->prepare("запрос с параметрами;"), благодаря чему база парсит его только 1 раз, а потом только постоянно выпоняет с разными условиями, а в дальнейшем вызывается только execute("$param1, $param2, ...");



это нужно вызывать prepare_cached

Автор: KSURi 19.10.2009, 11:08
Цитата(frenkys @  19.10.2009,  01:38 Найти цитируемый пост)
Ребята а действительно, кто-то пробывал $dbh хранить в мемкеше и разными скриптами оттуда его брать, при условии что коннект живой?

Это невозможно, т.к. DBI реализован с помощью XS. См. http://forum.vingrad.ru/forum/topic-267383/kw-perl-memcache-libxml/hl/xs/index.html.

Автор: frenkys 19.10.2009, 13:24
и на чем вы остановились в итоге?

Автор: sir_nuf_nuf 19.10.2009, 15:02
на чем мы остановились с чем ?
как использовать соединения с базой?

У нас так - каждый скрипт работает в своем процессе (не в потоке).
Каждый процесс держит постоянно соединение с базой данных.

В случае с потоками - обычно создают пул соединений.
Каждый поток при необходимости берет соединение из пула, а когда будет не нужно - возвращает.

Автор: frenkys 19.10.2009, 17:06
угу понял спасибо =)

Добавлено позже
угу понял спасибо =)

Автор: Bulat 19.10.2009, 17:10
Цитата(frenkys @  25.3.2008,  18:11 Найти цитируемый пост)
например Java те же JSP  будет быстрее за счет многоядерного процессора, ведь даже уже при соединении с мускулем, а оно там всего идет один раз а не кучу висящих коннектов к бд (фастцги).

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

Цитата(ginnie @  31.3.2008,  11:40 Найти цитируемый пост)
Уважаемый vadiml, проблема в том, что в одном соединении может осуществляться только одна транзакция, соответственно, потоки не могут использовать одновременно одно соединение, если они явно используют транзакции. 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)