Производительность

glam

Новичок
Производительность

Всем привет!

Основная задача моего сайта - предоставить пользователям сервис скачивания файлов. Файлы отдаю апачем через симлинки. Этим летом успешно переехал с виртуального хостинга на дедикэйтед в Рентере, посещаеомсть выросла и сейчас уперлась - больше просто сервер не тянет. Сейчас в день 8000 пользователей, 30 000 хитов. В пиковый момент, когда одновременно сидят 200 человек (по статистике Ливинтернет), сайт начинает дико тормозить и многие пользователи не дождавшись загрузки страницы уходят. Смотрю в top - вроде все ок. Подозреваю, что сервер тянет (Pentium IV, RAM 1GB), но не хватает пропускной способности канала - все-таки народ качает файлы, а не просто странички смотрит.
В голову пришло решение - под отдачу файлов сделать отдельный сервер, причем не на рентере, а на петерхосте, потому что на петерхосте можно наращивать канал дополнительным 100мбитным или даже гигабитным. Распределение реализовать очень просто - головной сервер на рентере генерит странички и отдает их пользователю, а ссылки на скачивание файлов ведут на второй сервер, который занимается только отдачей файлов. Соответственно на петерхостовском хостинге с ростом посещаемости и нагрузки канал можно будет нарастить до гигабитного.

А вот сейчас задался вопросом - может я что-то неправильно думаю? Считаю, канал 100 000 / 8 = 12 500 КБайт/сек, 12 500 КБайт/ 200 человек = 62,5 КБайт. Ну не с такой скоростью отдает сервер странички, а намного медленней! В пиковые моменты секунд 20 ждать приходится. Бедные пользователи... Может проблема не в канале, а в том, что сайт плохо написан и грузит сервер?
С другой стороны при планируемом росте в 10 раз скорость на одного человека будет 6,25 КБайт/сек - недопустимо мало, и похоже без отдельного файл-сервера в любом случае не обойтись.

Ребят, посоветуйте, что можно сделать? Нормальное, правильное решение какое? И не очень сложное в реализации.
 

Krishna

Продался Java
Для начала, нужно точно выяснить что же тормозит, а не заниматься гаданиями.

предоставить пользователям сервис скачивания файлов. Файлы отдаю апачем через симлинки.
Считаю, канал 100 000 / 8 = 12 500 КБайт/сек, 12 500 КБайт/ 200 человек = 62,5 КБайт. Ну не с такой скоростью отдает сервер странички, а намного медленней!
Предлагаю определиться, что же всё же отдает сервер - файлы, или странички. Ибо сиё есть две большие разницы.
Далее, канал в заявленные 100 мегабит вовсе необязательно является таковым. Нужно временно погасить сайт и замерить реальную пропускную способность канала.

Смотрю в top - вроде все ок. Подозреваю, что сервер тянет (Pentium IV, RAM 1GB), но не хватает пропускной способности канала - все-таки народ качает файлы, а не просто странички смотрит.
"Смотрю в книгу, вижу фигу"
1. ЕСЛИ главная задача твоего сервиса - отдача файлов, то логично предположить, что узким местом будет не процессор и память, а файловая система и ширина канала. Нужно смотреть нагрузку на диски, конфигурацию которых, ты, кстати и не подумал огласить. Статистику нагрузки на канал нужно собирать уже специальными утилитами.

ОС ты тоже не оглашал, однако во фряхе статистика по нагрузке на ФС выводится командой systat -vmstat 1, так же можно увидеть какие именно процессы нагружают диск: команда top -s 1, с дальнейшем нажатием кнопки m.
 

kode

never knows best
Re: Производительность

если бы тормозили странички - ты бы увидел нагрузку в топе на апач

естественно надо файлы отдельно выносить
 

glam

Новичок
По жестким - стоят IDE 2x250, RAID 1.
ОС - FreeBSD 5.x
systat -vmstat 1 посмотрел. Проц, винты - везде нагрузка нормальная, 10-15%. Сайт долго грузится.
Нагрузку на канал во фрибсд так просто одной командой не измерить, насколько я понял.

