While running a single stream UDPv6 test, we observed that amount
of CPU spent in NET_RX softirq was much greater than UDPv4 for an
equivalent receive rate. The test here was run on an ARM64 based
Android system. On further analysis with perf, we found that UDPv6
was spending significant time in the statistics netfilter targets
which did socket lookup per packet. These statistics rules perform
a lookup when there is no socket associated with the skb. Since
there are multiple instances of these rules based on UID, there
will be equal number of lookups per skb.
By introducing early demux for UDPv6, we avoid the redundant lookups.
This also helped to improve the performance (800Mbps -> 870Mbps) on a
CPU limited system in a single stream UDPv6 receive test with 1450
byte sized datagrams using iperf.
Signed-off-by: Subash Abhinov Kasiviswanathan <redacted>
---
net/ipv6/udp.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+)
@@ -1365,6 +1424,7 @@ int compat_udpv6_getsockopt(struct sock *sk, int level, int optname,#endifstaticconststructinet6_protocoludpv6_protocol={+.early_demux=udp_v6_early_demux,.handler=udpv6_rcv,.err_handler=udpv6_err,.flags=INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
From: Eric Dumazet <hidden> Date: 2017-03-08 18:49:52
On Wed, 2017-03-08 at 11:24 -0700, Subash Abhinov Kasiviswanathan wrote:
While running a single stream UDPv6 test, we observed that amount
of CPU spent in NET_RX softirq was much greater than UDPv4 for an
equivalent receive rate. The test here was run on an ARM64 based
Android system. On further analysis with perf, we found that UDPv6
was spending significant time in the statistics netfilter targets
which did socket lookup per packet. These statistics rules perform
a lookup when there is no socket associated with the skb. Since
there are multiple instances of these rules based on UID, there
will be equal number of lookups per skb.
By introducing early demux for UDPv6, we avoid the redundant lookups.
This also helped to improve the performance (800Mbps -> 870Mbps) on a
CPU limited system in a single stream UDPv6 receive test with 1450
byte sized datagrams using iperf.
Well, this 'optimization' actually hurts when UDP sockets are not
connected, since this adds an extra cache line miss per incoming packet.
(DNS servers for example)
Well, this 'optimization' actually hurts when UDP sockets are not
connected, since this adds an extra cache line miss per incoming
packet.
(DNS servers for example)
Hi Eric
Thanks for your comments. Would it be preferable to disable early demux
for the
servers with large unconnected workloads in that case?
From: Eric Dumazet <hidden> Date: 2017-03-08 19:31:31
On Wed, 2017-03-08 at 12:11 -0700, Subash Abhinov Kasiviswanathan wrote:
On 2017-03-08 11:40, Eric Dumazet wrote:
quoted
Well, this 'optimization' actually hurts when UDP sockets are not
connected, since this adds an extra cache line miss per incoming
packet.
(DNS servers for example)
Hi Eric
Thanks for your comments. Would it be preferable to disable early demux
for the
servers with large unconnected workloads in that case?
Well, many servers handle both TCP and UDP.
For TCP, there is no question about early demux, this is definitely a
win.
We probably should have one sysctl to enable TCP early demux, one for
UDP early demux.
From: Simon Horman <hidden> Date: 2017-04-18 08:09:10
On Wed, Mar 08, 2017 at 11:22:01AM -0800, Eric Dumazet wrote:
On Wed, 2017-03-08 at 12:11 -0700, Subash Abhinov Kasiviswanathan wrote:
quoted
On 2017-03-08 11:40, Eric Dumazet wrote:
quoted
Well, this 'optimization' actually hurts when UDP sockets are not
connected, since this adds an extra cache line miss per incoming
packet.
(DNS servers for example)
Hi Eric
Thanks for your comments. Would it be preferable to disable early demux
for the
servers with large unconnected workloads in that case?
Well, many servers handle both TCP and UDP.
For TCP, there is no question about early demux, this is definitely a
win.
We probably should have one sysctl to enable TCP early demux, one for
UDP early demux.
If early demux is a clear win for TCP then I wonder if it is
unnecessary and by some leap also undesirable to have a configuration
knob for that case.
On Wed, Mar 08, 2017 at 11:22:01AM -0800, Eric Dumazet wrote:
quoted
On Wed, 2017-03-08 at 12:11 -0700, Subash Abhinov Kasiviswanathan wrote:
quoted
On 2017-03-08 11:40, Eric Dumazet wrote:
quoted
Well, this 'optimization' actually hurts when UDP sockets are not
connected, since this adds an extra cache line miss per incoming
packet.
(DNS servers for example)
Hi Eric
Thanks for your comments. Would it be preferable to disable early demux
for the
servers with large unconnected workloads in that case?
Well, many servers handle both TCP and UDP.
For TCP, there is no question about early demux, this is definitely a
win.
We probably should have one sysctl to enable TCP early demux, one for
UDP early demux.
If early demux is a clear win for TCP then I wonder if it is
unnecessary and by some leap also undesirable to have a configuration
knob for that case.
For forwarding workloads it is pure overhead since the early demux will
never find a local socket, and therefore it is wasted work.
On Wed, Mar 08, 2017 at 11:22:01AM -0800, Eric Dumazet wrote:
quoted
On Wed, 2017-03-08 at 12:11 -0700, Subash Abhinov Kasiviswanathan wrote:
quoted
On 2017-03-08 11:40, Eric Dumazet wrote:
quoted
Well, this 'optimization' actually hurts when UDP sockets are not
connected, since this adds an extra cache line miss per incoming
packet.
(DNS servers for example)
Hi Eric
Thanks for your comments. Would it be preferable to disable early demux
for the
servers with large unconnected workloads in that case?
Well, many servers handle both TCP and UDP.
For TCP, there is no question about early demux, this is definitely a
win.
We probably should have one sysctl to enable TCP early demux, one for
UDP early demux.
If early demux is a clear win for TCP then I wonder if it is
unnecessary and by some leap also undesirable to have a configuration
knob for that case.
For forwarding workloads it is pure overhead since the early demux will
never find a local socket, and therefore it is wasted work.
Also for some more complicated fib rules setups the early demux logic
could end up causing doing wrong lookups, because some route might not
be actually local in one fib rule but it is in another one.
Bye,
Hannes
On Wed, Mar 08, 2017 at 11:22:01AM -0800, Eric Dumazet wrote:
quoted
On Wed, 2017-03-08 at 12:11 -0700, Subash Abhinov Kasiviswanathan wrote:
quoted
On 2017-03-08 11:40, Eric Dumazet wrote:
quoted
Well, this 'optimization' actually hurts when UDP sockets are not
connected, since this adds an extra cache line miss per incoming
packet.
(DNS servers for example)
Hi Eric
Thanks for your comments. Would it be preferable to disable early demux
for the
servers with large unconnected workloads in that case?
Well, many servers handle both TCP and UDP.
For TCP, there is no question about early demux, this is definitely a
win.
We probably should have one sysctl to enable TCP early demux, one for
UDP early demux.
If early demux is a clear win for TCP then I wonder if it is
unnecessary and by some leap also undesirable to have a configuration
knob for that case.
For forwarding workloads it is pure overhead since the early demux will
never find a local socket, and therefore it is wasted work.
Also for some more complicated fib rules setups the early demux logic
could end up causing doing wrong lookups, because some route might not
be actually local in one fib rule but it is in another one.
Thanks for the clarification. Knobs for both TCP and UDP now make perfect
sense to me.