Сетевой эквивалент Erlang на уровне ОС

В книге Джо Эрланг он сказал, что будет удобно создать пул процессов, которые ждут, чтобы принять предстоящие соединения для большей производительности, если серверное оборудование совместимо с параллельными задачами, но поскольку сеть на самом деле происходит на уровне ОС, что именно происходит за кадром? Другими словами, что драйвер делает в ответ на сетевые задачи Erlang Processes? давайте попробуем со следующим примером:

      sup_module.erl 
-----------------------------------------

start() ->
supervisor:start_link(?MODULE, ?MODULE, []). 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

init() ->
ListenSocket=gen_tcp:listen(....),
spawn(fun ->start_acceptors() end ),
{ok,{ {simple_one_for_one,1, 1},[{child,{child_module, start, [ListenSocket]},....] } }.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

start_acceptors() ->
[supervisor:start_child(?MODULE, [ ]) | |   _  <-lists:seq(1,20) ]. 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

child_module.erl
-----------------------------------------

start(ListenSocket) ->
gen_server:start_link(?MODULE, [ListenSocket], [ ]). 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

init(ListenSocket) ->
gen_server:cast(self(), accept),
{ok, ListenSocket}. 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

handle_cast(accept, ListenSocket) ->
Socket=gen_server:accept(ListenSocket), 
supervisor:start_child(sup_module, [ ]), 
{noreply, Socket}.

Код прост, он создает 20 параллельных процессов Erlang, которые ждут неподходящих соединений. Когда процесс принимает соединение, он создает другой такой же процесс, чтобы количество свободных приемников оставалось равным 20. Вопрос в том, что ДЕЙСТВИТЕЛЬНО происходит за кулисами? когда приходят соединения, они сначала обрабатываются на уровне ОС (под управлением inet_drv.c), затем переходят на уровень ERTS, так что же происходит на уровне ОС? есть ли 1 OS-Thread для приема подключений? 20 потоков? N потоков? 1 Поток принимает и доставляет подключения к пулу потоков? Я знаю, что один узел Erlang может обрабатывать более 2 миллионов соединений с ограниченным оборудованием в нормальном масштабе, так каков эквивалент на уровне ОС для 2 миллионов процессов Erlang? Я вижу, что многие из Эрлангера вносят свой вклад в inet_drv.c поэтому, если возможно объяснить в скучных подробностях, что этот драйвер делает в ответ на сетевые задачи, я попытался прочитать его исходный код, но это очень сложно, поэтому я буду благодарен за четкий ответ.

0 ответов

Другие вопросы по тегам