Using socket module in production?

Frank Muller frank.muller.erl@REDACTED
Mon Jun 22 00:43:35 CEST 2020


The udpstress uses procket which requires root privileges.


Hi Frank,
>
> You can check the pseudo code in the first post. I didn't do anything
> fancy.
> Maybe it's possible to extend udpstress with the socket module.
> https://github.com/reith/udpstress
>
> On Mon, Jun 22, 2020 at 1:14 AM Frank Muller <frank.muller.erl@REDACTED>
> wrote:
>
>> Hi Pablo,
>>
>> Interesting. Can you share some code here or on GitHub?
>>
>> /Frank
>>
>> <pablo.platt@REDACTED> a écrit :
>>
>>> I have used the socket module for udp sockets in production. I had
>>> hundreds of sockets at the same time receiving 5K packets/second and
>>> sending 25K packets/second.
>>> I didn't encounter errors and didn't get bug reports from users. Seems
>>> to be very stable.
>>> But I also didn't see any performance improvement compared to gen_udp.
>>>
>>> I'm using socket:recvfrom(Socket, 0, [], nowait) and
>>> socket:sendto(Socket, Data, Dest, [], nowait).
>>> Shouldn't I gain some performance over gen_udp?
>>>
>>>
>>> On Fri, Jun 12, 2020 at 7:31 PM Vans S <vans_163@REDACTED> wrote:
>>>
>>>> We notice often using gen_tcp with sockets backend we get this warning
>>>> printed:
>>>>
>>>> 3:24:4.923 <0.1018.0> [module: :gen_tcp_socket, socket: {:"$socket",
>>>> #Reference<0.504347063.3068526593.55942>}, unknown_event: {:info,
>>>> {:"$socket", {:"$socket", #Reference<0.504347063.3068526593.55942>},
>>>> :select, #Reference<0.504347063.3083599875.167918>}}, state: :connected]
>>>>
>>>> Ignore the log format this is our custom format.
>>>>
>>>> Seems to be some kinda race condition in the implementation.
>>>>
>>>> On Friday, June 12, 2020, 09:30:07 a.m. EDT, pablo platt <
>>>> pablo.platt@REDACTED> wrote:
>>>>
>>>>
>>>> Hi Raimo,
>>>>
>>>> I don't mind small changes in the API if changes will be indicated in
>>>> the release notes.
>>>> But I worry about other breaking changes or hidden bugs.
>>>> If anyone from the community is already using it in production it will
>>>> be reassuring.
>>>>
>>>> Thank you.
>>>>
>>>> On Fri, Jun 12, 2020 at 4:00 PM Raimo Niskanen <
>>>> raimo+erlang-questions@REDACTED> wrote:
>>>>
>>>> Hi Pablo!
>>>>
>>>> We will still make backwards incompatible changes.  But we do not know
>>>> of
>>>> any stability issues, and welcome all that stress test the code.
>>>>
>>>> So your code might stop working work in a future 23.X release.
>>>>
>>>> / Raimo
>>>>
>>>>
>>>> On Fri, Jun 12, 2020 at 01:48:32PM +0300, pablo platt wrote:
>>>> > Hi,
>>>> >
>>>> > Is it safe to use the NIF socket module for UDP in production in OTP
>>>> 23?
>>>> > It's working in my tests but I'm not sure if it's considered unstable
>>>> or if
>>>> > I'm missing configuration or error handling.
>>>> >
>>>> > This is how I'm using it:
>>>> >
>>>> > open() ->
>>>> >   {ok, Socket} = socket:open(inet, dgram, udp),
>>>> >   {ok, Port} = socket:bind(Socket, any),
>>>> >   {Socket, Port}.
>>>> >
>>>> > active_once(Socket) ->
>>>> >     case socket:recvfrom(Socket, 0, [], nowait) of
>>>> >         {ok, {#{port := Port, addr := Addr}, Data}} ->
>>>> >             {udp, Addr, Port, Data};
>>>> >         {select, {select_info, _SelectTag, SelectRef}} ->
>>>> >             SelectRef;
>>>> >         {error, Reason} ->
>>>> >             exit(Reason),
>>>> >             error
>>>> >     end.
>>>> >
>>>> > send(Socket, Addr, Port, Data) ->
>>>> >     Dest = #{family => inet,
>>>> >              port => Port,
>>>> >              addr => Addr},
>>>> >     case socket:sendto(Socket, Data, Dest, [], nowait) of
>>>> >         ok -> ok;
>>>> >         {select, {select_info, _SelectTag, _SelectRef}} ->
>>>> >             % need to wait for {'$socket', Socket, select,
>>>> SelectRef}  and
>>>> > resend Data?
>>>> >             ok
>>>> >     end.
>>>> >
>>>> > close(Socket) ->
>>>> >     socket:close(Socket).
>>>> >
>>>> > % listen for select ref
>>>> > handle_info({'$socket', Socket, select, SelectRef}, _State) ->
>>>> >     case socket:recvfrom(Socket, 0, [], nowait) of
>>>> >         {ok, {#{port := Port, addr := Addr}, Data}} ->
>>>> >             % handle Data
>>>> >             ok;
>>>> >         {select, {select_info, _SelectTag, SelectRef}} ->
>>>> >            SelectRef;
>>>> >      {error, Reason} ->
>>>> >          exit(Reason),
>>>> >          error
>>>> >     end,
>>>> >     {noreply, State}.
>>>>
>>>> --
>>>>
>>>> / Raimo Niskanen, Erlang/OTP, Ericsson AB
>>>>
>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20200622/d66c2a66/attachment.htm>


More information about the erlang-questions mailing list