Сколько процессоров требуется до того, как Erlang будет быстрее, чем однопоточная Java

В настоящее время я использую Java, я много читал об Erlang в сети, и у меня есть два больших вопроса:

  • Насколько медленнее (если есть), будет Erlang над простой Java?
    Я предполагаю, что Java будет быстрее из контрольных точек перестрелки в сети (Erlang не делает этого хорошо). Итак, сколько еще процессоров мне понадобится, чтобы заставить Erlang сиять над однопотоковой Java (в моей конкретной ситуации, приведенной ниже)?

  • После прочтения около Erlang какое-то время я наткнулся на ряд комментариев/сообщений, в которых говорится, что большинство больших систем Erlang содержат хорошее количество C/С++.
    Это по причинам скорости (мое предположение) или что-то еще? Для чего это необходимо?

Я читал о количестве процессоров в большинстве машин, которые поднимаются, и моделирование потоков жестко (я согласен), но я хочу узнать, когда "линия" будет пересекаться, чтобы я мог изменить язык/парадигму в нужное время.

Немного фона/контекста:
Я работаю на стороне сервера на Java-сервисах, которые очень привязаны к процессору и легко выполняются параллельно. Это связано, как правило, с одним входящим обновлением (через TCP), инициирующим изменение на несколько (100 с) выходов.

Вычисления обычно довольно простые (несколько циклов, просто много арифметических), и входы поступают довольно быстро (100/с).

В настоящее время мы работаем на четырех процессорах и выполняем несколько сервисов на каждом (поэтому многопоточность довольно бессмысленна, и Java, похоже, работает быстрее без блоков синхронизации и т.д., чтобы сделать его многопоточным). Теперь есть сильный толчок к скорости, и теперь у нас есть доступ к 24 процессорным машинам (для каждого процесса, если это необходимо), поэтому мне интересно, как лучше всего продолжить - массивно многопоточную Java или что-то более простое, например, Erlang.

Ответ 1

так как это арифметическая большая рабочая нагрузка, и вы уже сделали работу по разделению кода на отдельные сервисные процессы, вы вряд ли выиграете от Erlang. Ваша работа, похоже, удобно подходит для Java. Erlang хорош в крошечных транзакциях, таких как переключение msg или обслуживание статических или простых динамических веб-страниц. Неточно - на уровне предприятия-хруста или рабочей нагрузки базы данных.

Однако вы можете использовать внешние цифровые библиотеки и базы данных и использовать Erlang в качестве переключателя MSG: D, что делает couch-db: P

- изменить -

  • Если вы перемещаете свои арифметические операции в Ernang async-IO, то erlang будет так же хорош, как и материал для перехвата языка, - но с 24 cpu, возможно, это не имеет большого значения; база данных erlang является процедурной и, следовательно, довольно быстрой - это может быть использовано в вашем приложении, обновляющем 100 объектов для каждой транзакции.

  • Система исполнения erlang должна быть комбинацией C и С++, потому что (a) эмулятор erlang написан на C/С++ (вам нужно начинать с чего-то), (b) вам нужно поговорить с ядром для выполнения async файла io и сети io, и (c) некоторые части системы должны быстро вздыматься --eg, бэкэнд системы базы данных (амнезия).

- обсуждение -

с 24 CPU в топологии с 6 ядрами * 4 с использованием шины общей памяти - у вас есть 4 объекта NUMA (ЦП) и одна центральная память. Вы должны быть мудрыми относительно парадигмы, совлокальный процесс с несколькими процессами может убить вашу память.

Чтобы обойти это, вам нужно создать 4 процесса с 6 потоками обработки и связать каждый поток обработки с соответствующим ядром в соответствующем процессоре. Эти 6 потоков должны выполнять совместную многопоточность - Erlang и Lua имеют это врожденно - Erlang делает это жестким способом поскольку он имеет полномасштабный планировщик как часть его среды выполнения, которую он может использовать для создания как можно большего количества процессов.

Теперь, если вы разделили свои задачи на 4 процесса (1 на физический процессор), вы были бы счастливым человеком, однако вы используете 4 Java VM (предположительно) для серьезной работы (yuck, по многим причинам). Проблема должна быть решена с лучшей способностью срезать и решить проблему.

