Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация программы 
:(
    Опции темы
rcdimon
Дата 27.9.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



Всем привет. Столкнулся с неприятными фактами- программа работает медленно. Испытываю на ASUS Lamborghini, для справки- 2Gb RAM, 2.16 Intel Core 2 Duo

Пишу веб скрипт. Который по идее разрабатывается как высоконагруженый....

Генерация страницы занимает порой несколько секунд. Даже на тех страницах, где нет запросов к БД.

Объем кода сравнительно небольшой. Суммарй объем всех файлов cgi и  pm составляет 180кб


Особенность системы в том, что она поделена на модули. Каждый модуль выполняет свои функции- фотогалерея, форум, блоги и т.д. Каждый модуль выполнен в виде модуля Perl - pm файл.

Обращение к модулям системы происходит посредствам URL 

site.ru/gallery/view/23
site.ru/blogs
site.ru/forums/show/12
и т.д.

В главном файле, который и запускается, стоит swith примерно такой конструкции

Код


switch ($module){
  case 'gallery' {
    use myModules::Gallery;
    my $Gallery = Gallery->New();
  }

  case 'blogs' {
    use myModules::Blogs;
    my $Blogs = Blogs->New();
  }
}




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

Еще я использую модуль Switch в главной сайте программы и в каждом модуле он тоже подключается, т.к. там он тоже используется. На сколько это плохо? Подключается ли он каждый раз заново или Perl умеет не загружать дважды одно и то же?

Какие вообще посоветуете провести работы для ускорения работы программы? Если в браузере нажать раз 20 подряд F5 - в памяти появляется все 20 процессов Perl и пока все отработают проходит несколько минут...


Это сообщение отредактировал(а) rcdimon - 27.9.2008, 18:14
PM MAIL ICQ   Вверх
KSURi
Дата 27.9.2008, 18:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



use подключает модули еще на стадии компиляции. Если вы хотите делать это в рантайме, то используйте require.

Дважды в одном процессе модуль не загрузится.

Ну для начала, имхо, попробуйте пересмотреть свой код. Скорее всего проблема в нем, а не в том, что лишние модули подргужаются.
Потом почитайте про mod_perl.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
rcdimon
Дата 27.9.2008, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



Цитата

Ну для начала, имхо, попробуйте пересмотреть свой код. Скорее всего проблема в нем, а не в том, что лишние модули подргужаются.


Дело в том, что это моя далеко не первая программа на перл. Были и на много большие. Писал я в том же стиле, точно так же.. В других программах подобного не наблюдалось
PM MAIL ICQ   Вверх
DaemonSuw
Дата 27.9.2008, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Да вопрос оптимизации очень остро стоит есть куча объектно ориентированных модулей, которые подключаются... задержка около 1-2 сек... Собираемся решить перейдя на mod_perl, но мне кажется что это не сильно поможет. В следствии чего возникает вопрос: можно ли откомпилировать статические модули (например ядро системы) - в тип dll (к примеру), которые можно будет подрубить потом и которые будут работать быстро(так как они откомпилины)... или это из области фантастики? 

Это сообщение отредактировал(а) DaemonSuw - 27.9.2008, 20:19
PM MAIL ICQ   Вверх
sir_nuf_nuf
Дата 27.9.2008, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



rcdimon, а вам правильно сказали - use подключает на этапе компиляции.. т.е. ему пофигу на всякие if - then.

Если нужна производительность - fastcgi или mod_perl.

А вообще - попробуйте профайлер подключить - увидите куда время уходит. А то делать заявления, что тормозит из-за того то ... как то необоснованно.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
rcdimon
Дата 27.9.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



А как его подключить?  smile 
PM MAIL ICQ   Вверх
sir_nuf_nuf
Дата 27.9.2008, 20:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



rcdimon, c бубном и только с бубном..
у вас я так понял CGI ? - эт просто скрипт - поэтому проблем быть не должно

Сначала прочитать доку:
http://search.cpan.org/~ilyaz/DProf-19990108/DProf.pm

По идее достаточно написать в начале CGI скрипта
Код

#!/usr/bin/perl -d:DProf


после запуска скрипта найти логи профайлера и посмотреть их с помощью dprofpp


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
rcdimon
Дата 27.9.2008, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



Спасибо, попробую.

Посоветуйте еще, пожалуйста, где найти документацию о том, как перейти с cgi на mod_perl
PM MAIL ICQ   Вверх
sir_nuf_nuf
Дата 27.9.2008, 20:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



rcdimon, 
тут: http://perl.apache.org/docs/index.html
и тут: http://perl.apache.org/docs/1.0/guide/porting.html

вообще говоря, есть режим совместимости, когда вы  не хотите менять сами скрипты..  они просто работают быстрее - уличная магия =)
а есть mod_perl API - это когда вы программируете под apache - я использовал именно такое.

