2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-22 01:51:26 +00:00

ofproto: Report controller rate limiting statistics in database.

Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Gurucharan Shetty <gshetty@nicira.com>
This commit is contained in:
Ben Pfaff 2014-07-17 10:31:03 -07:00
parent ff92993540
commit a413195ece
5 changed files with 136 additions and 32 deletions

1
NEWS
View File

@ -7,6 +7,7 @@ Post-v2.3.0
possible to generate or match options. This is planned for a future
release. The protocol is documented at
http://tools.ietf.org/html/draft-gross-geneve-00
- The OVS database now reports controller rate limiting statistics.
v2.3.0 - xx xxx xxxx

View File

@ -414,7 +414,10 @@ connmgr_get_memory_usage(const struct connmgr *mgr, struct simap *usage)
packets += rconn_count_txqlen(ofconn->rconn);
for (i = 0; i < N_SCHEDULERS; i++) {
packets += pinsched_count_txqlen(ofconn->schedulers[i]);
struct pinsched_stats stats;
pinsched_get_stats(ofconn->schedulers[i], &stats);
packets += stats.n_queued;;
}
packets += pktbuf_count_packets(ofconn->pktbuf);
}
@ -471,6 +474,7 @@ connmgr_get_controller_info(struct connmgr *mgr, struct shash *info)
time_t last_connection = rconn_get_last_connection(rconn);
time_t last_disconnect = rconn_get_last_disconnect(rconn);
int last_error = rconn_get_last_error(rconn);
int i;
shash_add(info, target, cinfo);
@ -494,6 +498,27 @@ connmgr_get_controller_info(struct connmgr *mgr, struct shash *info)
smap_add_format(&cinfo->pairs, "sec_since_disconnect",
"%ld", (long int) (now - last_disconnect));
}
for (i = 0; i < N_SCHEDULERS; i++) {
if (ofconn->schedulers[i]) {
const char *name = i ? "miss" : "action";
struct pinsched_stats stats;
pinsched_get_stats(ofconn->schedulers[i], &stats);
smap_add_nocopy(&cinfo->pairs,
xasprintf("packet-in-%s-backlog", name),
xasprintf("%u", stats.n_queued));
smap_add_nocopy(&cinfo->pairs,
xasprintf("packet-in-%s-bypassed", name),
xasprintf("%llu", stats.n_normal));
smap_add_nocopy(&cinfo->pairs,
xasprintf("packet-in-%s-queued", name),
xasprintf("%llu", stats.n_limited));
smap_add_nocopy(&cinfo->pairs,
xasprintf("packet-in-%s-dropped", name),
xasprintf("%llu", stats.n_queue_dropped));
}
}
}
}
}

View File

