Fork me on GitHub
#clojure-russia
<
2017-10-02
>
razum2um09:10:25

товарищи, читая твиттер, который сравнивал hello-world питона и раста https://twitter.com/playpausenstop/status/914218443443929089, решил перепроверить и дополнить https://github.com/razum2um/hello-http-bench чет результаты сильно подозрительные (в нашу сторону). ничего специально не делал, но цифры отличаются в разы. что с ними может быть не так?

kxepal09:10:37

@U04V1HS2L в aiohttp выруби логгер и uvloop возьми - будут сильно другие цифры.

razum2um10:10:35

@U050HDACA если честно, я не питонист, взял код из твиттера. можешь PR?

razum2um10:10:11

и да, логов я не вижу нигде ни в stdout ни рядом

kxepal10:10:26

давай

kxepal10:10:20

@U04V1HS2L принимай.

razum2um10:10:40

@U050HDACA улучшилось, но не намного если честно..

razum2um10:10:37

у меня пока главное подозрение speed-step интела, т.е. 4ghz это максимальная частота и она не мгновенно прыгает в максимум. по хорошему надо тестить на воспроизводимой машинке типа инстанса амазона (причем не t* burstable)

kxepal10:10:44

угу. но ожидаемо. там скорее уже в одно ядро упирается и больше не вытащить без скейла. кстати rust/clojure тоже по ядру используют?

kxepal10:10:46

на счет воспроизводимости мысль хорошая, но уже есть https://www.techempower.com/benchmarks/ - переизобретать не вижу смысла, если только для своих железок / кейсов.

razum2um10:10:38

О! кстати спасибо, на мейл-рушном капе его поминали постоянно, забыл про него опять

anjensan10:10:51

вообще числа выглядят вполне норм - 7к вебзапросов это ок для питона.

anjensan10:10:37

замечу что в clojure нету роутинга совсем.. а в питоне он есть, и достаточно тяжелый https://github.com/aio-libs/aiohttp/blob/master/aiohttp/web_urldispatcher.py. про раст не знаю

anjensan10:10:57

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

razum2um10:10:58

@U6VVC5CTZ да, про роутер мне уже сказали

anjensan10:10:31

tl;dr - по тесту Serialize a object to JSON and return application/json response. - aiohttp медленнее wsgi в несколько раз

kxepal10:10:34

этот бенч сильно устарел. с тех пор aiohttp получил много оптимизаций и сишный http парсер.

anjensan10:10:20

отлично. на скольких ядрах запускается aiohttp, rust и clojure ?

anjensan10:10:41

aiohttp наверное както хитро gil обходит?

kxepal10:10:54

aiohttp - одно. это питон все таки.

razum2um10:10:58

@U6VVC5CTZ чет добавил вывод текущих секунд с ответ rust/clj - результат немного меньше, но варьируется вокруг тех же результатов

kxepal10:10:40

там гил никак не обходится, просто асинхронное io. на отдаче hello-world это скорее минус, а вот когда пойдут вебсокеты, тормозные клиенты и микросервисы, то будет профит.

anjensan10:10:43

@U04V1HS2L так сколько у тебя ядер ?

anjensan10:10:17

@U050HDACA про что и реч - асинхронность даром не дается. в кложе юзается синхронный ring/jetty, про раст молчу 😃

anjensan10:10:22

так что сравнивать не оч корректно

kxepal10:10:52

это правда.

anjensan10:10:16

кстати тестирование тоже под вопросом. на 4х ядрах

anjensan10:10:18

>> 2 threads and 10 connections

razum2um10:10:51

да это тупо дефолт, может надо перекрутить и подольше время поставить

razum2um10:10:28

конечно, если выкрутить клиентов больше чем тредпул синхронных серверов то приплывем

anjensan10:10:46

тредпул в джетти по дефолту будет что-то около 50

kxepal10:10:22

кстати о hello world, вспомнилось: https://github.com/squeaky-pl/japronto (:

kxepal10:10:36

обещают лям за секунду отдать

anjensan11:10:01

@U04V1HS2L если клиентов будет больше чем тредпул - ничего не будет

anjensan11:10:25

