Erlang (или эликсир) производительность (запросов в секунду) медленнее, чем Jruby?
Будучи рубином, я решил взять erlang для высокой производительности, надежного бэкэнда. Настройка довольно проста: получить почтовый запрос, написать материал в Redis, вернуть статистику. Все джсон. это также, почему я так беспокоюсь о запросах в секунду.
Инструменты выбора: webmachine, jiffy для кодирования / декодирования json, poolboy для пула соединений и eredis для повторной связи.
Используемая машина: MacBook Pro, i5 2,4 ГГц, 8 ГБ памяти.
Мой erlang получал около 5000 запросов в секунду, а jruby / torqbox - около 120000. ( смотрите здесь для полной настройки теста производительности ruby)
Я понимаю, что мог бы использовать ets в erlang, чтобы сэкономить время, и оставить повтор для "фоновой обработки", который будет написан после ответа, но это будет иметь небольшое влияние. даже простое испытание "здравствуй, мир", ерланг ногами позади.
Какие-либо предложения? Я делаю это неправильно?
3 ответа
- Веб-машина - я не знаю. Это довольно тяжелый вес на мой вкус, и я им не пользуюсь.
- jiffy - хороший выбор Довольно быстро и я им часто пользуюсь.
- Poolboy - я не слышал об этом, и я нахожусь в Эрланге в течение нескольких лет. Я определенно использовал бы ковбоя для всего, что я ожидал бы высокой производительности или рысканий для некоторой более прочной, но все еще хорошей работы. Ваш эталонный выбор - правильный выбор для ковбоев, он наивысший по производительности.
- Эредис - я не знаю, насколько он зрелый и насколько он эффективен. ETS больше подходит для ориентира. Для вашего теста MacBook это не имеет значения, но для большого сервера (десятки процессоров) я бы проверил, не является ли ti узким местом и таблицей разделов.
- самое главное проверить параметры вашей виртуальной машины. По крайней мере, вы должны иметь
+K true +A 100
для такого рода нагрузки.
Ваш результат для Эрланга кажется слишком низким по сравнению с моим опытом. Вы должны стать почти в десять раз больше. Также может быть проблема с вашим инструментом создания полезной нагрузки.
И, что особенно важно, это можно считать не только микро-эталоном для мира Эрланга, но может быть нано или эталоном. Настоящая сила раскроется, когда вы попробуете что-то более сложное и сложное. Что-то, где одновременный запрос должен очень сильно влиять друг на друга, и вам приходится иметь дело с возможной согласованностью и реализовывать ее гораздо более масштабируемой и использовать асинхронное межпроцессное взаимодействие.
Мои 2 цента. У вас неправильный конец палки. Вы тестируете проблему, для которой оптимизирована JVM, на компьютере, на котором оптимизирована JVM.
Вы действительно не увидите преимуществ Erlang/OTP в количестве ядер, доступных на MacBook Pro. Это всего лишь мое приблизительное предположение, но я был бы удивлен, увидев, как Эрланг победил JVM на чем-то меньшем, чем 8-ядерный сервер. Было потрачено огромное количество человеко-часов на то, чтобы сделать JVM как можно быстрее на современном оборудовании.
Написание поточно-ориентированного кода ввода-вывода довольно просто, реальные проблемы возникают, когда вы имеете дело с доступом к памяти между десятками и сотнями потоков.
Работа в Erlang/Elixir нацелена на текущий высокопроизводительный сервер с 16 или 32 ядрами, который в ближайшем будущем может значительно увеличиться.
К вашему сведению: "+A 100" не поможет при работе в сети, это только для файлового ввода-вывода. Если вы действительно хотите быстрый веб-сервер, взгляните на github.com/knutin/elli, он даст вам 80 кпр на оборудовании, где ковбой даст вам 30 кпс. С другой стороны, Элли - это то, что многие люди обвиняют в том, что они не следуют принципам OTP.
jiffy - хороший выбор, если вы можете разместить балансировщик нагрузки для очистки запросов, потому что jiffy внесет в ваш код ошибки segfaults - взгляните на список проблем.
В любом случае, erlang - это не то, что вы можете выбрать, если все, что вам нужно, - это действительно быстрая GET -> decode json -> store -> REPLY workload.