А еще - если только начали - по пробуйте Catalyst.. я сам только сегодня начал с ним знакомится - но он мне уже нравится! с ним можно ваши программы запускать как FCGI, CGI, mod_perl, под собственным сервером, не меняя модули!


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
KSURi
Дата 27.9.2008, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Буквально в соседнем топике человек просил ссылки на документацию.

ЗЫ: помнится на http://perl.apache.org/ видел статью типа "Migrating from CGI to mod_perl"

Добавлено через 53 секунды
Опередили)


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
rcdimon
Дата 27.9.2008, 20:42 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



Мне в принципе разнообразие не нужно. У меня есть довольно серьезный проект, который мне необходимо сначала разработать локально, а работать он будет на выделенном сервере под *nix с апачем конечно. Планируется большое число пользователей онлайн- поэтому хотелось бы выбрать наиболее быстрый вариант. 

Так же не помешают статьи об оптимизации самого кода.

Что касается исправления скриптов под mod_perl- то это не проблема. Если будет надо- исправим легко
PM MAIL ICQ   Вверх
ginnie
Дата 27.9.2008, 22:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый rcdimon, прежде всего, фраза

Цитата

Что касается исправления скриптов под mod_perl- то это не проблема. Если будет надо- исправим легко


для людей, не первый год разрабатывающих ПО под mod_perl звучит по-детски наивно smile (и это не "понты", а суровая правда жизни).

Цитата

Пишу веб скрипт. Который по идее разрабатывается как высоконагруженый....
Генерация страницы занимает порой несколько секунд. Даже на тех страницах, где нет запросов к БД.


Если в слово "высоконагруженый" Вы вкладываете тот-же смысл, что и я (т.е. ПО на сервере должно иметь максимальное быстродействие при использовании минимума оперативной памяти), то разработка скриптов без использования mod_perl или FastCGI - это мазахизм  smile

По поводу оптимизации программы присоединяюсь к совету sir_nuf_nuf по поводу DProf - этот модуль поможет найти методы и функции, которые  отрабатывают дольше всего. Но это не универсальный модуль, он помогает найти узкое место только в части случаев, кроме того, повышением производительности медленного фрагмента Вам придется заниматься самостоятельно - для этого автоматизированных модулей нет. Не имея опыта это сделать крайне сложно.
В своей практике для определения узких, с точки зрения быстродействия, мест я использую модуль Test::Timestamp, только все чаще становится проблемой, ограничение в 6 разрядов после запятой во временных отсчетах.



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
ginnie
Дата 27.9.2008, 22:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Цитата

У меня есть довольно серьезный проект... а работать он будет на выделенном сервере под *nix с апачем конечно.


Серьезный web-проект обычно включает:

1. Сервер распределения нагрузки (frontend)
2. Один или несколько кэширующих серверов для статики (назовем их frontend cache)
3. Один или несколько серверов, на которых выполняются скрипты (backend)
4. Один или несколько (обычно с использованием репликации) серверов БД (database)
5. Один или несколько кэширующих серверов для скриптов (назовем их backend cache)

