<div dir="ltr">Hi,<div><br></div><div>We are experiencing a bottleneck in our application that has the option of using SSL.  Conducting some generic tests, I am seeing that SSL can be upto 20,000 times slower when processing large amounts of data and was wondering if anyone else has seen the same behaviour or can tell me that I'm doing something really silly?</div><div><br></div><div>Transferring a 200MB binary between 2 nodes on the same machine using gen_tcp is taking between 100 and 200 microseconds, whilst transferring the same binary using ssl usually takes around 3 seconds!  I'm currently using R16B01, but can happily move to a later version if this is required.</div><div><br></div><div>Is there any way to speed this up or any alternative SSL implementations that call out to openssl natively that could be used instead?  Any insights would be very welcome.</div><div><br></div><div>Thanks,</div><div>Sean</div><div><br></div><div>P.S.  The code I'm using is enclosed below:</div><div><br></div><div><div>-module(network_performance).</div><div><br></div><div>-export([client/0,ssl_client/0,server/1,ssl_server/1]).</div><div><br></div><div>client() -></div><div>    SomeHostInNet = "localhost", % to make it runnable on one machine</div><div>    {ok, Sock} = gen_tcp:connect(SomeHostInNet, 5678,</div><div>        [binary, {packet, 0}, {active, once}]),</div><div>    Before = erlang:now(),</div><div>    ok = do_client_recv(Sock),</div><div>    After = erlang:now(),</div><div>    ok = gen_tcp:close(Sock),</div><div>    io:format("Time taken: ~p microsecs~n",[total_microsecs(After) - total_microsecs(Before)]).</div><div><br></div><div>server(Data) -></div><div>    {ok, LSock} = gen_tcp:listen(5678, [binary, {packet, raw}, {active, once},{reuseaddr,true}]),</div><div>    {ok, Sock} = gen_tcp:accept(LSock),</div><div>    gen_tcp:send(Sock, Data),</div><div>    gen_tcp:close(Sock).</div><div><br></div><div>ssl_client() -></div><div>    SomeHostInNet = "localhost", % to make it runnable on one machine</div><div>    ssl:start(),</div><div>    {ok, Sock} = ssl:connect(SomeHostInNet, 5679,</div><div>        [binary, {packet, 0}, {active, once}]),</div><div>    ok = ssl:ssl_accept(Sock),</div><div>    Before = erlang:now(),</div><div>    ok = do_client_recv(Sock),</div><div>    After = erlang:now(),</div><div>    ok = ssl:close(Sock),</div><div>    io:format("Time taken: ~p microsecs~n",[total_microsecs(After) - total_microsecs(Before)]).</div><div><br></div><div>ssl_server(Data) -></div><div>    ssl:start(),</div><div>    {ok, LSock} = ssl:listen(5679, [binary, {packet, raw},</div><div>                                        {active, once},{reuseaddr,true},{certfile,"test.pem"},{keyfile,"test.key"}]),</div><div>    {ok, Sock} = ssl:transport_accept(LSock),</div><div>    ok  = ssl:ssl_accept(Sock),</div><div>    ssl:send(Sock, Data),</div><div>    ssl:close(Sock).</div><div><br></div><div>total_microsecs({MegaSecs,Secs,MicroSecs}) -></div><div>    (MegaSecs*1000000 + Secs)*1000000 + MicroSecs.</div><div><br></div><div>do_client_recv(Socket) -></div><div>    receive</div><div>        {tcp, Socket, _Data} -></div><div>            ok;</div><div>        {ssl, Socket, _Data} -></div><div>            ok;</div><div>        {tcp_closed, Socket} -></div><div>            io:format("Socket closed~n",[]);</div><div>        {tcp_error, Socket, Reason} -></div><div>            io:format("Error: ~p~n",[Reason])</div><div>    after 20000 -></div><div>            io:format("Receive timed out~n",[])</div><div>    end.</div></div><div><br></div></div>