@ -295,10 +295,17 @@ pinsched_set_limits(struct pinsched *ps, int rate_limit, int burst_limit)
}
}
/* Returns the number of packets scheduled to be sent eventually by 'ps'.
* Returns 0 if 'ps' is null. */
unsigned int
pinsched_count_txqlen(const struct pinsched *ps)
/* Retrieves statistics for 'ps'. The statistics will be all zero if 'ps' is
* null. */
void
pinsched_get_stats(const struct pinsched *ps, struct pinsched_stats *stats)
{
return ps ? ps->n_queued : 0;
if (ps) {
stats->n_queued = ps->n_queued;
stats->n_normal = ps->n_normal;
stats->n_limited = ps->n_limited;
stats->n_queue_dropped = ps->n_queue_dropped;
} else {
memset(stats, 0, sizeof *stats);
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -33,6 +33,13 @@ void pinsched_send(struct pinsched *, ofp_port_t port_no, struct ofpbuf *,
void pinsched_run(struct pinsched *, struct list *txq);
void pinsched_wait(struct pinsched *);
unsigned int pinsched_count_txqlen(const struct pinsched *);
struct pinsched_stats {
unsigned int n_queued; /* # currently queued to send. */
unsigned long long n_normal; /* # txed w/o rate limit queuing. */
unsigned long long n_limited; /* # queued for rate limiting. */
unsigned long long n_queue_dropped; /* # dropped due to queue overflow. */
};
void pinsched_get_stats(const struct pinsched *, struct pinsched_stats *);
#endif /* pinsched.h */

View File

@ -3223,7 +3223,7 @@
</column>
</group>
<group title="Asynchronous Message Configuration">
<group title="Asynchronous Messages">
<p>
OpenFlow switches send certain messages to controllers spontanenously,
that is, not in response to any request from the controller. These
@ -3243,38 +3243,102 @@
on any messages that it does want to receive, if any.
</column>
<column name="controller_rate_limit">
<group title="Controller Rate Limiting">
<p>
The maximum rate at which the switch will forward packets to the
OpenFlow controller, in packets per second. This feature prevents a
single bridge from overwhelming the controller. If not specified,
the default is implementation-specific.
A switch can forward packets to a controller over the OpenFlow
protocol. Forwarding packets this way at too high a rate can
overwhelm a controller, frustrate use of the OpenFlow connection for
other purposes, increase the latency of flow setup, and use an
unreasonable amount of bandwidth. Therefore, Open vSwitch supports
limiting the rate of packet forwarding to a controller.
</p>
<p>
In addition, when a high rate triggers rate-limiting, Open vSwitch
queues controller packets for each port and transmits them to the
controller at the configured rate. The <ref
column="controller_burst_limit"/> value limits the number of queued
packets. Ports on a bridge share the packet queue fairly.
There are two main reasons in OpenFlow for a packet to be sent to a
controller: either the packet ``misses'' in the flow table, that is,
there is no matching flow, or a flow table action says to send the
packet to the controller. Open vSwitch limits the rate of each kind
of packet separately at the configured rate. Therefore, the actual
rate that packets are sent to the controller can be up to twice the
configured rate, when packets are sent for both reasons.
</p>
<p>
Open vSwitch maintains two such packet rate-limiters per bridge: one
for packets sent up to the controller because they do not correspond
to any flow, and the other for packets sent up to the controller by
request through flow actions. When both rate-limiters are filled with
packets, the actual rate that packets are sent to the controller is
up to twice the specified rate.
This feature is specific to forwarding packets over an OpenFlow
connection. It is not general-purpose QoS. See the <ref
table="QoS"/> table for quality of service configuration, and <ref
column="ingress_policing_rate" table="Interface"/> in the <ref
table="Interface"/> table for ingress policing configuration.
</p>
</column>
<column name="controller_burst_limit">
In conjunction with <ref column="controller_rate_limit"/>,
the maximum number of unused packet credits that the bridge will
allow to accumulate, in packets. If not specified, the default
is implementation-specific.
</column>
<column name="controller_rate_limit">
<p>
The maximum rate at which the switch will forward packets to the
OpenFlow controller, in packets per second. If no value is
specified, rate limiting is disabled.
</p>
</column>
<column name="controller_burst_limit">
<p>
When a high rate triggers rate-limiting, Open vSwitch queues
packets to the controller for each port and transmits them to the
controller at the configured rate. This value limits the number of
queued packets. Ports on a bridge share the packet queue fairly.
</p>
<p>
This value has no effect unless <ref
column="controller_rate_limit"/> is configured. The current
default when this value is not specified is one-quarter of <ref
column="controller_rate_limit"/>, meaning that queuing can delay
forwarding a packet to the controller by up to 250 ms.
</p>
</column>
<group title="Controller Rate Limiting Statistics">
<p>
These values report the effects of rate limiting. Their values are
relative to establishment of the most recent OpenFlow connection,
or since rate limiting was enabled, whichever happened more
recently. Each consists of two values, one with <code>TYPE</code>
replaced by <code>miss</code> for rate limiting flow table misses,
and the other with <code>TYPE</code> replaced by
<code>action</code> for rate limiting packets sent by OpenFlow
actions.
</p>
<p>
These statistics are reported only when controller rate limiting is
enabled.
</p>
<column name="status" key="packet-in-TYPE-bypassed"
type='{"type": "integer", "minInteger": 0}'>
Number of packets sent directly to the controller, without queuing,
because the rate did not exceed the configured maximum.
</column>
<column name="status" key="packet-in-TYPE-queued"
type='{"type": "integer", "minInteger": 0}'>
Number of packets added to the queue to send later.
</column>
<column name="status" key="packet-in-TYPE-dropped"
type='{"type": "integer", "minInteger": 0}'>
Number of packets added to the queue that were later dropped due to
overflow. This value is less than or equal to <ref column="status"
key="packet-in-TYPE-queued"/>.
</column>
<column name="status" key="packet-in-TYPE-backlog"
type='{"type": "integer", "minInteger": 0}'>
Number of packets currently queued. The other statistics increase
monotonically, but this one fluctuates between 0 and the <ref
column="controller_burst_limit"/> as conditions change.
</column>
</group>
</group>
</group>
<group title="Additional In-Band Configuration">