Re: [sip-overload] WGLC: draft-ietf-soc-overload-control
Adam Roach <adam@nostrum.com> Wed, 07 March 2012 19:13 UTC
Return-Path: <adam@nostrum.com>
X-Original-To: sip-overload@ietfa.amsl.com
Delivered-To: sip-overload@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix)
with ESMTP id EA7E611E8072 for <sip-overload@ietfa.amsl.com>;
Wed, 7 Mar 2012 11:13:19 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -102.484
X-Spam-Level:
X-Spam-Status: No, score=-102.484 tagged_above=-999 required=5 tests=[AWL=0.116,
BAYES_00=-2.599, SPF_PASS=-0.001, USER_IN_WHITELIST=-100]
Received: from mail.ietf.org ([12.22.58.30]) by localhost (ietfa.amsl.com
[127.0.0.1]) (amavisd-new, port 10024) with ESMTP id rQ3X0Bbwf94P for
<sip-overload@ietfa.amsl.com>; Wed, 7 Mar 2012 11:13:19 -0800 (PST)
Received: from nostrum.com (nostrum-pt.tunnel.tserv2.fmt.ipv6.he.net
[IPv6:2001:470:1f03:267::2]) by ietfa.amsl.com (Postfix) with ESMTP id
1FD9321F85AA for <sip-overload@ietf.org>;
Wed, 7 Mar 2012 11:13:18 -0800 (PST)
Received: from dn3-228.estacado.net (vicuna-alt.estacado.net [75.53.54.121])
(authenticated bits=0) by nostrum.com (8.14.3/8.14.3) with ESMTP id
q27JD6tk082593 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256
verify=NO);
Wed, 7 Mar 2012 13:13:08 -0600 (CST) (envelope-from adam@nostrum.com)
Message-ID: <4F57B342.2000209@nostrum.com>
Date: Wed, 07 Mar 2012 13:13:06 -0600
From: Adam Roach <adam@nostrum.com>
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6;
rv:10.0) Gecko/20120129 Thunderbird/10.0
MIME-Version: 1.0
To: Salvatore Loreto <salvatore.loreto@ericsson.com>
References: <4F4FB86C.2030908@ericsson.com>
In-Reply-To: <4F4FB86C.2030908@ericsson.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Received-SPF: pass (nostrum.com: 75.53.54.121 is authenticated by a trusted
mechanism)
Cc: Volker Hilt <volker.hilt@alcatel-lucent.com>,
"sip-overload@ietf.org" <sip-overload@ietf.org>
Subject: Re: [sip-overload] WGLC: draft-ietf-soc-overload-control
X-BeenThere: sip-overload@ietf.org
X-Mailman-Version: 2.1.12
Precedence: list
List-Id: SIP Overload <sip-overload.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/sip-overload>,
<mailto:sip-overload-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/sip-overload>
List-Post: <mailto:sip-overload@ietf.org>
List-Help: <mailto:sip-overload-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/sip-overload>,
<mailto:sip-overload-request@ietf.org?subject=subscribe>
X-List-Received-Date: Wed, 07 Mar 2012 19:13:20 -0000
I'm a bit confused by the algorithm described in section 6.3.
First, it's not clear whether this is intended to apply to outbound
messages (i.e., "get_sip_msg" is getting a message from an internal
queue of things to be sent on the network) or inbound messages (i.e.,
"get_sip_msg" is getting a message from the network for processing). The
introduction to 6.3 obliquely hints that it might be for outbound
messages, but it's not really all that clear.
In any case, the pseudocode starts:
> cat1 := 40.0 // Category 1 --- subject to reduction
> cat2 := 100.0 - cat1 // Category 2 --- Not subject to
> // reduction. 40/60 mix.
> in_oc := false // Not operating under overload
>
> while (true) {
> sip_msg := get_sip_msg()
> if (is_response(sip_msg)) {
> process_msg(sip_msg)
> }
> else if (is_request(sip_msg)) {
>
> // Determine if server wants to enter overload or is
> // in overload
> in_oc := extract_in_oc(sip_msg)
>
> // Get validity value
> oc_validity := extract_oc_validity(sip_msg)
>
> // Get oc parameter value
> oc_value := extract_oc_value(sip_msg)
>
> pct_to_reduce := oc_value / cat1 * 100
> // Example: if oc=10,
> // server uses 10 / 40 * 100 = 25 or 25% of messages in
> // Category 1 can be reduced.
> ...
If you make assumptions about functions based on their names, this
attempts to extract oc value and oc validity information from the SIP
*request* messages. My reading of the rest of this document is that
*requests* will only have an empty, bare "oc" parameter in them. The
actual overload control information appears in *responses*. Right?
On the other hand, if this is really for outbound messages, then what
you need to do is store the OC data received from inbound responses
(which would be in a processing loop not shown here), and the handling
for outbound messages would really be computing the destination and then
looking up any overload information that might have been stored for that
destination. Right?
There's also the rather confusing bit here:
>
> // Either Category 1 or Category 2
> assign_msg_to_category(sip_msg)
>
> if (oc_validity is in effect) {
> process_msg(get_msg_from_cat2())
> sip_msg := get_msg_from_cat1()
>
> // Draw a random number between 1 and 100
> r := random()
>
> if (r <= pct_to_reduce) {
> // Do not send to server, handle locally by
> // generating a final response
> }
> else {
> process_msg(sip_msg)
> }
Is the intention here that the message, if it is in category 2, is
always sent, while the message, if it is in category 1, is subject to
the shaping rules? If so, this seems a rather baroque way to effect
that. Don't you mean something more like:
// Either Category 1 or Category 2
category := assign_msg_to_category(sip_msg)
if (oc_validity is in effect) {
if (category == 2) {
process_msg(sip_msg)
}
else
{
// Draw a random number between 1 and 100
r := random()
if (r <= pct_to_reduce) {
// Do not send to server, handle locally by
// generating a final response
}
else {
process_msg(sip_msg)
}
Except that's not quite right, since oc can be larger than cat 1. For
example, if we use the 40/60 mix you have in the draft, your proposed
amount to reduce looks like:
pct_to_reduce := oc_value / cat1 * 100
pct_to_reduce := 50 / 40 * 100
pct_to_reduce := 125
Of course, a 125% reduction in category 1 messages isn't possible, so
you're forced into reduction of category 2 messages. In other words, you
need to calculate pct_to_reduce based on the message type, and take
appropriate action when oc > cat1.
Finally, if you look at the codepath where "in_oc" is true but
"oc_validity is in effect" is false, then the message is never
processed. I think you really want to combine these into a single
logical statement like:
if (in_oc == false && oc_validity is in effect) {
send_message_to_network(sip_msg)
}
So, taking the above assumptions into account, I think you really want
something that looks more like:
cat1 := 40.0 // Category 1 --- subject to reduction
cat2 := 100.0 - cat1 // Category 2 --- Not subject to
// reduction. 40/60 mix.
in_oc := false // Not operating under overload
while (true) {
sip_msg := get_outbound_sip_msg()
if (is_response(sip_msg)) {
if (sip_msg.via has oc parameter)) {
add_overload_metrics(sip_msg)
}
send_message_to_network(sip_msg)
}
else if (is_request(sip_msg)) {
destination := get_next_hop(sip_msg)
// Determine if server wants to enter overload or is
// in overload
in_oc := lookup_in_oc(destination)
// Get validity value
oc_validity := lookup_oc_validity(destination)
// Get oc parameter value
oc_value := lookup_oc_value(destination)
if (in_oc == false or oc_validity is not in effect) {
send_message_to_network(sip_msg)
}
else {
// Either Category 1 or Category 2
category := assign_msg_to_category(sip_msg)
if (category == 1) {
pct_to_reduce := min (oc_value / cat1 * 100, 100)
// Example: if oc=10,
// server uses 10 / 40 * 100 = 25 or 25% of messages in
// Category 1 can be reduced.
}
else {
pct_to_reduce := max(0, oc_value / cat1 * 100 - 100)
// Example: if oc=50,
// server uses 50 / 40 * 100 - 100 = 25 or 25% of messages in
// Category 2 can be reduced.
}
// Draw a random number between 1 and 100
r := random()
if (r <= pct_to_reduce) {
// Do not send to server, handle locally by
// generating a final response
}
else {
send_message_to_network(sip_msg)
}
}
}
}
- [sip-overload] WGLC: draft-ietf-soc-overload-cont… Salvatore Loreto
- Re: [sip-overload] WGLC: draft-ietf-soc-overload-… Adam Roach