| Author |
Message |
|
| Guest |
Posted: Sun Aug 16, 2009 10:32 am |
|
|
|
Guest
|
Hi,
Is it possible to limit the number of connections that YAWs will handle?
I have a scenario in which 12000 client machines send data via SOAP to
my web server.
Currently The machine I have is limited in processing and memory.
I have build retry profiles into the clients, I want the yaws server to
survive until I upgrade the server!
Is it possible to throttle yaws to only allow x amount of connections?
Any help or suggestions will be appreciated.
Cheers
Jan
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Erlyaws-list mailing list
Erlyaws-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/erlyaws-list
Post received from mailinglist |
|
|
| Back to top |
|
| ngocdaothanh |
Posted: Mon Aug 17, 2009 12:47 am |
|
|
|
User
Joined: 06 Dec 2008
Posts: 43
|
How about listen_backlog (http://yaws.hyber.org/yman.yaws?page=yaws.conf)?
Ngoc
On Sun, Aug 16, 2009 at 6:34 PM, Jan Jacobs <hpjcon@mweb.co.za (hpjcon@mweb.co.za)> wrote:
Quote: Hi,
Is it possible to limit the number of connections that YAWs will handle?
I have a scenario in which 12000 client machines send data via SOAP to
my web server.
Currently The machine I have is limited in processing and memory.
I have build retry profiles into the clients, I want the yaws server to
survive until I upgrade the server!
Is it possible to throttle yaws to only allow x amount of connections?
Any help or suggestions will be appreciated.
Cheers
Jan
Post received from mailinglist |
|
|
| Back to top |
|
| Guest |
Posted: Mon Aug 17, 2009 2:32 am |
|
|
|
Guest
|
At Mon, 17 Aug 2009 09:46:54 +0900,
Ngoc Dao wrote:
>
> [1 <multipart/alternative (7bit)>]
> [1.1 <text/plain; UTF-8 (7bit)>]
>
> [1.2 <text/html; UTF-8 (quoted-printable)>]
> How about listen_backlog (http://yaws.hyber.org/yman.yaws?page=yaws.conf)?
>
> Ngoc
>
> On Sun, Aug 16, 2009 at 6:34 PM, Jan Jacobs <hpjcon@mweb.co.za> wrote:
>
> Hi,
>
> Is it possible to limit the number of connections that YAWs will handle?
Hi,
Attached below is a patch to add a feature to limit
the number of simultanious connections to accept.
It's adding one new proprerty to gconf to specifiy the max number
and a new status value to remember the number of connetions
currently opened.
yaws_server compares those two values and decide to or not to
accept more connections.
More precisely, it accepts TCP connections any way and will close it
if it's more than the max.
We're going to use this feature for our products and hope
we can share this with people who are intertested.
Thanks,
Kinoshita / Gemini Mobile Technologies
--- yaws-1.84/include/yaws.hrl.orig 2009-05-29 06:05:44.000000000 +0900
+++ yaws-1.84/include/yaws.hrl 2009-07-13 16:32:31.000000000 +0900
@@ -82,6 +82,7 @@
max_num_cached_files = 400,
max_num_cached_bytes = 1000000, %% 1 MEG
max_size_cached_file = 8000,
+ max_connections = nolimit, %% max number of TCP connections to accept
large_file_chunk_size = 10240,
mnesia_dir = [],
log_wrap_size = 10000000, % wrap logs after 10M
--- ./yaws-1.84/src/yaws_server.erl.orig 2009-07-06 03:20:13.000000000 +0900
+++ ./yaws-1.84/src/yaws_server.erl 2009-08-03 12:38:14.000000000 +0900
@@ -56,6 +56,7 @@
certinfo, %% undefined | #certinfo{}
l, %% listen socket
mnum = 0,
+ connections = 0, %% number of TCP connections opened now
sessions = 0, %% number of active HTTP sessions
reqs = 0}). %% total number of processed HTTP requests
@@ -577,18 +578,25 @@
{From , status} ->
From ! {self(), GS},
gserv_loop(GS, Ready, Rnum, Last);
- {_From, next} when Ready == [] ->
- New = acceptor(GS),
- gserv_loop(GS#gs{sessions = GS#gs.sessions + 1}, Ready, Rnum, New);
- {_From, next} ->
+ {_From, next, Accepted} when Ready == [] ->
+ close_accepted_if_max(GS,Accepted),
+ New = acceptor(GS),
+ GS2 = inc_con(GS),
+ gserv_loop(GS2#gs{sessions = GS2#gs.sessions + 1}, Ready, Rnum, New);
+ {_From, next, Accepted} ->
+ close_accepted_if_max(GS,Accepted),
[{_Then, R}|RS] = Ready,
R ! {self(), accept},
- gserv_loop(GS, RS, Rnum-1, R);
+ GS2 = inc_con(GS),
+ gserv_loop(GS2, RS, Rnum-1, R);
+ {_From, decrement} ->
+ GS2 = dec_con(GS),
+ gserv_loop(GS2, Ready, Rnum, Last);
{From, done_client, Int} ->
GS2 = if
- Int == 0 -> GS#gs{sessions = GS#gs.sessions - 1};
- Int > 0 -> GS#gs{sessions = GS#gs.sessions - 1,
- reqs = GS#gs.reqs + Int}
+ Int == 0 -> dec_con(GS#gs{sessions = GS#gs.sessions - 1});
+ Int > 0 -> dec_con(GS#gs{sessions = GS#gs.sessions - 1,
+ reqs = GS#gs.reqs + Int})
end,
if
Rnum == 8 ->
@@ -877,7 +885,7 @@
?TC([{record, GS, gs}]),
put(gc, GS#gs.gconf),
X = do_accept(GS),
- Top ! {self(), next},
+ Top ! {self(), next, X},
case X of
{ok, Client} ->
if
@@ -888,6 +896,7 @@
{error, Reason} ->
error_logger:format("SSL accept failed: ~p~n",
[Reason]),
+ Top ! {self(), decrement},
exit(normal)
end;
true ->
@@ -918,20 +927,26 @@
{ok, Int} when is_integer(Int) ->
Top ! {self(), done_client, Int};
{'EXIT', normal} ->
+ Top ! {self(), decrement},
exit(normal);
{'EXIT', shutdown} ->
exit(shutdown);
{'EXIT', {error, einval}} ->
%% Typically clients that close their end of the socket
%% don't log. Happens all the time.
+ Top ! {self(), decrement},
exit(normal);
{'EXIT', {{error, einval}, _}} ->
+ Top ! {self(), decrement},
exit(normal);
{'EXIT', {error, closed}} ->
+ Top ! {self(), decrement},
exit(normal);
{'EXIT', {{error, closed}, _}} ->
+ Top ! {self(), decrement},
exit(normal);
{'EXIT', {{error, econnreset},_}} ->
+ Top ! {self(), decrement},
exit(normal);
{'EXIT', Reason2} ->
error_logger:error_msg("Yaws process died: ~p~n",
@@ -964,6 +979,7 @@
end;
{error, closed} ->
%% This is what happens when we call yaws --stop
+ Top ! {self(), decrement},
exit(normal);
ERR ->
%% When we fail to accept, the correct thing to do
@@ -4282,3 +4298,19 @@
%% specified in conf file for the 'vdir' directive.
Result.
+close_accepted_if_max(GS,{ok, Socket}) ->
+ MaxCon = (GS#gs.gconf)#gconf.max_connections,
+ NumCon = GS#gs.connections,
+ if MaxCon == nolimit orelse NumCon < MaxCon ->
+ ok;
+ true ->
+ gen_tcp:close(Socket)
+ end;
+close_accepted_if_max(_,_) ->
+ ok.
+
+inc_con(GS) ->
+ GS#gs{connections=GS#gs.connections + 1}.
+
+dec_con(GS) ->
+ GS#gs{connections=GS#gs.connections - 1}.
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Erlyaws-list mailing list
Erlyaws-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/erlyaws-list
Post received from mailinglist |
|
|
| Back to top |
|
| Guest |
Posted: Mon Aug 17, 2009 7:03 pm |
|
|
|
Guest
|
Thanks for the info. I will be looking into implementing this.
Cheers
Jan
satoshi kinoshita wrote:
> At Mon, 17 Aug 2009 09:46:54 +0900,
> Ngoc Dao wrote:
>
>> [1 <multipart/alternative (7bit)>]
>> [1.1 <text/plain; UTF-8 (7bit)>]
>>
>> [1.2 <text/html; UTF-8 (quoted-printable)>]
>> How about listen_backlog (http://yaws.hyber.org/yman.yaws?page=yaws.conf)?
>>
>> Ngoc
>>
>> On Sun, Aug 16, 2009 at 6:34 PM, Jan Jacobs <hpjcon@mweb.co.za> wrote:
>>
>> Hi,
>>
>> Is it possible to limit the number of connections that YAWs will handle?
>>
>
>
> Hi,
>
> Attached below is a patch to add a feature to limit
> the number of simultanious connections to accept.
> It's adding one new proprerty to gconf to specifiy the max number
> and a new status value to remember the number of connetions
> currently opened.
>
> yaws_server compares those two values and decide to or not to
> accept more connections.
> More precisely, it accepts TCP connections any way and will close it
> if it's more than the max.
>
> We're going to use this feature for our products and hope
> we can share this with people who are intertested.
>
> Thanks,
> Kinoshita / Gemini Mobile Technologies
>
>
> --- yaws-1.84/include/yaws.hrl.orig 2009-05-29 06:05:44.000000000 +0900
> +++ yaws-1.84/include/yaws.hrl 2009-07-13 16:32:31.000000000 +0900
> @@ -82,6 +82,7 @@
> max_num_cached_files = 400,
> max_num_cached_bytes = 1000000, %% 1 MEG
> max_size_cached_file = 8000,
> + max_connections = nolimit, %% max number of TCP connections to accept
> large_file_chunk_size = 10240,
> mnesia_dir = [],
> log_wrap_size = 10000000, % wrap logs after 10M
>
> --- ./yaws-1.84/src/yaws_server.erl.orig 2009-07-06 03:20:13.000000000 +0900
> +++ ./yaws-1.84/src/yaws_server.erl 2009-08-03 12:38:14.000000000 +0900
> @@ -56,6 +56,7 @@
> certinfo, %% undefined | #certinfo{}
> l, %% listen socket
> mnum = 0,
> + connections = 0, %% number of TCP connections opened now
> sessions = 0, %% number of active HTTP sessions
> reqs = 0}). %% total number of processed HTTP requests
>
> @@ -577,18 +578,25 @@
> {From , status} ->
> From ! {self(), GS},
> gserv_loop(GS, Ready, Rnum, Last);
> - {_From, next} when Ready == [] ->
> - New = acceptor(GS),
> - gserv_loop(GS#gs{sessions = GS#gs.sessions + 1}, Ready, Rnum, New);
> - {_From, next} ->
> + {_From, next, Accepted} when Ready == [] ->
> + close_accepted_if_max(GS,Accepted),
> + New = acceptor(GS),
> + GS2 = inc_con(GS),
> + gserv_loop(GS2#gs{sessions = GS2#gs.sessions + 1}, Ready, Rnum, New);
> + {_From, next, Accepted} ->
> + close_accepted_if_max(GS,Accepted),
> [{_Then, R}|RS] = Ready,
> R ! {self(), accept},
> - gserv_loop(GS, RS, Rnum-1, R);
> + GS2 = inc_con(GS),
> + gserv_loop(GS2, RS, Rnum-1, R);
> + {_From, decrement} ->
> + GS2 = dec_con(GS),
> + gserv_loop(GS2, Ready, Rnum, Last);
> {From, done_client, Int} ->
> GS2 = if
> - Int == 0 -> GS#gs{sessions = GS#gs.sessions - 1};
> - Int > 0 -> GS#gs{sessions = GS#gs.sessions - 1,
> - reqs = GS#gs.reqs + Int}
> + Int == 0 -> dec_con(GS#gs{sessions = GS#gs.sessions - 1});
> + Int > 0 -> dec_con(GS#gs{sessions = GS#gs.sessions - 1,
> + reqs = GS#gs.reqs + Int})
> end,
> if
> Rnum == 8 ->
> @@ -877,7 +885,7 @@
> ?TC([{record, GS, gs}]),
> put(gc, GS#gs.gconf),
> X = do_accept(GS),
> - Top ! {self(), next},
> + Top ! {self(), next, X},
> case X of
> {ok, Client} ->
> if
> @@ -888,6 +896,7 @@
> {error, Reason} ->
> error_logger:format("SSL accept failed: ~p~n",
> [Reason]),
> + Top ! {self(), decrement},
> exit(normal)
> end;
> true ->
> @@ -918,20 +927,26 @@
> {ok, Int} when is_integer(Int) ->
> Top ! {self(), done_client, Int};
> {'EXIT', normal} ->
> + Top ! {self(), decrement},
> exit(normal);
> {'EXIT', shutdown} ->
> exit(shutdown);
> {'EXIT', {error, einval}} ->
> %% Typically clients that close their end of the socket
> %% don't log. Happens all the time.
> + Top ! {self(), decrement},
> exit(normal);
> {'EXIT', {{error, einval}, _}} ->
> + Top ! {self(), decrement},
> exit(normal);
> {'EXIT', {error, closed}} ->
> + Top ! {self(), decrement},
> exit(normal);
> {'EXIT', {{error, closed}, _}} ->
> + Top ! {self(), decrement},
> exit(normal);
> {'EXIT', {{error, econnreset},_}} ->
> + Top ! {self(), decrement},
> exit(normal);
> {'EXIT', Reason2} ->
> error_logger:error_msg("Yaws process died: ~p~n",
> @@ -964,6 +979,7 @@
> end;
> {error, closed} ->
> %% This is what happens when we call yaws --stop
> + Top ! {self(), decrement},
> exit(normal);
> ERR ->
> %% When we fail to accept, the correct thing to do
> @@ -4282,3 +4298,19 @@
> %% specified in conf file for the 'vdir' directive.
> Result.
>
> +close_accepted_if_max(GS,{ok, Socket}) ->
> + MaxCon = (GS#gs.gconf)#gconf.max_connections,
> + NumCon = GS#gs.connections,
> + if MaxCon == nolimit orelse NumCon < MaxCon ->
> + ok;
> + true ->
> + gen_tcp:close(Socket)
> + end;
> +close_accepted_if_max(_,_) ->
> + ok.
> +
> +inc_con(GS) ->
> + GS#gs{connections=GS#gs.connections + 1}.
> +
> +dec_con(GS) ->
> + GS#gs{connections=GS#gs.connections - 1}.
>
> ------------------------------------------------------------------------------
> Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
> trial. Simplify your report design, integration and deployment - and focus on
> what you do best, core application coding. Discover what's new with
> Crystal Reports now. http://p.sf.net/sfu/bobj-july
> _______________________________________________
> Erlyaws-list mailing list
> Erlyaws-list@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/erlyaws-list
> ------------------------------------------------------------------------
>
>
> No virus found in this incoming message.
> Checked by AVG - www.avg.com
> Version: 8.5.392 / Virus Database: 270.13.58/2306 - Release Date: 08/16/09 06:09:00
>
>
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Erlyaws-list mailing list
Erlyaws-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/erlyaws-list
Post received from mailinglist |
|
|
| Back to top |
|
| Guest |
Posted: Mon Aug 17, 2009 8:39 pm |
|
|
|
Guest
|
satoshi kinoshita wrote:
> Attached below is a patch to add a feature to limit
> the number of simultanious connections to accept.
Thanks, I like the simple solution of closing the last socket
instead of not accepting. I cleaned up the patch, documented
it and applied.
Thanks
/klacke
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Erlyaws-list mailing list
Erlyaws-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/erlyaws-list
Post received from mailinglist |
|
|
| Back to top |
|
|
|
All times are GMT
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You can attach files in this forum You can download files in this forum
|
|
|