Как это все будет работать на "выделенном сервере под *nix с апачем конечно"?  smile 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
sir_nuf_nuf
Дата 28.9.2008, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ginnie @  27.9.2008,  22:53 Найти цитируемый пост)
Как это все будет работать на "выделенном сервере под *nix с апачем конечно

главное отжать у руководства 70 ядерный проц от интела.. скоро обещали =)


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
ginnie
Дата 28.9.2008, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



 smile 
Цитата

70 ядерный проц от интела


Вот бы и нам такой, а то столько сил уходит на оптимизацию, кластеризацию и кэширование  smile 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
Дата 28.9.2008, 10:42 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



 smile  gallery2 на php очень медленно работает, много памяти ест, и все равно в каком режиме php или fastcgi или mod_php

ЗЫ mod_perl на много быстрее заработает?

Это сообщение отредактировал(а) gcc - 28.9.2008, 10:47
PM WWW ICQ Skype GTalk Jabber   Вверх
KSURi
Дата 28.9.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В десятки, а местами может и сотни раз быстрее

Это сообщение отредактировал(а) KSURi - 28.9.2008, 11:28


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
gcc
Дата 28.9.2008, 11:31 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



а mod_perl и mod_php разные чтоли совсем?  



Это сообщение отредактировал(а) gcc - 28.9.2008, 11:35
PM WWW ICQ Skype GTalk Jabber   Вверх
rcdimon
Дата 28.9.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



Цитата

gallery2 на php очень медленно работает, много памяти ест, и все равно в каком режиме php или fastcgi или mod_php



Я сталкивался с этим, я думаю, что Gallery2 просто написана не достаточно оптимально. Использует Smarty, который сам по себе довольно тяжелый и т.д. Основной выигрыш использования mod_perl по скорости перед обычным cgi в том, что Perl находится уже в памяти и ему не надо тратить время на загрузку перед выполнением сценария. Если сам сценарий тяжелый- то, конечно, летать не начнет.


Цитата

а mod_perl и mod_php разные чтоли совсем?  

 Я где-то слышал, что php быстрее начинает исполнять сценарий- поэтому на небольших и несложных программках php выгоднее чем perl cgi. Но после загрузки в память интерпретатора Perl- он работает все-таки быстрее, чем php. Используя mod_perl можно освободиться от накладных расходов на загрузку интерпретатора в память.


Цитата

для людей, не первый год разрабатывающих ПО под mod_perl звучит по-детски наивно 



Я не разрабатывал никогда до сих пор По под mod_perl- иначе не создавал бы эту тему  smile 


Цитата

Если в слово "высоконагруженый" Вы вкладываете тот-же смысл, что и я (т.е. ПО на сервере должно иметь максимальное быстродействие при использовании минимума оперативной памяти), то разработка скриптов без использования mod_perl или FastCGI - это мазахизм



Согласен на все 100%. Поэтому решил осваивать )

Цитата

Серьезный web-проект обычно включает:



Очень интересно, всегда было интересно как это устроено ) Таких вещей я пока не делал, конечно. Где можно подробнее ознакомиться с технологиями высоконагруженых систем? Ну кроме репликации баз данных- этого вроде во всех книгах про БД полно... Хотя и не помешает еще раз  smile 

Цитата

главное отжать у руководства 70 ядерный проц от интела

Могу дать погонять свой 71.5  smile 

Это сообщение отредактировал(а) rcdimon - 28.9.2008, 16:15
PM MAIL ICQ   Вверх
rcdimon
Дата 28.9.2008, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



Пропустил программу через профайлер, а потом его отчет через программу dprofpp

Получились следующие результаты

Цитата