ну отвалятся некоторые клиенты иногда (далеко не все). подумаешь 😉

anjensan11:10:14

@U050HDACA рискну предположить что брешут 😄

kxepal11:10:52

@U6VVC5CTZ не удивлюсь, хотя не проверял. Хотя затюниться под hello-world и выдать вау эффект не сильно большое дело. А потом долго и упорно фиксить все срезанные углы.

razum2um11:10:21

да, во время мейлрукапа тоже самое было с напильниками было. busy-loop например

razum2um12:10:33

@U6VVC5CTZ не понял как выкинуть роутер, все ридми aiohttp с ним, фиг с ним, с async, добавил руби, сделал по одному воркер-треду на сервер и 1 тред wrk. разница с растом конечно сократилась но расклад остался. я конечно понимаю что это бессмысленно по сути итд, но меня зацепил факт, что я не могу объяснить разницу перед тем как лезть на уровень ниже хотел убедиться, что не упускаю чего-то элементарного

anjensan12:10:03

@U04V1HS2L а никак ты не выкинешь роутер. хочешь быстрее - не юзай aiohttp, юзай asyncio напрямую 😃

anjensan12:10:17

а вообще Python - тормозное и унылое 😉

razum2um12:10:53

@U6VVC5CTZ да я забил на питон, а вот на руби/кложе пишу и растом активно интересуюсь

razum2um12:10:32

и практически не сомневался утром, что кложа сольет расту, хотел просто посмотреть насколько

anjensan12:10:22

ну руби не лучше питона 🙂 кста -- я бы еще глянул на результаты с pypy 😉

anjensan13:10:20

@U04V1HS2L можешь ради интереса запустить на своем железе https://github.com/anjensan/hello-http-bench/commit/21ca0d10e13ca6b63eb04b64c13df67c333b4432 - "классический вариант" (синхронный на WSGI)

kxepal13:10:59

@U6VVC5CTZ ты бы еще на сокетах написал (;

anjensan13:10:18

@U050HDACA а что не так то 😉 ?

anjensan13:10:43

ну можно это дело на chуrrypy запустить конечно, числа будут поменьше

kxepal13:10:25

ну это уже оптимизация ради оптимизации.

anjensan13:10:28

но простите - на clojure мы юзаем jetty (на чисто джаве). на ruby - юзаем puma, где 15% C-шного кода...

anjensan13:10:33

и это не оптимизация - это минимальный web-helllo-world на python в стандарте WSGI. который можно зпустить в uwsgi, twisted, cherrypy, etc...

kxepal13:10:09

ну только если так.

anjensan13:10:45

ну и если что >> Ring is a Clojure web applications library inspired by Python's WSGI and Ruby's Rack.

anjensan13:10:04

так что имхо вполне честно сравнивать прилагу на Ring и wsgi-аппликейшен

anjensan13:10:51

@U04V1HS2L если что парамтр -p - сколько змей запускать. так что можно несколько запустить и и забыть про GILы

razum2um13:10:39

да, я понял, uwsgi поддерживаю

razum2um13:10:09

@U6VVC5CTZ только почему то аномально низкий результат вышел. ты сам запускал?

razum2um13:10:26

во первых, там в ридми байты, ты как я понимаю .encode() забыл..

razum2um13:10:32

во вторых у меня > [uwsgi-http] unable to connect() to node “127.0.0.1:58755” (0 retries): Operation timed out при том, что я запустил 8 процессов и wrk -c 8 -t 1

anjensan13:10:40

запускал, но не сравнивал с aiohttp (нету py 3.5)

razum2um13:10:44

@U6VVC5CTZ на 2ке значит? и? у меня прям аномально низкие результаты

anjensan13:10:40

байты - да. нужно возвращать байты, нужен .encode

anjensan13:10:56

попробуй еще pip install gunicorn gunicorn -w 8 hello-http-python:application

kxepal13:10:26

encode будет лишним. b'Hello world'

anjensan13:10:42

у меня он быстрее uwsgi почти в 2 раза

anjensan13:10:54

@U050HDACA там еще число дофигачивается

anjensan13:10:29

gunicorn кстати вроде на чистом python если что 🙂

kxepal13:10:32

погоди, ты юникорном отскейлили свое приложение по ядрам - оно естественно будет быстрее (:

anjensan13:10:49

@U050HDACA так uwsgi я тоже скейлил по ядрам

kxepal13:10:43

а раст/кложа тоже все ядра юзают?

anjensan13:10:47

конечн

anjensan13:10:53

python тоже какбы все ядра юзает. просто у него в самом сердце сидит такой нехороший мьютекс... который всю малину портит 🙂

anjensan13:10:14

так что формально - питон юзает все ядра, мьютекс то ведь не в счет

razum2um14:10:28

@U6VVC5CTZ если не сложно запости результат питончика в сравнении с любым другим по выбору. у меня что uswgi что gunicorn не больше 500 rps (пробовал уже и --enable-threads и разную конфигурацию wrk, и на том компе где остальное, и на макбуке дома.. понимаю, херня какая-то)

anjensan14:10:57

убрал лимит по тредам из clojure. югикор запустил с 8 воркерами (у мну 6 физ ядер). тестил при помощи ab -n 500000 -c 100, результаты gunicorn: 14135 rps clojure: 14500 rps

razum2um15:10:33

короче засада наверное в том, что это была 1) макось с настройками не для бенча 2) премия лучшего растамана среди кложуристов не достанется никому, ибо я тестил нерелизный билд facepalm справедливость восстановлена для раста и такого сишного-пресишного 🙂 вебсервера в рубях. всем спасибо мир вернулся на место

