Xpoint
   [напомнить пароль]

DBI, finish и ресурсы сервера

Метки: [без меток]
2008-05-15 12:51:15 [обр] Легеров Алексей[досье]
Ищу причины очень нестабильной отдачи данных из БД MySQL.
База малого объема (10-200 строк в 20 таблицах), динамика изменений несерьезная. Хостинг Мастерхоста. Скрипты Perl CGI содержат 10-20 циклов чтения данных из БД. Все избирательные циклы работают с LIMIT N (все ограничения фиксированы), есть несколько сортирующих выборок.
$sth->finish; не использую нигде. На cpan вычитал, что он нужен только для освобождения дескриптора, если выборка забиралась не полностью. И так как все мои циклы полностью забираются, я finish не ставлю.
В итоге один и тот же скрипт может загружаться как 1 сек. так и все 30 сек. Замечено, при добавлении записи в одну из таблиц снова жду 10-30 сек. Затем серия из мгновенный перезагрузок. Задержки бывают и при неизменных данных.
В поиске причины возник вопрос: может все таки необходим finish после циклов? Если нужен, после каждого цикла, или, например, только сортирующих, или вообще только перед disconnect()? Возможно причина в бругой области?
спустя 20 минут [обр] Алексей Севрюков(61/1292)[досье]

Легеров Алексей[досье] А чего Вы хотели на обычном хостинге. Никто и не гарантирует Вам что он всегда стабильно будет работать. По себе могу сказать что обычный хостинг сейчас лучше не брать, он почти везде отвратительный. Из вариантов только VDS или выделенный сервер.

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

спустя 24 минуты [обр] Легеров Алексей[досье]
Алексей Севрюков[досье], да, понимаю, что VPS и тем более свой сервер предпочтительней. Обращусь к заказчику с предложением поднять цену хостинг-поддержки.
Тем не менее, есть ли смысл в finish например сортирующих циклов, даже если они выбраны полностью? Где-то читал, что finish кроме прочего освобождает стэк сортировки. БД будет существенно расти (тур. портал) и на большом объеме вопрос может оказаться очень актуальным.
спустя 2 минуты [обр] Легеров Алексей[досье]
Да. Прочел, прослезился. Сайт конечно не тур. портал (иначе какой виртуальный хостинг), а сайт турагентства с амбициями и большой базой в перспективе.
спустя 51 минуту [обр] Thirteensmay(0/157)[досье]
Легеров Алексей[досье] Дык проэкспериментируйте, захавали - посмотрели память, отпустили - опять посмотрели, делов то на 3 мин...
спустя 1 час 17 минут [обр] Легеров Алексей[досье]
Thirteensmay[досье], знаю, что эксперимент — двигатель прогресса. Но я в несколько иной позе. Серьезные задержки загрузки эпизодические (полчаса все летает, 5 мин. все ползает, причина не установлена, сейчас ползает). База мальнькая, непоказательная. Память посмотреть не могу (вирт. хостниг), оцениваю только по секундам выдачи скрипта.
Потому не могу достоверно определить влияние и прошу рассказать теорию вопроса.
спустя 1 час 6 минут [обр] Thirteensmay(0/157)[досье]
Я не про то почему кусками тормозит, на этот вопрос вам Алексей Севрюков[досье] ответил, а про то "есть ли смысл в finish". И не жалуйтесь на размер базы... ;)
спустя 9 часов [обр] Алексей Севрюков(61/1292)[досье]

Легеров Алексей[досье] Если Вам нужен ответ по поводу finish - нет, finish не имеет смысла если Вы читаете весь результирующий набор. И finish не будет тормозить скрипт, просто если Вы не будете читать все записи - он сэкономит память, не более. Вы же ограничиваете количество записей уже с помощью MySQL и потом читаете все целиком.

По поводу хостинга - тут надо работать с клиентом, нужно объяснить что хостинг есть разный, и что если хочется чтобы сайт работал быстро и без тормозов хостинг за 10 у.е. не подойдет. В конце концов сайт приносит прибыль и взять сервер с поддержкой не такие уж большие деньги, и что эти деньги в любом случае окупятся. Подумайте сами - Вы бы стали ждать 30 секунд, пока откроется сайт? Особенно при том, что сайт конкурента будет работать быстрее? Лично я бы не стал, а Вы?

спустя 9 часов [обр] Dennis F. Latypoff aka funky_dennis(2/84)[досье]

$sth->finish освобождает память после каждой выборки, рекомендуется использовать всегда.

DBI->connect("DBI:mysql:database_name:databse_host:mysql_use_result=1", ...);

подскажет Вам все места, где необходимо вызывать finish().

спустя 1 час 58 минут [обр] Алексей Севрюков(61/1292)[досье]
Dennis F. Latypoff aka funky_dennis[досье] Уничтожение дескриптора команды аналогично вызову finiah так ведь? Значит в маленькой линейной программе большого смысла нет из-за ее размера, а в большой блочной программе дескрипторы сами уничтожаются при выходе из блока. Так что все зависит от того кто как пишет.
Powered by POEM™ Engine Copyright © 2002-2005