Total Elapsed Time = 1.753412 Seconds
  User+System Time = 1.671412 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 48.5   0.811  1.817  23031   0.0000 0.0001  Text::Balanced::_match_codeblock
 29.4   0.492  1.340  28870   0.0000 0.0000  Text::Balanced::_match_variable
 25.1   0.420  0.420  60012   0.0000 0.0000  Text::Balanced::_failmsg
 11.4   0.191  0.303  19063   0.0000 0.0000  Text::Balanced::_match_quotelike
 5.62   0.094  2.067     21   0.0045 0.0984  main::BEGIN
 3.05   0.051  2.005    138   0.0004 0.0145  Switch::filter_blocks
 2.45   0.041  0.041  70502   0.0000 0.0000  Regexp::DESTROY
 0.96   0.016  0.016      3   0.0053 0.0053  CGI::Carp::BEGIN
 0.96   0.016  0.016      5   0.0032 0.0032  Text::Balanced::BEGIN
 0.96   0.016  0.016      1   0.0160 0.0160  DBI::install_driver
 0.96   0.016  0.016      6   0.0027 0.0027  ActiveState::Path::BEGIN
 0.90   0.015  0.015      3   0.0050 0.0050  vars::BEGIN
 0.90   0.015  0.015      3   0.0050 0.0050  DynaLoader::BEGIN
 0.00   0.000  0.000      1   0.0000 0.0000  Config::launcher
 0.00   0.000  0.000      1   0.0000 0.0000  Config::fetch_string



Т.е. как я понял что-то под именем Text::Balanced::_match_codeblock жрет половину времени выполнения программы, вызываясь 23 тысячи раз... Хотелось бы еще узнать что это такое и как с ним бороться  smile 
PM MAIL ICQ   Вверх
ginnie
Дата 28.9.2008, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



rcdimon, если это результат одного запуска скрипта, то надо срочно делать предварительный заказ на всю партию компьютеров с новыми 70-и ядерными процессорами  smile

Цитата

...Хотелось бы еще узнать что это такое и как с ним бороться

Интересный вопрос от разработчика  smile
Мои телепатические способности практически не развиты, возможно кто-то из коллег будет удачливее и напишет Вам какие нужно внести изменения в скрипт, чтобы все "залетало".


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
rcdimon
Дата 28.9.2008, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



Цитата

rcdimon, если это результат одного запуска скрипта


Ну да.. Одного )

Скажите хотя бы что такое 

Text::Balanced::_match_codeblock
Text::Balanced::_match_variable
Text::Balanced::_failmsg
Text::Balanced::_match_quotelike
PM MAIL ICQ   Вверх
rcdimon
Дата 28.9.2008, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



Удалось снизить время выполения скрипта с 1.8 секунды до 0.2 просто заменив use на require (при подключении модулей) и отказавшись от использования Switch... В документации прочитал, что ему нужен для работы тот самый Text::Balanced.... 

Удалил Switch- исчезли все

Text::Balanced::_match_codeblock
Text::Balanced::_match_variable
Text::Balanced::_failmsg
Text::Balanced::_match_quotelike

Это сообщение отредактировал(а) rcdimon - 28.9.2008, 23:29
PM MAIL ICQ   Вверх
KSURi
Дата 28.9.2008, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Имхо, такие вещи надо не "пальцем в небо" надо угадывать, а пошаговой отладкой.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
rcdimon
Дата 29.9.2008, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



Я не пальцем.. я документацию почитал  smile 

Cpan.org
Цитата

DEPENDENCIES 

The module is implemented using Filter::Util::Call and Text::Balanced and requires both these modules to be installed.

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


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



достаточно ли использовать для безопасности use strict и use vars (в котором $dbh и несколько хэшей ключи которого часто используются) может быть еще что-то надо или больше ничего не надо?

Это сообщение отредактировал(а) gcc - 30.9.2008, 02:53
PM WWW ICQ Skype GTalk Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

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


 




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


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

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