razum2um22:10:15

@U6VVC5CTZ и напоследок я немного упоролся затачивая кложу под latency, если будет время и желание из спортивного интереса - попробуй что-нить еще сделать? yourkit tracing мне показывает, что сейчас уперлись в основном в jetty.HttpOutput.close…

anjensan22:10:04

перезапустил дома - clojure (tutorial) 81Krps, для uwsgi/py3 - 35Krps

razum2um23:10:25

короче undertow и все

andrewtropin13:10:26

Наткнулся на либу типа клары, только кажется более кложуристую на мой взгляд: https://github.com/CoNarrative/precept

andrewtropin13:10:32

кажется это обёртка над кларой

rustam.gilaztdinov15:10:05

@U0EJUF3KQ а расскажи, пожалуйста, про эти самые правила? я не встречал, хочу понять юз-кейс, с ходу не очень ясно dafuq

dragoncube18:10:54

Precept wraps Clara, a ground-up implementation of the Rete algorithm in Clojure and Clojurescript.

andrewtropin06:10:05

Идея на сколько я понимаю простая: пишешь правила вида если произошло это событие, то сделай это. Потом начинаешь сессию и в эту сессию накидываешь события (факты). Соответственно триггерятся разные штуковины. Интерес конкретно данной либы, что тут факты как в датомике, а не рекордами как в кларе (под капотом они всё равно рекорды думаю, но тем не менее)

misha10:10:33

@U0NBJDK4N самый классический пример сессии в движке правил - пациент с симптомами, на основании которых назначается и исключается лечение

misha10:10:51

потому что написать универсальную ветвистую ифочку для всех комбинаций сыпи/температуры/боли/аллергий/уже принимаемых препаратов/и тд. – "проблематично"

rustam.gilaztdinov12:10:02

Да, теперь понятно, спасибо!

kuzmin_m13:10:26

Привет! Кто как в 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

razum2um14:10:08

@kuzmin_m если чесно я не понял, что за 5 пунктов? если тебе нужна библиотека компонентов, то я точно помню, кто-то спаривал бутстрап, недавно видел вот такую имхо приятную на вид вещь https://priornix.github.io/antizer/latest/examples/reagent.html

kuzmin_m14:10:34

речь не про компоненты, но за ссылку спасибо. речь про то, что бы по спеке генерить форму

kuzmin_m14:10:46

и не писать js и css

kuzmin_m14:10:34

@U04V1HS2L или непонятно?

razum2um14:10:54

ну последнее то библиотеки компонентов+css-бандлы решают. вот кстати бутстрап http://yogthos.github.io/reagent-forms-example.html

