Демон на PHP

ONK

Пассивист PHPСluba
fisher, на реальном окружении протестировать не могу, да и результаты будут нестабильные.
Если рассматривать сервер чата, то даже на отдельно выделенном сервере, без сторонних приложений (только чат и его обвеска), доля демона чата в использовании ресурсов процессора при его условной 100% загрузке чатом, составит не более 5% (а скорее гдето 1%). Это в принципе не является узким местом чата, узким местом является отработка клиентских команд, поступающих на обычные скрипты. Надеюсь, что понятно написал.
В случае с рассылкой зашифрованных файлов, предполагаемая доля в общей нагрузке на процессор ещё меньше, т.к. задача просто разослать эталонные экземпляры файлов по множеству подключающихся клиентов.

Я не вижу в чём по уму прав MiksIr, для данной конкретной области ПХП почти идеальный вариант, к перечисленным плюсам добавлю достаточность его производительности для решения очень многих задач.

MiksIr, велосипеды тоже нужны, особенно удобные и хорошие. Меня в последнее время начинают раздражать товарищи, использующие невпопад это выражение.

По поводу чем не устроило. Я не рассматривал вариант с nginx, рассматривал вариант с Апачем + SSL недостатки просты, на каждое соединение копия апача (можно не рассматривать для 2-го и nginx) + копия ПХП интерпретатора, плюс издержки на парсировку скрипта (если без кэширования байткода).
Плюсы демона - все соединения в одном процессе, можно раздавать один файл сразу всем клиентам, теоретически полностью избавившись от дисковых операций (на практике у меня раздаются индивидуальные порции по 100кб). Минимальное использование памяти и процессорных ресурсов.
По поводу не эффективности select вызова, в данном приложении она не проявляется, т.к. в select передаются только сокеты из очереди чтения или записи, и ничего лишнего. При этом чтение ограничивается заголовком протокола, и обычно в очереди на чтение не больше 10 сокетов. А очередь на запись достаточно эффективно обрабатывается и сокращается по мере отправки. 95% select вызовов приходится с единственным сокетом на приём новых соединений.

Теперь по поводу тестов.

Протестировал на двух серверах.
Тестировал апач на запросы файла 0-й длинны (Апач очень тормозит на запросах не существующих документов).
Тестировал демон чата, т.к. он понимает http протокол и отдаёт понятные для ab ответы. Демон сервиса рассылки файлов протестировать ab не получилось, а по тесту из тестового скрипта он на 15% быстрее демона чата.

Первый сервер очень древний, с процом IP3-700
Апач 260 - 270 запросов в секунду
Демон чата 103 - 115 запросов в секунду

Второй сервер с процом IC2D 2ГГц
Апач 2200 - 2280 запросов в секунду
Демон чата 1240 - 1270 запросов в секунду

Самая тормознутая часть демона чата - парсировка протокола, значительная часть которой производится на голом ПХП.
 

fisher

накатила суть
>>я не вижу в чём по уму прав MiksIr
ну что "в общем и целом" на c/c++ будет работать в разы быстрее, и порог по нагрузке выше, конечно. но если запас по нагрузке в вашей задаче, скажем, десятки процентов на пхп-решении и рост не планируется - конечно с точки зрения прагматика никакого криминала в пхп нет. цифры в-общем удовлетворительные, я тока не понял с отдачей апачем файла 0-й длины и причем тут тормоза с несуществующими доками.

кстати по теме - если есть у кого опыт в перле советую глянуть POE Cookbook(http://poe.perl.org/?POE_Cookbook), секции касательно Client/Server и IPC. что называется, почувствуйте разницу ;)
 

algo

To the stars!
А если есть опыт в Питоне - то юзайте, как алга, Twisted =).

P.S Все соединения в POE/Twisted - в одном потоке, так что межпроцессной коммуникации просто нет.
Очень, знаете ли, удобно бывает для программирования.
 

MiksIr