Хочу сегодня установить nginx и настроить на отдачу статичных файлов.
План моих действий:
1) скачать пакет
2) разархивировать
3) инсталлировать
4) кинуть файл с настройками
5) запустить nginx
6) проверить скачку файлов и открытие страниц
7) радоваться.
Если я установлю его из пакета
http://sysoev.ru/nginx/nginx-0.5.34.tar.gz
и подсуну ему конфигу типа
http://blog.kovyrin.net/files/nginx-conf/rproxy-boost.nginx.conf
то все "само заработает"? Почему nginx будет первым получать запросы и стоять на фронтэнд, а не апач?
В настройке конфиги поменять только значения
...
server_name some-server.com www.server-name.com;
...
root /spool/www/members_ng;
...
, и достаточно будет?

Вообще делать страшно, один единственный раз в жизни установил модуль для апача по инструкции (но заработал!), но придется все делать самому. Что я могу сломать и как застраховаться?
И еще вопрос - а nginx поймет символическую ссылку и нормально как статитку отдаст?
 

Alexandre

PHPПенсионер
то все "само заработает"? Почему nginx будет первым получать запросы и стоять на фронтэнд, а не апач?
В настройке конфиги поменять только значения
это как настроишь....
настраивать надо
nginx на 80 порт
apach на 8080 порт (или любой по желанию > 1024)
nginx должен проксировать все запросы *.php на аппач (на порт 8080)

вариант 2:
отказаться от аппача в принципе, использовать режим FastCGI для РНР.
http://www.opennet.ru/base/net/nginx_php.txt.html

http://www.google.ru/search?complete=1&hl=ru&newwindow=1&q=nginx+РНР&btnG=Поиск&lr=
 

Krishna

Продался Java
Я думаю nginx тебе не поможет.
Это не волшебная палочка. Ищи причину тормозов, а не занимайся шаманством.
 

Alexandre

PHPПенсионер
Я думаю nginx тебе не поможет.
Это не волшебная палочка. Ищи причину тормозов, а не занимайся шаманством.
причину тормозов искать однозначно надо, но отдача статики nginx значительно может помочь в повышении производительности.

необходимо спрофилировать скрипт и найти узкое место...
может тормоз не в самой отдаче файлов а в скрипте, который формирует эту отдачу (или ссылку на отдачу).

-~{}~ 13.12.07 22:28:

Что я могу сломать и как застраховаться?
сломать можно все... по этому
сохрани старые конфиги апача. есть виртуалхосты?
в крайнем случа, ты можешь восстановить старые конфиги и перезапустить аппач... тогда все останет. Лучше это делать ночью или в выходные рано утром, если сервер упадет, то пользователи этого не заметят и начальство (спонсоры & рекламодатели) тоже.

далее проинсталлировать nginx, настроить конфиг,
запустить на свободный порт.. (например на 8888 ) проверить что nginx работает

далее настроить конфиг с проксированием на аппач или FAST _CGI на порт 8888
проверить как работает

сменить у nginx порт 8888 -> 80
сменить у аппача порт 80 на проксируемый порт (8080)
запустить аппач, проверить на порту 8080 (если выбрали режим не FAST _CGI )
запустить nginx

радоваться или быстренько восстановить конфиги и далее искать причину - почему не работает

думаю - подробнее уже некуда
 

glam

Новичок
Согласен, что
1) тормоза искать нужно
самое противное, и лезть так не хочется в это :( Не скажу что код написан очень плохо, регулярками и прочим не злоупотребляю, но и не скажу что вылизанна каждая строка...
Кстати, простой вопрос - если я засеку время в начале php странички и в конце - это будет время именно генерации страницы или время, сколько пользователь получал страничку? Ведь апач как-то там "нажимает на паузу" для тормозных клиентов и для меня ответ неочевиден. Я к тому, что мерять таким способом время генерации страницы или нет, даст это объективную информацию о качестве кода?
Причем я похоже догадываюсь где слабое место - антилич мой колхозный, там проверка времени жизни всех симлинков и их убийство происходит при каждом вызове скачки, да еще и рекурсией по директориям :( Проверяется просто, на время можно отключить скачку через симлинки и сразу директить напрямки, посмотреть что с производительностью будет.
2) второй физический сервер ставить
- это уже 100%
3) ставить nginx
Сейчас пробежался по трем ключевым (для меня) сайтам, на которых зависаю ежедневно и.. все трое сидят на nginx! Причем динамику отдают через nginx! Короче его нужно ставить однозначно, причем попробую прикрутить сразу фастцгипхп. Единственная загвоздка - сейчас вспомнил, что в собственноручно написанном антиличе реализована такая фишка - для каждого русского файла (точнее симлинка под него) генерируется свой файл настройки апача (есественно по одному файлу-симлинку в папке), в котором прописан для mod_headers свой правильный заголовок для русского файла. Нужно узнать, есть ли такая возможность в nginx - подсовывать свой заголовки.
Короче поле еще непаханное.
 

