товарищи, читая твиттер, который сравнивал hello-world питона и раста https://twitter.com/playpausenstop/status/914218443443929089, решил перепроверить и дополнить https://github.com/razum2um/hello-http-bench чет результаты сильно подозрительные (в нашу сторону). ничего специально не делал, но цифры отличаются в разы. что с ними может быть не так?
@razum2um в aiohttp выруби логгер и uvloop возьми - будут сильно другие цифры.
@kxepal если честно, я не питонист, взял код из твиттера. можешь PR?
и да, логов я не вижу нигде ни в stdout ни рядом
давай
@razum2um принимай.
@kxepal улучшилось, но не намного если честно..
у меня пока главное подозрение speed-step интела, т.е. 4ghz это максимальная частота и она не мгновенно прыгает в максимум. по хорошему надо тестить на воспроизводимой машинке типа инстанса амазона (причем не t* burstable)
угу. но ожидаемо. там скорее уже в одно ядро упирается и больше не вытащить без скейла. кстати rust/clojure тоже по ядру используют?
на счет воспроизводимости мысль хорошая, но уже есть https://www.techempower.com/benchmarks/ - переизобретать не вижу смысла, если только для своих железок / кейсов.
О! кстати спасибо, на мейл-рушном капе его поминали постоянно, забыл про него опять
вообще числа выглядят вполне норм - 7к вебзапросов это ок для питона.
замечу что в clojure нету роутинга совсем.. а в питоне он есть, и достаточно тяжелый https://github.com/aio-libs/aiohttp/blob/master/aiohttp/web_urldispatcher.py. про раст не знаю
а с кложей... возможно jit сотворил чудеса. я бы поменял на отдачу чуть разных значений все время (ну хоть бы счетчик дописать в респонс)
@anjensan да, про роутер мне уже сказали
tl;dr - по тесту Serialize a object to JSON and return application/json
response. - aiohttp медленнее wsgi в несколько раз
этот бенч сильно устарел. с тех пор aiohttp получил много оптимизаций и сишный http парсер.
отлично. на скольких ядрах запускается aiohttp, rust и clojure ?
aiohttp наверное както хитро gil обходит?
aiohttp - одно. это питон все таки.
@anjensan чет добавил вывод текущих секунд с ответ rust/clj - результат немного меньше, но варьируется вокруг тех же результатов
там гил никак не обходится, просто асинхронное io. на отдаче hello-world это скорее минус, а вот когда пойдут вебсокеты, тормозные клиенты и микросервисы, то будет профит.
@razum2um так сколько у тебя ядер ?
4 & HT
@kxepal про что и реч - асинхронность даром не дается. в кложе юзается синхронный ring/jetty, про раст молчу 😃
так что сравнивать не оч корректно
это правда.
кстати тестирование тоже под вопросом. на 4х ядрах
>> 2 threads and 10 connections
да это тупо дефолт, может надо перекрутить и подольше время поставить
конечно, если выкрутить клиентов больше чем тредпул синхронных серверов то приплывем
тредпул в джетти по дефолту будет что-то около 50
да, минимум 8, макс 50 https://github.com/ring-clojure/ring/blob/master/ring-jetty-adapter/src/ring/adapter/jetty.clj#L103
кстати о hello world, вспомнилось: https://github.com/squeaky-pl/japronto (:
обещают лям за секунду отдать
@razum2um если клиентов будет больше чем тредпул - ничего не будет
ну отвалятся некоторые клиенты иногда (далеко не все). подумаешь 😉
@kxepal рискну предположить что брешут 😄
@anjensan не удивлюсь, хотя не проверял. Хотя затюниться под hello-world и выдать вау эффект не сильно большое дело. А потом долго и упорно фиксить все срезанные углы.
да, во время мейлрукапа тоже самое было с напильниками было. busy-loop например
@anjensan не понял как выкинуть роутер, все ридми aiohttp с ним, фиг с ним, с async, добавил руби, сделал по одному воркер-треду на сервер и 1 тред wrk. разница с растом конечно сократилась но расклад остался. я конечно понимаю что это бессмысленно по сути итд, но меня зацепил факт, что я не могу объяснить разницу перед тем как лезть на уровень ниже хотел убедиться, что не упускаю чего-то элементарного
@razum2um а никак ты не выкинешь роутер. хочешь быстрее - не юзай aiohttp, юзай asyncio напрямую 😃
а вообще Python - тормозное и унылое 😉
@anjensan да я забил на питон, а вот на руби/кложе пишу и растом активно интересуюсь
и практически не сомневался утром, что кложа сольет расту, хотел просто посмотреть насколько
ну руби не лучше питона 🙂 кста -- я бы еще глянул на результаты с pypy 😉
@razum2um можешь ради интереса запустить на своем железе https://github.com/anjensan/hello-http-bench/commit/21ca0d10e13ca6b63eb04b64c13df67c333b4432 - "классический вариант" (синхронный на WSGI)
@anjensan ты бы еще на сокетах написал (;
@kxepal а что не так то 😉 ?
ну можно это дело на chуrrypy запустить конечно, числа будут поменьше
ну это уже оптимизация ради оптимизации.
Наткнулся на либу типа клары, только кажется более кложуристую на мой взгляд: https://github.com/CoNarrative/precept
@rustam.gilaztdinov самый классический пример сессии в движке правил - пациент с симптомами, на основании которых назначается и исключается лечение
потому что написать универсальную ветвистую ифочку для всех комбинаций сыпи/температуры/боли/аллергий/уже принимаемых препаратов/и тд. – "проблематично"
Да, теперь понятно, спасибо!
но простите - на clojure мы юзаем jetty (на чисто джаве). на ruby - юзаем puma, где 15% C-шного кода...
и это не оптимизация - это минимальный web-helllo-world на python в стандарте WSGI. который можно зпустить в uwsgi, twisted, cherrypy, etc...
ну только если так.
ну и если что >> Ring is a Clojure web applications library inspired by Python's WSGI and Ruby's Rack.
так что имхо вполне честно сравнивать прилагу на Ring и wsgi-аппликейшен
кажется это обёртка над кларой
@razum2um если что парамтр -p - сколько змей запускать. так что можно несколько запустить и и забыть про GILы
да, я понял, uwsgi поддерживаю
@anjensan только почему то аномально низкий результат вышел. ты сам запускал?
во первых, там в ридми байты, ты как я понимаю .encode() забыл..
во вторых у меня
> [uwsgi-http] unable to connect() to node “127.0.0.1:58755” (0 retries): Operation timed out
при том, что я запустил 8 процессов и wrk -c 8 -t 1
запускал, но не сравнивал с aiohttp (нету py 3.5)
@anjensan на 2ке значит? и? у меня прям аномально низкие результаты
Привет! Кто как в clojure делает формы для админок? Будет ли интересно следующее? Ключевой момент. Все это для backend. Программис не пришет ни строчки фронтенда. 1. В html вставили js скрипт из cdn 2. Написали clojure.spec для данных формы, или взяли существующую 3. Поставили из jar пакет, который из спеки делает описание формы 4. Дополнили это описание названиями заголовков, указали тип виджетов и прочие настройки 5. Передали в функцию из пакета описание формы и сами данные, получили кусок html, для вставки на страницу Т.е. форма на js с виджетами селекта, селекта даты, селекта с автокомплитом, поддержка cljojure типов, вроде keyword, и т.п. Программист не пишиет сам js/cljs/css совсем. Для валидации даннные отпраляются на сервер. Возможно будет некий адаптив, что бы оно прилично вписалось в дизайн страницы. Насколько вам больно делать формы? Нужно ли это? Полезно ли подобное для других языков? puthon, erlang, node.js, ruby
байты - да. нужно возвращать байты, нужен .encode
попробуй еще pip install gunicorn gunicorn -w 8 hello-http-python:application
encode будет лишним. b'Hello world'
у меня он быстрее uwsgi почти в 2 раза
@kxepal там еще число дофигачивается
gunicorn кстати вроде на чистом python если что 🙂
погоди, ты юникорном отскейлили свое приложение по ядрам - оно естественно будет быстрее (:
@kxepal так uwsgi я тоже скейлил по ядрам
а раст/кложа тоже все ядра юзают?
конечн
python тоже какбы все ядра юзает. просто у него в самом сердце сидит такой нехороший мьютекс... который всю малину портит 🙂
так что формально - питон юзает все ядра, мьютекс то ведь не в счет
@anjensan если не сложно запости результат питончика в сравнении с любым другим по выбору. у меня что uswgi что gunicorn не больше 500 rps (пробовал уже и --enable-threads и разную конфигурацию wrk, и на том компе где остальное, и на макбуке дома.. понимаю, херня какая-то)
@kuzmin_m если чесно я не понял, что за 5 пунктов? если тебе нужна библиотека компонентов, то я точно помню, кто-то спаривал бутстрап, недавно видел вот такую имхо приятную на вид вещь https://priornix.github.io/antizer/latest/examples/reagent.html
речь не про компоненты, но за ссылку спасибо. речь про то, что бы по спеке генерить форму
и не писать js и css
@razum2um или непонятно?
ну последнее то библиотеки компонентов+css-бандлы решают. вот кстати бутстрап http://yogthos.github.io/reagent-forms-example.html
автор, кстати наш, Сотников, тут сидит
т.е. что осталось - это из схемы получить hiccup-style структуру?
тебе нужно руками собрать форму из компонентов, конвертировать типы, т.е. были кейворды, а в форму нужно передать строки
давай пока не спускаться к реализации
я. понял, чуть выше уровнем, да интересно
т.е. не нужен компилятор cljs
не нужно стили писать
одну js происал
ну как jquery_ujs
что бы ссылки аяксом отправлялись
чет запутался. какая цель?
вроде js, но js писать не надо
поправь если я сейчас брежу
делать сложные формы без js/cljs
без - в смысле без участия программиста
допустим (только для упрощения) у нас была бы акторная модель по актору на пользователя и ты хочешь, чтобы данные с формы магически оказывались с правильными типами в акторе на беке?
нет, кажется я тебя не понимаю
чет не то
убрал лимит по тредам из clojure. югикор запустил с 8 воркерами (у мну 6 физ ядер). тестил при помощи ab -n 500000 -c 100, результаты gunicorn: 14135 rps clojure: 14500 rps
ты делаешь админку
на clojure
вернее проект
а ему нужна админка
нужно делать формы
хочется не просто обычные инпуты и текстарии
а выбор дат
загрузку файлов
автокомплит
для этого нужно js писать
ну или cljs
виджеты выбирать
а по факту у нас все есть
есть spec, из которой можно высасать структуру формы
и типы
есть транзит
в который можно сериализовать данные формы
итого по спеке генерится описание это описание патчится руками ну был у тебя в спеке (s/def ::password string?)
а ты хочешь, что бы у тебя в форме звездочки были вместо символов
нужно как раз указать в описании формы, что нужен виджет "пароль"
и заголовок на русском указать
например https://github.com/Day8/re-com/ http://re-demo.s3-website-ap-southeast-2.amazonaws.com/#/date
я про это
нет
я про декларативную форму
да, я понял, чтобы схемой
а ты про виджеты
какие там будут виджеты - пока не важно
т.е. насколько больно далать формы?
и будет ли востребован такой подход?
на мой взгляд - это интересно
но насколько это важно?
мне лично тяжело сказать, года 2 назад у меня был чистый cljs, тогда еще схемы не было, был om+sablono, чего-то более декларативного не хотелось. html это вполне декларативно. но далеко от бизнес логики, да
последнее время все clj на беке как апишка
давай еще объясню
я считаю, что делать js/cljs очень дорого
очень
дешевле рендерить на сервере
и писать на сервере
а вон оно че к чему ujs. ты про form :remote скорее?
но на сервере ты не сделаешь крутые виджеты
ну типа, т.е. не пишется js совсем
ну или как cocoon сделан
для вложенных форм
ты на сервер сгенерировал html, а он его подцепил и сделал возможность добавлять/удалять вложенные формы
а программист js не пишет при этом
только подключает js из гема
мм, хз. я последнее время склоняюсь к умным spa клиентам (конечно от проектов зависит, у меня так), но фронт пока это redux или мобилка RN с тем же redux, поэтому уносить что-то кроме логики на сервер не хочется, чем больше клиент может тем лучше имхо
мы говорим про админки
или подобное админкам
понятно, что бывают случаи, когда без SPA вообще никак
да, кстати, что именно дорого? (js->clj)
?
разрабатывать
то что ты манипулируешь данными в clj
и то что ты тащишь компилятор, рпел
и другую парадигму разработки
это еще тестировать как бы надо)
короче, сделать, чтобы бек быстро накидывал админки, т.е. скорее опять вернулись к simple_form (если думать гибко и не рождать АА) так?
не к simple_form
ты там описываешь структуру отедльно от данных
а можно это описание генерировать из спеки
и что такое AA? 😃
тогда всетаки ActiveAdmin (AA)? (если с прищуром принять схему базы за схему данных)
я не работал с AA
наверное
похоже
в общем цель чтобы бек быстро накидал админку хорошая, но почему такой изврат тогда? почему не генерить html на сервере постаринке
как вложенные формы делать?
там js нужен
как автокплит делать с поиском на сервере?
тоже js и ajax
простого html не хватает для форм
не прошло и 94 сообщения и я понял все 😄
как файлы прикреплять?
ура! 😃
может я криво изначально написал?
да. перепиши, плиз, чтобы цель была сверху и что “не пишиет сам js/cljs/css” это не оптимизация усилий фронта, а имено для бека, конкретные шаги можно спрятать, ибо спорно (сколько чего где делать) 🙂
гет соточки! хорошие сегодня треды
добавил
короче засада наверное в том, что это была 1) макось с настройками не для бенча 2) премия лучшего растамана среди кложуристов не достанется никому, ибо я тестил нерелизный билд 🤦 справедливость восстановлена для раста и такого сишного-пресишного 🙂 вебсервера в рубях. всем спасибо мир вернулся на место
@andrewtropin а расскажи, пожалуйста, про эти самые правила? я не встречал, хочу понять юз-кейс, с ходу не очень ясно :dafuq:
@kuzmin_m Я видел такое пару раз (не на clojure) и это жило ровно до того момента, пока не требовалось каких-то специальных контролов на клиенте. А после этого либо всё целиком сносилось и переносилось на клиента (в лучшем случае), либо окружалось кучей хаков (в худшем).
Precept wraps Clara, a ground-up implementation of the Rete algorithm in Clojure and Clojurescript.
тут как раз специальные контролы на клиенте что мешает сделать подключаемые виджеты? @dottedmag есть какой-то конкретный пример? была такая-то форма, сделали так-то, стало нужно вот это, не получилось потому-то
@kuzmin_m Навскидку нет, всё осталось в древности.
там изначально были какие-то виджеты на js изначально?
т.е. в моей идее виджеты как раз на js
а сервер отдает описание формы в виде данных
и там указывается какой виджет использовать
да. и всё это поломалось тогда, когда форму не получилось стыковать из элементов, а потребовались какие-то связи между ними.
например так: было 2 поля start_date end_date было 2 инпута стал нужен один инпут для интервала?
Я уже не помню деталей
@anjensan и напоследок я немного упоролся затачивая кложу под latency, если будет время и желание из спортивного интереса - попробуй что-нить еще сделать? yourkit tracing мне показывает, что сейчас уперлись в основном в jetty.HttpOutput.close…
перезапустил дома - clojure (tutorial) 81Krps, для uwsgi/py3 - 35Krps
короче undertow и все