miksir@home:~$
ONK>> Я не рассматривал вариант с nginx
Ну раз "не рассматривали", то пишите дальше свои велосипеды - не обижайтесь, но тут этот термин как раз "к месту". Что уж, все проходили через это в той или иной мере, на 10 конкурентах и правда парится особо не стоит. С потерей невинности страх уходит, а опыт приходит лишь с годами, так что успехов.

fisher>> ну что "в общем и целом" на c/c++ будет работать в разы быстрее
Скорее на порядки быстрее, но есть еще один ньюанс. PHP в данном случае - прослойка, которая транслирует API ядра в одноименные свои команды, прослойка с неопределенной стабильностью, за которую отвечать никому не хочется. Да, PHP хорош для бизнес-логики, но никто не предлагает реализовывать всю логику на Си - все понимают что время-деньги. Так пусть будет небольшой демон-прослойка между клиентом и ПХП-логикой - это не весть какое ноу-хау, этим пользуются уж поколения, наверно =) Тем паче, что для простых задач есть прекрасные готовые прослойки.
 

ONK

Пассивист PHPСluba
fisher, по поводу разницы в производительности программ в машинном коде и интерпретируемых. С одной стороны разница очевидна и она огромна. На элементарных операциях типа i++ это до 1000 раз, с другой стороны в ПХП даже на уровне самого языка много сложных операций, уже реализованных в машинном коде. Например операции с массивами имеющими строковые индексы, которые по сути являются интерфейсом к API работы с хэш таблицами. Здесь разница будет всеголишь в разы. И наконец ПХП имеет огромное количество встроенных процедур в машинном коде доступных в виде ПХП функций, тут разница в производительности на сложных операциях может быть в пределах процентов. Соответственно оценить разницу в производительности ПХП скрипта и полного аналога в машинном коде, так, чтобы ошибиться не более чем раз в 5 - 10 это не тривиальная задача.
Если посмотреть в исходник демона чата, то видно что он использует очень много сложных ПХП операций и вызовов библиотечных подпрограм в машинном коде. Я уже писал, что самая медленная часть - это парсировка HTTP заголовков (в ПХП просто "не выведено наружу" имеющийся машинный код парсировки этих заголовков), тут много элементарных операций. Но даже при этом я оцениваю разницу в производительности с полным аналогом в машинном коде раз 15 - 20, не более, а если сравнивать с аналогом на разветвлении процессов, то разницы может и не быть.

MiksIr, спасибо за разрешение и благосклонность, но вас честно говоря скучно читать, я вам пишу конкретные доводы "почему", а вы в ответ "всё неправильно". Если у вас нет конкретных аргументов и интересных технических комментариев, то как говорится, лучше молчать чем говорить. Про неопределённую стабильность хорошо сказано, звучит приблизительно как если бы я сказал, что у языка С++ неизвестен уровень отказоустойчивости, можно кстати и про влажность упомянуть.
 

fisher

накатила суть
тут приходит полотенчег и говорит: ой чуваки я чет совсем не в теме, может пыхнем? короче, че вы собачитесь-то.

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

>>Если посмотреть в исходник демона чата
вот я бы посмотрел, кстати. это закрытая разработка?
 

cDLEON

Онанист РНРСlub
минимальный квант времени для крона - минута.
Немного заговорилсо мну =))
Ну почему, я на php.ru видел тему, где человек чат на PHP по принципу мультиплексирования сделал. Только глупо это на PHP делать, да и select - не самый лучший инструмент для таких задач.
А какой лучший ? Проверять каждый раз вручную весь пулл сокетов ? А если требуется узнать произошла ли запись в сокет в неблокирующем режиме?

Велосипедистов туда не подпускают, а за идеи писать то, что общается напрямую с клиентом на ПХП - увольняют.
Вы сами то думаете что пишете ?
У вас на ПХП общаются только с людьми, которые не хотят платить?
 

fisher

накатила суть
cDLEON
чё вы такие аггресивные. epoll, kqueue. kegel.com, короче, и поиск по опеннету. за "мну" скоро начнём отстрел ;)
 

