рдзреВрдордХреЗрддреБ - 1,000,000 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рднрд╛рд░ рдХреЗ рд╕рд╛рде рдореЛрдЪреАрд╡реЗрдм рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрдиред рднрд╛рдЧ рез/рей

рднрд╛рдЧ реи

рднрд╛рдЧ рей



рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ, рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рдореЛрдЪреАрд╡рдм рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЦреБрд▓реЗ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдореЛрдЪреАрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдзреВрдордХреЗрддреБ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рд░рд╛рдЙрдЯрд░ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛред рд╣рдо рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдВрдЧреЗ рдЬреЛ 1,000,000 рд╕рдорд╡рд░реНрддреА рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреА рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ:

тАв рдПрдХ рд╕рд░рд▓ рдзреВрдордХреЗрддреБ рдмрдирд╛рдирд╛ - рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╣рд░ 10 рд╕реЗрдХрдВрдб рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред

тАв рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ред

тАв рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрдирд╛рдирд╛ред

тАв рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХ рдорд╛рддреНрд░рд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдгред



рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рдЧ рдЖрдкрдХреЛ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рдХрд░реЗрдВ, рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд╛рд▓реЗрдВ рджрд┐рдЦрд╛рдПрдВ, рдФрд░ 100,000 рдФрд░ 1,000,000 рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред



рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдмреИрд╢ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рдФрд░ рдПрд░рд▓рдВрдЧ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ред



рдЯреЗрд╕реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛



рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:



1. рдореЛрдЪреАрд╡реНрдм рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред

2. рднрд╛рдЧреЛ: /your-mochiweb-path/scripts/new_mochiweb.erl moiciconntest

3. рдПрд▓рд╕реАрдбреА mochiconntest рдФрд░ src / mochiconntest_web.erl рдмрджрд▓реЗрдВ



рдпрд╣ рдХреЛрдб (mochiconntest_web.erl) рдХреЗрд╡рд▓ рдХрдиреЗрдХреНрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЧреНрд░реАрдЯрд┐рдВрдЧ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ 10 рд╕реЗрдХрдВрдб рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ред



-module(mochiconntest_web). -export([start/1, stop/0, loop/2]). %% External API start(Options) -> {DocRoot, Options1} = get_option(docroot, Options), Loop = fun (Req) -> ?MODULE:loop(Req, DocRoot) end, %we'll set our maximum to 1 million connections. mochiweb_http:start([{max, 1000000}, {name, ?MODULE}, {loop, Loop} | Options1]). stop() -> mochiweb_http:stop(?MODULE). loop(Req, DocRoot) -> "/" ++ Path = Req:get(path), case Req:get(method) of Method when Method =:= 'GET'; Method =:= 'HEAD' -> case Path of "test/" ++ Id -> Response = Req:ok({"text/html; charset=utf-8", [{"Server","Mochiweb-Test"}], chunked}), Response:write_chunk("Mochiconntest welcomes you! Your Id: " ++ Id ++ "\n"), %% router:login(list_to_atom(Id), self()), feed(Response, Id, 1); _ -> Req:not_found() end; 'POST' -> case Path of _ -> Req:not_found() end; _ -> Req:respond({501, [], []}) end. feed(Response, Path, N) -> receive %{router_msg, Msg} -> % Html = io_lib:format("Recvd msg #~w: '~s' ", [N, Msg]), % Response:write_chunk(Html); after 10000 -> Msg = io_lib:format("Chunk ~w for id ~s\n", [N, Path]), Response:write_chunk(Msg) end, feed(Response, Path, N+1). %% Internal API get_option(Option, Options) -> {proplists:get_value(Option, Options), proplists:delete(Option, Options)}.
      
      







Mochiweb рдПрдкреНрд▓реАрдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдирд╛



 make && ./start-dev.sh
      
      







рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдореЛрдЪреАрд╡реЗрдм рдмрдВрджрд░рдЧрд╛рд╣ 8000 рдкрд░ рд╕реБрдирддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдШрд░ рдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд┐рд╕реА рднреА рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: http: // localhost: 8000 / test / foo ред



рдиреАрдЪреЗ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реИ:

 $ lynx --source "http://localhost:8000/test/foo" Mochiconntest welcomes you! Your Id: foo<br/> Chunk 1 for id foo<br/> Chunk 2 for id foo<br/> Chunk 3 for id foo<br/> ^C
      
      







