Enviar muitos pacotes pequenos ou poucos pacotes grandes? #tcp

Gostaria que fosse dito mais sobre como otimizar a correlação entre a transmissão TCP e a média de CPU / carga.

Aqui está um código que escrevi rapidamente que não me dá todas as respostas, mas é um começo.

Inicie um servidor tcp em um terminal

git clone https://github.com/extend/ranch
cd examples
/tcp_echo
%% optionally comment the echo part
make
&& ./_rel/bin/tcp_echo_example console

Isso inicia o servidor tcp do rancho na porta 5555

Abri outro terminal para o cliente

Crie uma função que retorne N bytes de “x”

1> Bin = fun(N)->
lists
:foldl(fun(X,Acc)->
<<Acc/binary,"x">>
end, <<>>, lists:seq(1,N)) end.
#Fun<erl_eval.6.80484245>
2> Bin(1).
<<"x">>
3> Bin(10).
<<"xxxxxxxxxx">>

Quanto tempo leva para enviar um byte

4> timer:tc(fun()-> 
{ok,C} = gen_tcp:connect("localhost",5555,[]),
gen_tcp
:send(C,Bin(1))
end).
{14606,ok}

Experimente com tamanhos diferentes

9> timer:tc(fun()-> 
{ok,C} = gen_tcp:connect("localhost",5555,[]), gen_tcp:send(C,Bin(150000)) end).
{4923405,ok}

Envie 10 um após o outro com o mesmo soquete

11> timer:tc(fun()-> 
{ok,C} = gen_tcp:connect("localhost",5555,[]),
[gen_tcp:send(C,Bin(1400)) || _X <- lists:seq(1,10)], ok end).
{819,ok}

Faça uma função de teste, memorize um monte de coisas

25> Test4 = fun(Size,Packets) -> 
FullBin = Bin(Size), Max = lists:seq(1,Packets), timer:tc(fun()->
{ok,C} = gen_tcp:connect("localhost",5555,[binary]),
[gen_tcp:send(C,FullBin) || _X <- Max], ok
end) end.
#Fun<erl_eval.12.80484245>

Envia 10.000 bytes, mas com pacotes de tamanhos diferentes vs número de pacotes

32> [{Size,Packets,Test4(Size,Packets)} || {Size,Packets} <- 
[{1,10000}, % send 10k 1 byte sized packets
{10,1000},
{100,100},
{1000,10},
{10000,1}]]. % send one 10k byte sized packet
[{1,10000,{589211,ok}},
{10,1000,{71843,ok}},
{100,100,{9680,ok}},
{1000,10,{1575,ok}},
{10000,1,{795,ok}}]

Portanto, enviar 1 pacote grande com 10.000 bytes foi mais rápido. Achei este artigo [1] interessante que diz

1bps of network link requires 1Hz of CPU processing
[1] http://pdf.aminer.org/000/446/252/tcp_performance_re_visited.pdf

Mas eu gostaria de poder ver o impacto na CPU, TIME_WAIT, etc, que é menos trivial de co-relacionar.