| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: разработка для Web > Раздача media-файлов через сценарий |
| Автор: n4n0bit 19.11.2008, 18:22 | ||
Стоит задача раздавать файлы через http, но при этом должно быть так "Один Линк" => "Один Пользователь" я это реализовал в модуле http://search.cpan.org/~nanobit/HTTP-DownloadLimit/ . Вкратце скачка осуществляется по такой схеме:
Тестировал я на Apache 2.2 и все было хорошо, но стала задача перейти на LigHTTPD и при использовании своего модуля процесс LigHTTPD потребляет при одном клиенте 16-25 % CPU, а ОЗУ так это вообще всю, такое впечатление что когда работает сценарий и те байты который он отдает клиенту помещаются в ОЗУ и там остаются. Далее настает светлый момент когда сервер падает без записей в логах. *Пробывал изменять буффер в read() и это положительного результата не дало. *Проблему с потреблением ресурсов хорошо решает Time::HiRes "sleep" помещая ее в блок while, но разве это коректно? Она же приостонавливает весь сценарий...Этот вариант мне не шибко нравиться, но он работает. *Может как то сделать чтения кусками? при помощи seek() + временные файлы? но будет ли тут скорость и меньше нагрузка? ps: OS FreeBSD, Файла размером до 9Gb pps: помогите с решением проблемы. |
| Автор: tolkien 20.11.2008, 14:03 | ||
Может попробывать вынести из цикла my buf
|
| Автор: n4n0bit 20.11.2008, 14:13 |
| Нет ( |
| Автор: tolkien 20.11.2008, 18:45 | ||
Отключить буферизацию у FH
|
| Автор: n4n0bit 20.11.2008, 20:38 |
| Это тож пробывал - не помогает. единственное что буффер подобрал 32768 при этом если читать локально без сервера и выводить на STDOUT CPU жрет уже до 8% ( FreeBSD/ufs ) а в убунте на ext3 2% почему так пока не узнал но явно что та с фс не учел. Ну а с сервером по прежнему оперативу жрет ( lighttpd ).. ps: продолжаю пока думать в этом плане.. |
| Автор: ginnie 21.11.2008, 12:56 |
| n4n0bit, как Вы используете модуль в lighttpd и как он использовался в Apache? Не может ли lighttpd целиком кэшировать ответ модуля? Что происходит если отдавать небольшие файлы в несколько мегабайт? |
| Автор: n4n0bit 21.11.2008, 13:13 |
| Всмысле как используется? Не может ли lighttpd целиком кэшировать ответ модуля? <<< мне кажется что так и происходит. |
| Автор: ginnie 21.11.2008, 13:21 |
Ни разу не пользовался lighttpd, он разве умеет выполнять CGI? Поэтому задал вопрос, как используется модуль вместе с lighttpd: через FastCGI или может lighttpd сам умеет perl-модули запускать, как nginx? |
| Автор: n4n0bit 21.11.2008, 15:24 |
| В нем есть http://http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModCGI |
| Автор: n4n0bit 26.11.2008, 23:53 | ||
| Еще раз повторюсь, я использовал Apache 2.2 на котором проблем не было и Lighttpd 1.4.19. Я попробывал выполнить СИ-шный код под Lighttpd:
Заключение: CGI/ANSI C ОЗУ и CPU в норме. CGI/PERL Пологаю, что mod_cgi плохо работает с PERL при вот такой потоковой раздаче, а именно как бы отправленные байты клиенту еще и кеиширует в ОЗУ, и размер потребляемой памяти одним процессом достигал 1Гб. Процесс использует 25-60% CPU OS FreeBSD 7.0 ps: буду тестировать на др легковесных серверах |
| Автор: Usmanec 24.2.2009, 16:05 | ||
n4n0bit, и не стыдно? Взяли готовый скрипт Daniil Downloader http://softsearch.ru/programs/210-495-daniil-downloader-download.shtml, чуть подредактировали и выложили на CPAN в единоличном авторстве.
|