Входит система Erlang OTP, она была разработана для избыточных надежных сетевых систем, но теперь она движется к процессорам NUMA-esque с одинаковой машиной. У него уже есть эмулятор SMP для ударных инструментов, и он скоро станет NUMA. С этой парадигмой программирования у вас гораздо больше шансов насытить ваши мощные серверы, не убивая ваш автобус.

Возможно, это обсуждение было теоретическим; однако, когда вы получаете топологию 8x8 или 16x8, вы тоже будете к этому готовы. Таким образом, мой ответ заключается в том, что на вашей материнской плате у вас больше 2-х современных - физических процессоров. Вероятно, вы должны рассмотреть лучшую парадигму программирования.

В качестве примера крупного продукта после обсуждения здесь: Microsoft SQL Server является уровнем NUMA уровня процессора на уровне SQL-OS на котором построен механизм базы данных.

Ответ 2

Сравнивали ли вы затраты на новое оборудование и затраты на переподготовку сотрудников в Erlang и перепроектировали свое программное обеспечение на новом языке?

Я не стал бы недооценивать расходы на переподготовку себя (или других) и расходы на привлечение людей, знакомых в Эрланге (кому будет намного труднее найти, чем люди Java). Очевидно, что серверы стоят с точки зрения их стоимости хранения/мощности/обслуживания и т.д., Но они все еще намного дешевле квалифицированного персонала. Если вы можете добиться прогресса и оставаться масштабируемым, используя свои текущие навыки, я подозреваю, что наиболее прагматичный подход.

Ответ 3

Вопрос о скорости, когда речь заходит о языках программирования, является настолько сложным, насколько может возникнуть вопрос. Сторонники Java могут указывать на множество областей и утверждать, что они являются самыми быстрыми, и они будут на 100% правильными. Сторонники Ruby/Python указывают на другой набор параметров и утверждают, что они быстрее, и они также будут правильными. Сторонники Erlang затем указывают на параллельные соединения и утверждают, что они быстрей, имея дело с сотнями или тысячами параллельных соединений или вычислений, и это тоже не было бы ошибкой.

Глядя на основное описание рассматриваемого проекта, мне кажется, что Erlang идеально подойдет для ваших нужд. Не зная подробностей, я бы сказал, что на самом деле это будет довольно простая программа Erlang, и это можно сделать за очень короткое время.

Ответ 4

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

Вот некоторые из соответствующих аспектов, которые могут повлиять на соотношение выгод:

1) Вычислительные зависимости:, если логический поток имеет множество зависимостей от внешних ресурсов (СУБД, доступ к диску, сеть). Чем выше количество вычислительных зависимостей, которые делятся при параллельной обработке, тем выше преимущество использования распределенной вычислительной платформы, такой как erlang.

2) Локальная локальность потока:, если ваша программа должна тратить большое количество времени вычисления на одно последовательное синхронное управление потоком и не может быть разбита на более мелкие логические сегменты кода. Чем больше ваш код атомарности, тем меньше он может быть разбит на потоки распространения процессора.

3) Накладные расходы общего доступа: Чем больше объем данных, которые должны быть распределены между различными функциями, тем выше накладные расходы, необходимые для простоты передачи и получения состояния. Другими словами, если вы отправляете большие объемы данных повторно без общей общей области кеша, преимущества будут уменьшаться, хотя это имеет разные подходы в зависимости от принятых шаблонов программирования.

Поэтому, учитывая обширные возможности и варианты, основанные на таких критериях, как выше, невозможно, чтобы общая оценка была приемлемой для всех сценариев.

Ответ 5

Если вы получаете 100 в секунду, но они берут 100 долларов каждый, как он может идти в ногу? Возможно, я неправильно читаю эту часть, но в любом случае, если это не потребует нескольких тысяч или миллионов запросов, ваш код синхронизации не займет много времени. Если это так, вы делаете что-то неправильно, возможно, блокируетесь, пока выполняете всю работу или что-то в этом роде.

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