по какому механизму они передаются между процессами, работающими на одном узле?
Поскольку все процессы Erlang на одном и том же узле выполняются в одном собственном процессе - эмуляторе BEAM - сообщениеструктуры просто копируются в очередь сообщений получателя.Структура сообщения копируется, а не просто ссылается по всем стандартным причинам функционального программирования без побочных эффектов.
См. erts_send_message()
в erts/emulator/beam/erl_message.c
в источниках Erlang для получения более подробной информации.В R15B01 биты, наиболее подходящие для вашего вопроса, начинаются со строки 980 или около того, с вызова erts_queue_message()
.
Если вы решили запустить несколько эмуляторов BEAM на одной физической машине, я бы предположил сообщенияотправляются между ними так же, как между разными физическими машинами.Вероятно, сейчас нет веской причины делать это, поскольку BEAM имеет хорошую поддержку SMP.
В чем разница в производительности между передачей сообщений "в узле" и "между узлами"?
Простой эталонный тест на вашем реальном оборудовании был бы более полезен для вас, чем отдельные примеры от других.
Однако, если вам нужны общие сведения, учтите, что пропускная способность памяти составляет около 20 ГБайт / с. в наши дни, и вы вряд ли будете иметь сетевое соединение быстрее, чем 10 Гбит / с между узлами.Это означает, что, хотя между вашим действительным приложением и любым простым тестом, который вы выполняете или находите, может быть много различий, эти различия, вероятно, не смогут перекрыть разницу в скорости передачи на порядок.
Если у вас «только» есть 1Сквозная сетевая связь между узлами в Гбит / с, внутрисетевые передачи, вероятно, будут на два порядка быстрее, чем межузловые.