"Быстротвечающее" веб-приложение на чем сейчас модно писать?

Нужно минимизировать скорость ответа и нагрузку на сервер.
Приложение — простейшее, ближайший аналог — баннеропоказывалка (т.е. нужно сделать запись туда сюда, авторизировать юзера возможно, определить какой код баннер отдавать и отдать его).
На php код занимает строк 100, но nginx/apache=>php или даже phpdaemon — не айс по нагрузке получается, поэтому хочется перевести на что-то другое.
На чем это сейчас делают? Основное — безглючность и скорость ответа, а так же что бы нормально работало по http с браузерами без проблем.
Была мысль написать на си, но вроде нужен будет вебсервер все равно? Это опять же кажется лишним. node.js тут применим? Если да, то насколько он уже безглючен и шустр и опять же — нужен ли ему вебсервер? Еще какие-то альтернативы? Если к ответу будет прилагаться ссылка на хороший туториал и аргументы — вообще замечательно.
22 февраля в 23:09
6
edogs 15,1
Ruby! RoR! мануалов по развертыванию простых рельсов полно. No_Time,
Мало информации. Сколько именно неидентичных вызовов в секунду на пиках? Скрипт файлы читает или делает file_exists/is_readable? APC или другие акселераторы использвоали? Как определяется баннер, какие операции выполняет скрипт, пишет ли он в базу данных? Кешируются ли результаты выборок в памяти? Возможно ли взглянуть на эти 100 строк? Stdit,
Скрипт не строгая константа, он может меняться, но крупным по идее никогда не станет, строки к сожалению не показать.
Акселератор стоит — zend. Сейчас чтения/записи файлов нет, но 90% что будет (файлы не больше 100кб разовое чтение/запись + plain лог файл на запись). mysql используется — чтение/запись — его время работы более чем устраивает, под кэш стоит memcached (есть желание отказаться, т.к. выигрыш от него порядка 5% всего). Баннер на 50% определяется выборкой из БД, на 50% алгоритмом в пхп коде. Сейчас 98% времени и 75% потребления памяти это вебсервер+пхп, и именно эти параметры хочется урезать в 3-4 раза.
edogs,
При таком подходе пхп не может отжирать 98% времени. Вот прямо сейчас сделал три теста (Сервер: amazon micro instance за $14 в месяц, nginx + php-fpm + APC (apc.stat=0), http кеш отсутствует, ab -n 1000 -c 10:
Простой скрипт c выводом разного контента, Requests per second: 2735.13
Тот же скрипт с файловой операцией (file_put_contents с FILE_APPEND) Requests per second: 2607.34
Тот же с запросом (mysql_pconnect, select 1 из 50000 по ID) Requests per second: 1686.14
Скрипт с инсертом в MyISAM вместо запроса Requests per second: 1729.98
Есть вероятность, что проблема не в языке. Если я всё-таки не прав, то наверное остаётся только написать что-то своё, маленькое и бинарное.
Stdit,
>Скрипт с инсертом в MyISAM вместо запроса
у php есть паршивая особенность в FastCGI режиме. он каждый раз запускает скрипт с нуля. нельзя раз запустится, инициализировать библиотеки, открыть соединения, и войти в цикл обработки запросов.
в вашем примере каждый раз устанавливается соединение с базой и парсится запрос.
shagguboy,
При таком подходе пхп не может отжирать 98% времени
Не пхп, а «вебсервер+пхп». Если чисто микротаймом пхп замерять, будет 80/20 соотношение где-то. Но пхп еще надо запустить, вебсервер должен висеть пока пхп обрабатывает и т.д.
edogs,
Соединение каждый раз не устанавливается (persistant connection). Скрипт один раз читается с диска и собирается в байткод, в дальнейшем берётся из памяти с запускается сразу. Вебсервер не «висит», пока обрабатывается запрос — fpm можно запустить в нужное контроллируемое количество потоков. Какое количество запросов в секунду вы имеете сейчас и какого хотели бы достичь? Stdit,

отсортировано по дате по оценке
ответы (17)

+3
TheHorse #
> Была мысль написать на си, но вроде нужен будет вебсервер все равно?
Если впилить веб-сервер, например посредством использования каких-то модулей (куча таких), то доп. веб-сервер, очевидно, не нужен.
Я бы на Си делал.
Спасибо. Можете придать направление в плане «впиливания вебсервера»? Что бы не создавать отдельный опросник «какой впиливать лучше, какие плюсы/минусы»?:) edogs, 23 февраля в 00:49
не могу, не в теме)). Я бы сам писал. По сути это строк 50-100, если только нужно юзать с HTTP. TheHorse, 23 февраля в 00:54
*только нужное TheHorse, 23 февраля в 03:50
Прекрасный выбор ;)
А все-таки не поделитесь «какой впиливать лучше»?
savostin, 24 февраля в 11:09
Пока разбираемся:)
Вообще жалко что нельзя 2 решения пометить решениями, т.к. кроме сишного варианта обязательно будет и node.js.
edogs, 24 февраля в 15:05
+4
SowingSadness #
Вообще, если критична скорость, а приложение маленькое, то проще написать несколько вариантов и выбрать под свою задачу конкретную реализацию.

Попробуйте использовать чистый node.js

Про разворачивание и безглючность, поисковик вам в помощь ()странно, что вы про это тут спрашиваете, а не сразу поискали)