fixxxer

К.О.
Партнер клуба
ага, ну вот видишь, у тебя там какой-то код. :) это во первых.

во вторых, допустим даже вариант с 2мя строчками header+readfile. задумайся о том, что происходит при отдаче медленному клиенту. подсказка - на каждого клиента висит по процессу httpd-mod_php. в случае с nginx же ты быстро отдаешь имя файла, php отдыхает, а nginx медленно и печально раздает контент всем клиентам своим единственным* процессом.

* точнее, по количеству воркеров, которое в общем случае разумно ставить равным кол-ву cpu/голов
 

glam

Новичок
Отдельное спасибо за подробно расписанную методику настройки портов, все ясно.
 

fixxxer

К.О.
Партнер клуба
ничего не ясно ;) апач надо вешать на 127.0.0.1:80 как сказал si
иначе поимеешь геморой с закрытием этого порта и кривыми редиректами (да, это все настраивается, но зачем создавать себе сложости)

-~{}~ 14.12.07 01:25:

кстати если пойдешь почитаешь и разберешься как устроен x-accel-redirect выкинешь свои симлинки на помойку и все сделаешь в три строчки ;)
 

Krishna

Продался Java
причину тормозов искать однозначно надо, но отдача статики nginx значительно может помочь в повышении производительности.
При 30.000 хитов в сутки - не может.
Я смотрю многие не понимают назначения nginx и его преимуществ перед Apache. Это прежде всего экономия памяти и экономия ресурсов ОС на подъем тяжелого процесса Apache. Но всё это не столь критично при 30ти килохитах.

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

glam

Новичок
fixxxer, уже один раз по диагонали прочитал про x-accel-redirect и понял, что с установкой nginx можно убить 2 зайцев - увеличить скорость отдачи и убарть проблемный кусок кода с симлинками - мне изначально это решение не очень нравилось - на каждую скачку создавать папку, в ней симлинк + настройку для апача, потом все это грохать - слишком много мышиной возни. Про x-accel-redirect еще раз прочитаю и попробую реализовать.
Krishna, я прекрасно понимаю, что 30000 хитов в сутки - это ниачем вообще. И понимаю что nginx нужен при сотнях тысяч-миллионах хитов. Просто изначально я думал, что проблема только в канале, ведь у меня помимо хитов и файлы постоянно качают в кучу потоков. Но по ходу обсуждения выяснилось, что скорей всего и код кривоватенький.

Короче появилось понимание, что делать.
1) ставить nginx на все - и на статику, и на php
2) отдачу файлов сделать через X-Accel-Redirect
все это на старом сервере ставить с прицелоим на то, что этот старый сервер скоро станет просто файловым

и все-таки думаю самое главное
3) установить новый сервер
4) на новом сервере установить и настроить отдачу динамики, скопировать бд со старого сервака, отсылать запросы на скачку на старый сервер
5) переписать dns на новый сервер.

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

-~{}~ 14.12.07 01:56:

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

-~{}~ 05.01.08 05:10:

Ребят, короче уперся и ничего не могу сделать. До этого все проблемы порешал, потом подробно опишу, но не могу заставить nginx запускать php скрипты и отдавать результат. Статику nginx выдает.
Пытался и так сделать:
http://www.lissyara.su/?id=1532
т.е. через spawn-fcgi запустить
и так:
http://blog.kovyrin.net/2006/05/30/nginx-php-fastcgi-howto/
т.е. слепил свой spawn-fcgi-handmade.sh
Все делал пошагово, но хоть тресни, не получается, nginx выдает "The page you are looking for is temporarily unavailable. Please try again later. " :(
Как узнать,
1) запущен ли php как fcgi
2) принимает ли он запросы по порту 8888 (ну который указываем в spawn)
3) с какими параметрами запустился nginx закушал ли он настрйку location с php и отсылкой запросов на порт 8888.
Блин, уже 4 дня бьюсь, 500 раз php переставлял, сервер перезагружал, настройки вертел, не получается :( Помогите плиз кто смог запустить nginx+fcgi.
 

glam

Новичок
Не помогло.
Не создался файл /etc/php-fpm.conf, не нашел образца. Продукт не документирован, пропатчил, запустил с параметром /bin/php-cgi --fpm - не увидел php этот параметр.
 
Сверху