razum2um14:10:16

автор, кстати наш, Сотников, тут сидит

razum2um14:10:41

т.е. что осталось - это из схемы получить hiccup-style структуру?

kuzmin_m14:10:47

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

kuzmin_m14:10:05

давай пока не спускаться к реализации

razum2um14:10:07

я. понял, чуть выше уровнем, да интересно

kuzmin_m14:10:32

т.е. не нужен компилятор cljs

kuzmin_m14:10:37

не нужно стили писать

kuzmin_m14:10:47

одну js происал

kuzmin_m14:10:00

ну как jquery_ujs

kuzmin_m14:10:11

что бы ссылки аяксом отправлялись

razum2um14:10:15

чет запутался. какая цель?

kuzmin_m14:10:22

вроде js, но js писать не надо

razum2um14:10:39

поправь если я сейчас брежу

kuzmin_m14:10:39

делать сложные формы без js/cljs

kuzmin_m14:10:54

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

razum2um14:10:15

допустим (только для упрощения) у нас была бы акторная модель по актору на пользователя и ты хочешь, чтобы данные с формы магически оказывались с правильными типами в акторе на беке?

razum2um14:10:49

нет, кажется я тебя не понимаю

kuzmin_m14:10:50

чет не то

kuzmin_m14:10:58

ты делаешь админку

kuzmin_m14:10:03

на clojure

kuzmin_m14:10:16

вернее проект

kuzmin_m14:10:25

а ему нужна админка

kuzmin_m14:10:34

нужно делать формы

kuzmin_m14:10:54

хочется не просто обычные инпуты и текстарии

kuzmin_m14:10:01

а выбор дат

kuzmin_m14:10:08

загрузку файлов

kuzmin_m14:10:15

автокомплит

kuzmin_m14:10:25

для этого нужно js писать

kuzmin_m14:10:29

ну или cljs

kuzmin_m14:10:36

виджеты выбирать

kuzmin_m14:10:45

а по факту у нас все есть

kuzmin_m14:10:01

есть spec, из которой можно высасать структуру формы

kuzmin_m14:10:03

и типы

kuzmin_m14:10:10

есть транзит

kuzmin_m14:10:18

в который можно сериализовать данные формы

kuzmin_m14:10:52

итого по спеке генерится описание это описание патчится руками ну был у тебя в спеке (s/def ::password string?)

kuzmin_m14:10:12

а ты хочешь, что бы у тебя в форме звездочки были вместо символов

kuzmin_m14:10:32

нужно как раз указать в описании формы, что нужен виджет "пароль"

kuzmin_m14:10:39

и заголовок на русском указать

kuzmin_m14:10:43

я про это

kuzmin_m14:10:22

я про декларативную форму

razum2um14:10:24

да, я понял, чтобы схемой

kuzmin_m14:10:29

а ты про виджеты

kuzmin_m14:10:42

какие там будут виджеты - пока не важно

kuzmin_m14:10:00

т.е. насколько больно далать формы?

kuzmin_m14:10:13

и будет ли востребован такой подход?

kuzmin_m14:10:20

на мой взгляд - это интересно

kuzmin_m14:10:26

но насколько это важно?

razum2um14:10:04

мне лично тяжело сказать, года 2 назад у меня был чистый cljs, тогда еще схемы не было, был om+sablono, чего-то более декларативного не хотелось. html это вполне декларативно. но далеко от бизнес логики, да

razum2um14:10:24

последнее время все clj на беке как апишка

kuzmin_m14:10:40

давай еще объясню

kuzmin_m14:10:53

я считаю, что делать js/cljs очень дорого

kuzmin_m14:10:16

дешевле рендерить на сервере

kuzmin_m14:10:20

и писать на сервере

razum2um14:10:10

а вон оно че к чему ujs. ты про form :remote скорее?

kuzmin_m14:10:18

но на сервере ты не сделаешь крутые виджеты

kuzmin_m14:10:35

ну типа, т.е. не пишется js совсем

kuzmin_m14:10:50

ну или как cocoon сделан

kuzmin_m14:10:57

для вложенных форм

