DNS is slow when run from many processes

ori brost oribrost@REDACTED
Tue Feb 8 00:50:34 CET 2011


I've written a small program to demonstrate this:

---BEGIN PROGRAM---
-module(ghbm_bug_test).
-compile(export_all).

run(PortCount,Url) ->
       run(2000,PortCount,Url).

run(Port,PortCount,Url) ->
       case Port < PortCount of
               true ->
                       spawn(fun() -> loop(Port,Url) end),
                       run(Port + 1,PortCount,Url);
               false ->
                       ok
       end.

loop(Port,Url) ->
       case Port of
               2003 -> io:format("Doing connect\n");
               _    -> ok
       end,
       Sock = gen_tcp:connect(Url, 8080, [], 5000),
       case Port of
               2003 -> io:format("Did connect\n");
               _    -> ok
       end,
       case (catch gen_tcp:close(Sock)) of _ -> ok end,
       loop(Port,Url).
---END PROGRAM---


This program takes a lot of time to connect when connecting via
run(50000,"127.0.0.1") and yet connects quickly when I do run(50000,
{127,0,0,1}). I am running it with a max number of processes of
1000000 (set via +P).

After checking the states of processes I see that many of them spend
time in:
3> i(0,200,0).
[{current_function,{inet_gethost_native,getit,2}},


What are my possibilities for better DNS? I now that I can use erlang
dns instead of native dns, this solves the problem for 127.0.0.1, but
when I try a real address (i.e. run(50000,"some.server.of.mine.com"))
connections are very slow with both native and erlang DNS.

Any advice on a solution?


More information about the erlang-questions mailing list