Обработка сетевого трафика в виртуализированной среде всегда вызывает проблемы с производительностью операций сетевого ввода-вывода. Смотрите, например, этот пост: Basecamp, теперь с большим количеством vroom
Все входящие HTTP-запросы должны перенаправляться операционной системой хоста на определенные виртуальные машины. Это приведет к постоянному переключению контекста между этими паравиртуализированными операционными системами и дополнительным расходам на операции сетевого ввода-вывода.
Host OS receive a HTTP packet -> copy the packet to the VM's memory -> switch to the VM process -> inside the VM: receive the packet in the sub-OS network stack -> copy the packet to the receiving process (the web server) -> switch to the receiving process -> handle the request and return a response (with the same steps in reverse order)
Это могло бы подойти для упомянутых дополнительных преимуществ, но потребовало бы дополнительного оборудования для обработки того же трафика по сравнению со стандартными решениями.
В Erlang его виртуальная машина не является отдельной операционной системой со своим собственным сетевым стеком, а является стандартным процессом, работающим в операционной системе хостинга. Нет никаких накладных расходов на сетевые операции ввода-вывода, поскольку все они обрабатываются операционной системой хоста.
Host OS receive a HTTP packet -> copy the packet to the Erlang VM's memory -> switch to the Erlang VM process -> handle the request and return a response