Как Erlang передает сообщения между процессами на одном узле?

между узлами сообщение (должно быть) передается по TCP / IP. Однако с помощью какого механизма они передаются между процессами, запущенными на одном узле? Используется ли TCP / IP в этом случае? Доменные сокеты Unix? В чем разница в производительности между передачей сообщений" внутри узла "и" между узлами"?

2 ответов


каким механизмом они передаются между процессами, запущенными на одном узле?

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

посмотреть erts_send_message() на erts/emulator/beam/erl_message.c в Эрланге источники для более подробной информации. В R15B01 биты, наиболее относящиеся к вашему вопросу, начинаются с строки 980 или около того, с вызова erts_queue_message().

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

в чем разница в производительности между " внутри узла" и передача сообщения "между узлами"?

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

если вы хотите обобщений, однако, обратите внимание, что полосы пропускания памяти около 20 Гбайт/сек в эти дни, и что вы вряд ли будете иметь сетевую связь быстрее, чем 10 Гбит/с между узлами. Это означает, что, хотя может быть много различий между вашим фактическим приложением и любым простым бенчмарк, который вы выполняете или находите, эти различия, вероятно, не могут затопить разницу в скорости передачи на порядок.

если у вас" только " есть сквозная сетевая связь 1 Гбит/с между узлами, передача интранодов, вероятно, будет на два порядка быстрее, чем передача междоузлий.


" все данные в сообщениях между процессами Erlang копируются, за исключением двоичных файлов refc на том же узле Erlang.":

http://erlang.org/doc/efficiency_guide/processes.html#id2265332