MiksIr

miksir@home:~$
ONK, Ваши оценки производительности какими инструментами были сделаны?

-~{}~ 03.08.07 19:21:

Вы сами то думаете что пишете ?
У вас на ПХП общаются только с людьми, которые не хотят платить?
Не понял Вашего вопроса.
 

ONK

Пассивист PHPСluba
MiksIr, там написано. ab - Apache benchmark

-~{}~ 03.08.07 22:57:

algo, пропустил твой пост, именно о таком типе сервисных демонов я и говорю. Будь осторожен, щас придёт ктонибудь и скажет, что на Питоне таких вещей не пишут, потому что это велосипедостроение и не известна степень мокрости. ;)

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

MiksIr

miksir@home:~$
Там не написано, что Вы тестировали. Что отдавал апач, а что чат. В каком режиме работал апач. Хотя я, вообще то, спрашивал про Ваши оценки разницы производительности "разных ПХП функций".
...
Лан, пишите как хотите... напоминает мне разговоры типа "а зачем нужен ООП если и так можно неплохо написать".
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
А че, классический holy war получился: PHP vs C++ :)
Практического смысла 0, зато "с перчинкой".

Все-равно платформа всегда выбирается исходя из текущих знаний разработчика и экономической эффективности.
Если не знает человек C++ (как я, например) - то решение на нем писаться не будет, каким бы правильным оно ни было.
 

fisher

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

MiksIr

miksir@home:~$
grigori, согласен. Это очень верно при отсутствии готовых решений. В данном случае такие решения есть.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Автор оригинала: MiksIr
grigori, согласен. Это очень верно при отсутствии готовых решений. В данном случае такие решения есть.
Так поделитесь ими! Опубликуйте хорошее решение под LGPL - и все мы станем заниматься другими задачами, которые тоже будем публиковать.
То что у Вас лично что-то есть - это не может не радовать. Но в мире open source принят другой способ потешить свое тщеславие и получить признание - предложить миру то, что многим понравится.
Зачем словами доказывать? Дайте ссылку на код - как я :)

-~{}~ 04.08.07 17:26:

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

phprus

Moderator
Команда форума
grigori
Так поделитесь ими!
В качестве готового решения для раздачи файлов в этой теме MiksIr предлагал nginx.


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

MiksIr

miksir@home:~$
Угу, nginx(ну или lighttpd)+openssl. Если требуется не только отдавать файлы, но и опознавать клиентов со сложной PHP бизнес-логикой, то FastCGI-PHP c выдачей X-Accel-Redirect (такая фича nginx-а). О чем-то конкретном можно говорить на конкретной задаче.

-~{}~ 04.08.07 21:11:
Насчет примеров... далеко ходить не надо
http://www.php.net/manual/ru/function.socket-select.php#56241
 

ONK

Пассивист PHPСluba
MiksIr
Хотя я, вообще то, спрашивал про Ваши оценки разницы производительности "разных ПХП функций".
Ок, это мои личные оценки, основанные на моих скромных знаниях и опыте, а так-же на поверхностном изучение исходников ПХП. Я не притендую на инструментальную точность, но думаю что ошибся не более чем в 5 раз по каждому пункту.

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

ПС. Доработал демон раздачи шифровнных файлов до совместимости с ab, результаты тестов удивили.
Процессор IC2D 2ГГц
1 поток 100`000 запросов
апач 2480 запросов в секунду (ab 18% CPU apache 38% CPU)
пхп демон 2870 запросов в секунду (ab 21% CPU daemon 31% CPU)
10 потоков 100`000 запросов
апач 3415 запросов в секунду (ab 25% CPU apache 54% CPU)
пхп демон 4620 запросов в секунду (ab 33% CPU daemon 43% CPU)
50 потоков 100`000 запросов
апач 3250 запросов в секунду (ab 29% CPU apache 52% CPU)
пхп демон 4250 (4540) запросов в секунду (ab 35% CPU daemon 40% CPU)
 
Сверху