Между узлами сообщение (должно быть) передано через TCP/IP. Однако каким механизмом они передаются между процессами, запущенными на одном и том же node? Используется ли TCP/IP в этом случае? Unix доменные сокеты? В чем разница в производительности между сообщениями "внутри node" и "между node"?
Как Erlang передает сообщения между процессами на одном и том же node?
Ответ 1
каким механизмом они передаются между процессами, запущенными на одном и том же node?
Поскольку процессы Erlang на одном и том же node все работают в одном собственном процессе -— эмулятор BEAM — структуры сообщений просто копируются в очередь сообщений получателя. Структура сообщений скопирована, а не просто указана, для всех стандартных причин функционального программирования без побочных эффектов.
Подробнее см. erts_send_message()
в erts/emulator/beam/erl_message.c
в источниках Erlang. В R15B01 биты, наиболее релевантные вашему вопросу, начинаются со строки 980 или около того с вызовом erts_queue_message()
.
Если вы решили запустить несколько эмуляторов BEAM на одной физической машине, я бы предположил, что сообщения отправляются между ними так же, как между разными физическими машинами. Вероятно, нет веских оснований для этого, поскольку BEAM имеет хорошую поддержку SMP.
В чем разница между производительностью между сообщением "внутри node" и "между node"?
Простой критерий для вашего реального оборудования был бы более полезен для вас, чем анекдотические данные других.
Если вы хотите, чтобы в общих чертах наблюдались полосы пропускания памяти, около 20 ГБ/сек в эти дни, и что вы вряд ли будете иметь сетевая связь быстрее, чем 10 Гбит/с между узлами. Это означает, что, хотя может быть много различий между вашим фактическим приложением и любым простым эталоном, который вы выполняете или находите, эти различия, вероятно, не могут взлететь на порядок величины в скорости передачи.
Если у вас "только" есть сквозная сетевая связь 1 Гбит/с между узлами, переносы внутри очереди, вероятно, будут на два порядка быстрее, чем межсетевые передачи.
Ответ 2
"Все данные в сообщениях между процессами Erlang копируются, за исключением файлов refc на одном и том же Erlang node.":
http://erlang.org/doc/efficiency_guide/processes.html#id2265332