Про RoR не слушайте, вам тут framework'и вообще не помощники.
Несколько вариантов — да, отличная мысль, спасибо. Пока кандидаты си и node.js.
По поводу безглючности node.js — сильно разные отзывы и с разными датами, поэтому хотелось отдельно уточнить.
edogs, 23 февраля в 00:51
Node.js Is Bad Ass Rock Star Tech nuit, 23 февраля в 08:44
+2
bost84 #
Писать надо не на том на чем модно, а на том что максимально качественно и быстро выполнит поставленную задачу.
100 строк — это много. Скорее всего ваше приложение не оптимально написано.
Что же касается быстродействия php+apache+nginx вполне может подойти.
Но вы не уточнили какая будет нагрузка, хотя бы примерно. Для проектирования это пригодиться.
Какими ресурсами вы обладаете для текущей нагрузки вы тоже не сообщили.
Если сильно высоконагруженное то используйте кэши nginx, mysql (если используется).
не брезгуйте использовать оперативную память для хранения кэшей и самих скриптов, да и статики.
Но не забывайте что есть предел минимальной скорости ответа.
0
Claud #
Попробуйте на Go если кода не много, то будет самое то.
0
egorinsk #
Ява или Си++
+2
easyman #
На том, на котором вы умеете пользоваться ассинхронностью и многопоточностью.
0
alekciy #
А автор уверен, что причина неудовлетворительной работы это php, а не сам код? Я не в попытке обидеть, просто обращаю внимание на то, что переход на новую платформу может проблемы не решить, если дело в этом.

Народ с plus1.wapstart.ru занимается бенер-крутилками под мобильные платформы у них порядка 50 миллионов хитов в сутки и крутиться оно на PHP как бэкэнд. Бэкэнд серверов конечно несколько, но вот бэкэнд с базой один мастер + один слава. В секунду могут до 1000 запрошов шпарить. Так что цифры для указанной платформы вполне достижимые.
А с каких пор 1000req/s стало «быстро»? bondbig, 23 февраля в 09:41
А рунете так много проектов на которых есть более 86 миллионов хитов в сутки? Безусловно есть ряд в которых эта цифра сильно больше, но я не думаю, что топик-стартер представитель вконтакте, яндекса или рамблера. alekciy, 23 февраля в 18:34
Так это «баннерокрутилка», а не сайт. 1000 сайтов по 8 тысяч хитов в сутки, и вот уже есть проблема. 8 тысяч, а не 86, т.к. нагрузка не плавно размазывается + сервер не должен быть больше чем наполовину нагружен, вот и получается что скорость нужна хорошая. edogs, 24 февраля в 03:51
Причет тут 1000 сайтов? В первоначальной формулировке задачи фигурировало 1000 сайтов? Нет. Напоминаю: «ближайший аналог — баннеропоказывалка». alekciy, 24 февраля в 05:47
Дык баннеропоказывалка же, а не сайт. Баннерная сеть типа. Обычно баннеры ставят на много сайтов и поэтому показываются они тоже на многих сайтах. Честно говоря было ощущение, что это понятно. Но Вы правы, некоторая двусмысленность действительно есть. edogs, 24 февраля в 15:05
А где в начальном топике указано про много сайтов? О_о Баннеропоказывалка вовсе не означает баннерная сеть. Знаю множество баннерокрутилок которые работают на благо одного ресурса. К примеру, на всех популярных ресурсах, включая и хабр, баннерокрутилки свои и работают они на благо одного ресурса.

Для отдачи рекламы на много сайтов есть баннерные сети.
alekciy, 24 февраля в 22:58
Под баннеропоказывалкой, согласно Вашей терминологии, мы имели ввиду баннерную сеть.
Еще раз извините если смутили неточностью формулировок.
edogs, 25 февраля в 03:00
+2
Mox #
Похоже на область применения для node.js

Rails сюда лучше не пихать, может только как прототип для отладки стратегий показа, который потом переписывать на чем-то другом

Раньше я писал такую штуку на C++, но с тех пор многое поменялось — я бы уже не стал связываться со столь низкоуровневыми вещами.

И еще — нужен будет хороший админ — тюнить TCP/IP
>Раньше я писал такую штуку на C++, но с тех пор многое поменялось — я бы уже не стал связываться со столь низкоуровневыми вещами.
Да, с тех пор Modern C++ стал таким же высокоуровневым как Java или C#.
nuit, 23 февраля в 08:49
+3
MpaK999 #
Пишите на том, что лучше всего знаете: Ruby возьмите Cramp, Goliath; для Python — Tornado или Twisted; JS — ExpressJS или Node.js

Язык тут не тормозит если приложение уже собрано и висит в памяти.
100 строк кода это не так много и надо будет, перепишите.
+5
homm #
Что-то мне кажется что дело не в языке, а в тех самых 100 строках. Ну и плюс апачь нужно выкидывать без сожаления.
+1
garfik #
Я думаю если грамотно написать на Node.JS, и всегда и везде где возможно использовать асинхронные вызовы, не терять VAR'ы и тд и тп — проблем не будет. Главное осторожнее использовать готовые модули, так как там вполне себе может попасться синхронный код, который испортит всю радость от использования.
–3
ArturSitnikoff #
Может haXe?
+4
LavrenovNN #
Erlang
0
sergeypid #
Если Python, то посмотри Twister
Асинхронный фреймворк называется Twisted. А twister — это напольная игра для вечеринок, чтобы, отвлёкшись от пьянства, полапать девушек за ножки. cadmi, 23 февраля в 19:48
–1
Anonym #
Не верю, что nginx + php не выдержат нагрузки. Такая связка не сильно проиграет серверу на C++.
+1
seriyPS #
Я бы на Erlang сделал. Сейчас очень шустрый веб-сервер для него сделали — Cowboy. Опять-же, с надежностью и отказоустойчивостью тут очень хорошо.
Если логики не очень много то можно получить производительность не многим хуже чем в C но при этом отличную надежностть, распараллеливаемость по ядрам и удобство отладки.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.