[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] xen/netfront: improve truesize tracking



Wednesday, December 19, 2012, 5:17:49 PM, you wrote:

> On Wed, 2012-12-19 at 12:34 +0100, Sander Eikelenboom wrote:

>> Hi Ian,
>> 
>> It ran overnight and i haven't seen the warn_once trigger.
>> (but i also didn't with the previous patch)
>> 

> As I said, the miminum value to not trigger the warning was what Ian
> patch was doing, but it was still a not accurate estimation.

> Doing the real accounting might trigger slow transferts, or dropped
> packets because of socket limits (SNDBUF / RCVBUF) being hit sooner.

> So the real question was : If accounting for full pages, is your
> applications run as smooth as before, with no huge performance
> regression ?

Ok i have added some extra debug info (see diff's below), the code still uses 
the old calculation for truesize (in the hope to trigger the warn_on_once 
again), but also calculates the variants IanC came up with.

I haven't got a clear test case to trigger the warn_on_once, it happens just 
every once in a while during my normal usage and i'm not a netperf expert :-)
So at the moment i haven't been able to trigger the warn_on_once yet, but the 
results so far do seem to shed some light ..

- The first variant (current code) seems to be the most effcient and a good 
estimation *most* of the the, but sometimes triggers the warn_on_once in 
skb_try_coalesce.
- The first variant (current code) seems to always substract from the truesize 
for small packets.
- The second variant always seems keep the truesize as is for most of the small 
network traffic, but it also seems to work ok for larger packets.
- The third variant seems to be a pretty wasteful estimation.

So the last variant seems to be rather wasteful, and the second one the most 
accurate so far.

Eric:
     From the warn_on_once, delta should be smaller than len, but probably they 
should be as close together as possible.
     When you say "accurate estimation", what would be a acceptable difference 
between DELTA and LEN ?



[  116.965062] eth0: mtu:1500 data_len:42 len before:0 len after:42 truesize 
before:896 truesize after:682 nr_frags:1 variant1:-214(682) variant2:0(896) 
variant3:4096(4992)
[  117.094538] eth0: mtu:1500 data_len:54 len before:0 len after:54 truesize 
before:896 truesize after:694 nr_frags:1 variant1:-202(694) variant2:0(896) 
variant3:4096(4992)
[  117.094707] eth0: mtu:1500 data_len:54 len before:0 len after:54 truesize 
before:896 truesize after:694 nr_frags:1 variant1:-202(694) variant2:0(896) 
variant3:4096(4992)
[  117.094869] eth0: mtu:1500 data_len:54 len before:0 len after:54 truesize 
before:896 truesize after:694 nr_frags:1 variant1:-202(694) variant2:0(896) 
variant3:4096(4992)
[  117.095058] eth0: mtu:1500 data_len:54 len before:0 len after:54 truesize 
before:896 truesize after:694 nr_frags:1 variant1:-202(694) variant2:0(896) 
variant3:4096(4992)
[  117.095216] eth0: mtu:1500 data_len:54 len before:0 len after:54 truesize 
before:896 truesize after:694 nr_frags:1 variant1:-202(694) variant2:0(896) 
variant3:4096(4992)
[  117.096102] eth0: mtu:1500 data_len:54 len before:0 len after:54 truesize 
before:896 truesize after:694 nr_frags:1 variant1:-202(694) variant2:0(896) 
variant3:4096(4992)
[  117.096311] eth0: mtu:1500 data_len:54 len before:0 len after:54 truesize 
before:896 truesize after:694 nr_frags:1 variant1:-202(694) variant2:0(896) 
variant3:4096(4992)
[  117.096373] eth0: mtu:1500 data_len:54 len before:0 len after:54 truesize 
before:896 truesize after:694 nr_frags:1 variant1:-202(694) variant2:0(896) 
variant3:4096(4992)
[  117.150398] eth0: mtu:1500 data_len:54 len before:0 len after:54 truesize 
before:896 truesize after:694 nr_frags:1 variant1:-202(694) variant2:0(896) 
variant3:4096(4992)
[  117.150459] eth0: mtu:1500 data_len:54 len before:0 len after:54 truesize 
before:896 truesize after:694 nr_frags:1 variant1:-202(694) variant2:0(896) 
variant3:4096(4992)
[  117.536901] eth0: mtu:1500 data_len:53642 len before:0 len after:53642 
truesize before:896 truesize after:54282 nr_frags:14 variant1:53386(54282) 
variant2:53386(54282) variant3:57344(58240)
[  117.537463] eth0: mtu:1500 data_len:15994 len before:0 len after:15994 
truesize before:896 truesize after:16634 nr_frags:5 variant1:15738(16634) 
variant2:15738(16634) variant3:20480(21376)
[  117.537915] eth0: mtu:1500 data_len:17442 len before:0 len after:17442 
truesize before:896 truesize after:18082 nr_frags:5 variant1:17186(18082) 
variant2:17186(18082) variant3:20480(21376)
[  117.538543] eth0: mtu:1500 data_len:18890 len before:0 len after:18890 
truesize before:896 truesize after:19530 nr_frags:6 variant1:18634(19530) 
variant2:18634(19530) variant3:24576(25472)
[  117.539223] eth0: mtu:1500 data_len:13098 len before:0 len after:13098 
truesize before:896 truesize after:13738 nr_frags:4 variant1:12842(13738) 
variant2:12842(13738) variant3:16384(17280)
[  117.539283] eth0: mtu:1500 data_len:7306 len before:0 len after:7306 
truesize before:896 truesize after:7946 nr_frags:2 variant1:7050(7946) 
variant2:7050(7946) variant3:8192(9088)
[  117.539403] skbuff: to: (null) from: (null)  skb_try_coalesce: DELTA - LEN > 
100 delta:7690 len:7240 from->truesize:7946 skb_headlen(from):190 
skb_shinfo(to)->nr_frags:5 skb_shinfo(from)->nr_frags:2
[  117.540035] eth0: mtu:1500 data_len:4410 len before:0 len after:4410 
truesize before:896 truesize after:5050 nr_frags:3 variant1:4154(5050) 
variant2:4304(5200) variant3:12288(13184)
[  117.540153] eth0: mtu:1500 data_len:1018 len before:0 len after:1018 
truesize before:896 truesize after:1658 nr_frags:1 variant1:762(1658) 
variant2:762(1658) variant3:4096(4992)
[  121.981917] net_ratelimit: 27 callbacks suppressed
[  121.981960] eth0: mtu:1500 data_len:42 len before:0 len after:42 truesize 
before:896 truesize after:682 nr_frags:1 variant1:-214(682) variant2:0(896) 
variant3:4096(4992)
[  122.985019] eth0: mtu:1500 data_len:42 len before:0 len after:42 truesize 
before:896 truesize after:682 nr_frags:1 variant1:-214(682) variant2:0(896) 
variant3:4096(4992)
[  123.988308] eth0: mtu:1500 data_len:42 len before:0 len after:42 truesize 
before:896 truesize after:682 nr_frags:1 variant1:-214(682) variant2:0(896) 
variant3:4096(4992)
[  124.991961] eth0: mtu:1500 data_len:42 len before:0 len after:42 truesize 
before:896 truesize after:682 nr_frags:1 variant1:-214(682) variant2:0(896) 
variant3:4096(4992)
[  125.995003] eth0: mtu:1500 data_len:42 len before:0 len after:42 truesize 
before:896 truesize after:682 nr_frags:1 variant1:-214(682) variant2:0(896) 
variant3:4096(4992)
[  126.998324] eth0: mtu:1500 data_len:42 len before:0 len after:42 truesize 
before:896 truesize after:682 nr_frags:1 variant1:-214(682) variant2:0(896) 
variant3:4096(4992)



diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index c26e28b..8833e38 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -964,6 +964,7 @@ static int xennet_poll(struct napi_struct *napi, int budget)
        struct sk_buff_head tmpq;
        unsigned long flags;
        int err;
+       int tsz,len;

        spin_lock(&np->rx_lock);

@@ -1037,9 +1038,22 @@ err:
                 * receive throughout using the standard receive
                 * buffer size was cut by 25%(!!!).
                 */
-               skb->truesize += skb->data_len - RX_COPY_THRESHOLD;
+
+
+
+
+                tsz = skb->truesize;
+                len = skb->len;
+                /* skb->truesize += PAGE_SIZE * skb_shinfo(skb)->nr_frags; */
+                skb->truesize += skb->data_len - RX_COPY_THRESHOLD;
                skb->len += skb->data_len;

+               net_warn_ratelimited("%s: mtu:%d data_len:%d len before:%d len 
after:%d truesize before:%d truesize after:%d nr_frags:%d variant1:%d(%d) 
variant2:%d(%d) variant3:%d(%d) \n",
+                        skb->dev->name, skb->dev->mtu, skb->data_len, len,  
skb->len,tsz, skb->truesize, skb_shinfo(skb)->nr_frags,
+                        skb->data_len - RX_COPY_THRESHOLD, tsz + skb->data_len 
- RX_COPY_THRESHOLD ,
+                        skb->data_len - NETFRONT_SKB_CB(skb)->pull_to, tsz + 
skb->data_len - NETFRONT_SKB_CB(skb)->pull_to,
+                        PAGE_SIZE * skb_shinfo(skb)->nr_frags, tsz + 
(PAGE_SIZE * skb_shinfo(skb)->nr_frags));
+
                if (rx->flags & XEN_NETRXF_csum_blank)
                        skb->ip_summed = CHECKSUM_PARTIAL;
                else if (rx->flags & XEN_NETRXF_data_validated)
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 3ab989b..6d0cd86 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -3471,6 +3471,16 @@ bool skb_try_coalesce(struct sk_buff *to, struct sk_buff 
*from,

        WARN_ON_ONCE(delta < len);

+       if(delta < len) {
+               net_warn_ratelimited("to: %s from: %s  skb_try_coalesce: DELTA 
< LEN delta:%d len:%d from->truesize:%d skb_headlen(from):%d 
skb_shinfo(to)->nr_frags:%d skb_shinfo(from)->nr_frags:%d \n",
+                        to->dev->name, from->dev->name, delta, len, 
from->truesize, skb_headlen(from), skb_shinfo(to)->nr_frags, 
skb_shinfo(from)->nr_frags);
+       }
+
+       if (delta > len && delta - len > 100) {
+               net_warn_ratelimited("to: %s from: %s  skb_try_coalesce: DELTA 
- LEN > 100 delta:%d len:%d from->truesize:%d skb_headlen(from):%d 
skb_shinfo(to)->nr_frags:%d skb_shinfo(from)->nr_frags:%d \n",
+                        to->dev->name,from->dev->name, delta, len, 
from->truesize, skb_headlen(from), skb_shinfo(to)->nr_frags, 
skb_shinfo(from)->nr_frags);
+       }
+
        memcpy(skb_shinfo(to)->frags + skb_shinfo(to)->nr_frags,
               skb_shinfo(from)->frags,
               skb_shinfo(from)->nr_frags * sizeof(skb_frag_t));










_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.