kuzmin_m14:10:27

ты на сервер сгенерировал html, а он его подцепил и сделал возможность добавлять/удалять вложенные формы

kuzmin_m14:10:41

а программист js не пишет при этом

kuzmin_m14:10:59

только подключает js из гема

razum2um14:10:53

мм, хз. я последнее время склоняюсь к умным spa клиентам (конечно от проектов зависит, у меня так), но фронт пока это redux или мобилка RN с тем же redux, поэтому уносить что-то кроме логики на сервер не хочется, чем больше клиент может тем лучше имхо

kuzmin_m14:10:18

мы говорим про админки

kuzmin_m14:10:31

или подобное админкам

kuzmin_m14:10:49

понятно, что бывают случаи, когда без SPA вообще никак

razum2um14:10:52

да, кстати, что именно дорого? (js->clj)?

kuzmin_m14:10:01

разрабатывать

kuzmin_m14:10:18

то что ты манипулируешь данными в clj

kuzmin_m14:10:33

и то что ты тащишь компилятор, рпел

kuzmin_m14:10:43

и другую парадигму разработки

kuzmin_m14:10:03

это еще тестировать как бы надо)

razum2um14:10:20

короче, сделать, чтобы бек быстро накидывал админки, т.е. скорее опять вернулись к simple_form (если думать гибко и не рождать АА) так?

kuzmin_m14:10:48

не к simple_form

kuzmin_m14:10:58

ты там описываешь структуру отедльно от данных

kuzmin_m14:10:09

а можно это описание генерировать из спеки

kuzmin_m14:10:22

и что такое AA? 😃

razum2um14:10:50

тогда всетаки ActiveAdmin (AA)? (если с прищуром принять схему базы за схему данных)

kuzmin_m14:10:04

я не работал с AA

kuzmin_m14:10:08

наверное

kuzmin_m14:10:18

похоже

razum2um14:10:15

в общем цель чтобы бек быстро накидал админку хорошая, но почему такой изврат тогда? почему не генерить html на сервере постаринке

kuzmin_m14:10:44

как вложенные формы делать?

kuzmin_m14:10:50

там js нужен

kuzmin_m14:10:03

как автокплит делать с поиском на сервере?

kuzmin_m14:10:09

тоже js и ajax

kuzmin_m14:10:21

простого html не хватает для форм

razum2um14:10:35

не прошло и 94 сообщения и я понял все 😄

kuzmin_m14:10:36

как файлы прикреплять?

kuzmin_m14:10:45

ура! 😃

kuzmin_m14:10:55

может я криво изначально написал?

razum2um14:10:24

да. перепиши, плиз, чтобы цель была сверху и что “не пишиет сам js/cljs/css” это не оптимизация усилий фронта, а имено для бека, конкретные шаги можно спрятать, ибо спорно (сколько чего где делать) 🙂

razum2um14:10:03

гет соточки! хорошие сегодня треды

kuzmin_m14:10:43

добавил

dottedmag18:10:19

@kuzmin_m Я видел такое пару раз (не на clojure) и это жило ровно до того момента, пока не требовалось каких-то специальных контролов на клиенте. А после этого либо всё целиком сносилось и переносилось на клиента (в лучшем случае), либо окружалось кучей хаков (в худшем).

kuzmin_m19:10:15

тут как раз специальные контролы на клиенте что мешает сделать подключаемые виджеты? @dottedmag есть какой-то конкретный пример? была такая-то форма, сделали так-то, стало нужно вот это, не получилось потому-то

dottedmag19:10:59

@kuzmin_m Навскидку нет, всё осталось в древности.

kuzmin_m19:10:04

там изначально были какие-то виджеты на js изначально?

kuzmin_m19:10:17

т.е. в моей идее виджеты как раз на js

kuzmin_m19:10:36

а сервер отдает описание формы в виде данных

kuzmin_m19:10:53

и там указывается какой виджет использовать

dottedmag19:10:00

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

kuzmin_m19:10:06

например так: было 2 поля start_date end_date было 2 инпута стал нужен один инпут для интервала?

dottedmag20:10:47

Я уже не помню деталей