рд╣рд╛рдБ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред



рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ tcp рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛



рд╣рдо рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдХреБрдЫ рд╕рдордп рдмрдЪрд╛рдПрдВрдЧреЗ рдФрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд░реНрдиреЗрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗ, рдпрд╛ рдЖрдкрдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ "рдЖрдЙрдЯ рдСрдл рд╕реЙрдХреЗрдЯ рдореЗрдореЛрд░реА" рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред



рдпрд╣рд╛рдБ sysctl рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВ:

 # General gigabit tuning: net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 net.ipv4.tcp_syncookies = 1 # this gives the kernel more memory for tcp # which you need with many (100k+) open socket connections net.ipv4.tcp_mem = 50576 64768 98152 net.core.netdev_max_backlog = 2500 # I was also masquerading the port comet was on, you might not need this net.ipv4.netfilter.ip_conntrack_max = 1048576
      
      







рдЙрдиреНрд╣реЗрдВ / etc / sysctl.conf рдореЗрдВ рдбрд╛рд▓реЗрдВ, рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП sysctl -p рдЪрд▓рд╛рдПрдБред рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд░рд┐рдмреВрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЕрдм рдХрд░реНрдиреЗрд▓ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЦреБрд▓реЗ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред



рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдирд╛



рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рддреНрд╕реБрдВрдЧ рдХрд╛рдлреА рд╕реЗрдХреНрд╕реА рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде httpd рд╕реНрдкреИрдо рдмрдирд╛рдиреЗ рдХреЗ рдХрдо рдпреМрди рддрд░реАрдХреЗ (рдЕрдм, рдХреИрдВрдкрд░, httpload, рдЖрджрд┐) рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрд░рд▓рд╛рдВрдЧ рдкрд░ рдПрдХ рдореВрд▓ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрд╛ред



рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ ... рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдорд╣рдВрдЧреА рд╣реЛрдЧреАред рдореИрдВрдиреЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ URL рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдФрд░ рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рд╕рднреА http рдХрдиреЗрдХреНрд╢рди рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдФрд░ рдкреНрд░рддреНрдпреЗрдХ 10 рд╕реЗрдХрдВрдб рдореЗрдВ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдореБрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛)ред рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдЙрдВрдЯрд░ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рддрдиреЗ HTTP рд╕рдВрджреЗрд╢ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдЧрдП рдереЗред



 -module(floodtest). -export([start/2, timer/2, recv/1]). start(Filename, Wait) -> inets:start(), spawn(?MODULE, timer, [10000, self()]), This = self(), spawn(fun()-> loadurls(Filename, fun(U)-> This ! {loadurl, U} end, Wait) end), recv({0,0,0}). recv(Stats) -> {Active, Closed, Chunks} = Stats, receive {stats} -> io:format("Stats: ~w\n",[Stats]) after 0 -> noop end, receive {http,{_Ref,stream_start,_X}} -> recv({Active+1,Closed,Chunks}); {http,{_Ref,stream,_X}} -> recv({Active, Closed, Chunks+1}); {http,{_Ref,stream_end,_X}} -> recv({Active-1, Closed+1, Chunks}); {http,{_Ref,{error,Why}}} -> io:format("Closed: ~w\n",[Why]), recv({Active-1, Closed+1, Chunks}); {loadurl, Url} -> http:request(get, {Url, []}, [], [{sync, false}, {stream, self}, {version, 1.1}, {body_format, binary}]), recv(Stats) end. timer(T, Who) -> receive after T -> Who ! {stats} end, timer(T, Who). % Read lines from a file with a specified delay between lines: for_each_line_in_file(Name, Proc, Mode, Accum0) -> {ok, Device} = file:open(Name, Mode), for_each_line(Device, Proc, Accum0). for_each_line(Device, Proc, Accum) -> case io:get_line(Device, "") of eof -> file:close(Device), Accum; Line -> NewAccum = Proc(Line, Accum), for_each_line(Device, Proc, NewAccum) end. loadurls(Filename, Callback, Wait) -> for_each_line_in_file(Filename, fun(Line, List) -> Callback(string:strip(Line, right, $\n)), receive after Wait -> noop end, List end, [read], []).
      
      







рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЛрд░реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ 1024 рддрдХ рд╕реАрдорд┐рдд рд╣реЛрддреА рд╣реИред рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╢реЗрд▓ рдХреЗ рд▓рд┐рдП ulimit рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ / etc / рд╕реБрд░рдХреНрд╖рд╛ / limit.conf рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рд░рд┐рдмреВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

 $ sudo bash # ulimit -n 999999
      
      







рд╣рдо рдЙрдкрд▓рдмреНрдз рдкреЛрд░реНрдЯ рдХреА рд╕реАрдорд╛ рдХреЛ рдЕрдзрд┐рдХрддрдо рддрдХ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 # echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range
      
      





рд╣рдо рдЕрдкрдиреА рдкрд░реАрдХреНрд╖рдг рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд▓рд┐рдП URL рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗ:

 ( for i in `seq 1 10000`; do echo "http://localhost:8000/test/$i" ; done ) > /tmp/mochi-urls.txt
      
      







рдЕрдЧрд▓рд╛, Erlang рдХрдВрд╕реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ:

 erl> c(floodtest). erl> floodtest:start("/tmp/mochi-urls.txt", 100).
      
      







рдХреЛрдб рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 10 рдирдП рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ (рдЕрд░реНрдерд╛рдд, рдкреНрд░рддреНрдпреЗрдХ 100 рдПрдордПрд╕ рдореЗрдВ 1 рдХрдиреЗрдХреНрд╢рди)ред

рдЖрдВрдХрдбрд╝реЗ {рдПрдХреНрдЯрд┐рд╡, рдХреНрд▓реЛрдЬреНрдб, рдЪрдВрдХреНрд╕} рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЬрд╣рд╛рдВ рдПрдХреНрдЯрд┐рд╡ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЧрдП рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдХреНрд▓реЛрдЬреНрдб рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИ, рдФрд░ рдЪрдВрдХреНрд╕ Mochiweb рд╕реЗ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдмрдВрдж 0 рдкрд░ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЪрдВрдХреНрд╕ рд╕рдХреНрд░рд┐рдп рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдХреНрд░рд┐рдп рдХрдиреЗрдХреНрд╢рди рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрджреЗрд╢ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (1 рд╣рд░ 10 рд╕реЗрдХрдВрдб)ред



10,000 рд╕рдХреНрд░рд┐рдп рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рд╕рд╛рде рдореЛрдЪреАрд╡рдм рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЖрдХрд╛рд░ 450 рдПрдордмреА рдерд╛ - рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП 45 KB рд╣реИред рдорд╢реАрди рдкрд░ рд╕реАрдкреАрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╕реНрддреБрддрдГ рд╢реВрдиреНрдп рдерд╛ред



рдирд┐рд╖реНрдХрд░реНрд╖ред



рдпрд╣ рдкрд╣рд▓рд╛ рдкреНрд░рдпрд╛рд╕ рдерд╛ред рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП 45 Kb рдХрд╛рдлреА рдмрдбрд╝рд╛ рд▓рдЧрддрд╛ рд╣реИ - рдЖрдк рд╢рд╛рдпрдж рд╕реА рдореЗрдВ рдХреБрдЫ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ libevent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛ рдХреБрдЫ рд╕рдорд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП 4.5Kb рдЦрд░реНрдЪ рдХрд░рдирд╛ (рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдзрд╛рд░рдгрд╛ рд╣реИ, рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди рдЕрдиреБрднрд╡ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝ рджреЛ)ред рдпрджрд┐ рдЖрдк рд╕реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдФрд░ рдПрд░реНрд▓рд╛рдВрдЧ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓реЗ рд╕рдордп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдЕрдзрд┐рдХ рдЖрдХрд░реНрд╖рдХ рд╣реИред



рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдореИрдВ рд╕рдВрджреЗрд╢ рд░рд╛рдЙрдЯрд░ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ (рдЗрд╕ рддрд░рд╣ рд╣рдо mochiconntest_web.erl рдореЗрдВ 25 рдФрд░ 41-43 рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдФрд░ рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдореИрдВ 100,000 рдФрд░ 1,000,000 рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рднреА рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред



рдЕрджреНрдпрддрди: рднрд╛рдЧ реи



All Articles