* Perf data with recent tg3 patches
@ 2005-05-13 2:49 Arthur Kepner
[not found] ` <20050512.211935.67881321.davem@davemloft.net>
0 siblings, 1 reply; 9+ messages in thread
From: Arthur Kepner @ 2005-05-13 2:49 UTC (permalink / raw)
To: davem, mchan; +Cc: netdev
[-- Attachment #1: Type: TEXT/PLAIN, Size: 2940 bytes --]
Several tg3 patches have been recently posted, and I've
collected a bit of performance data with them. Mostly
I'm concerned about reducing per-interrupt overhead
(due to PIOs), and CPU Utilization, so the following data
shows how these patches change the number of received
packets/interrupt and CPU utilization.
(Let me know if I've missed any relevant patches.)
The data is labelled as follows:
-------------------------------
base : "vanilla" 2.6.12-rc2 kernel
base+mchan1-3 : 2.6.12-rc2 kernel + 3 patches
from mchan [1]
base+mchan1-3+tagged: 2.6.12-rc2 + 3 patches
from mchan [1] + tagged status
patch from davem [2]
base+mchan1-3+coal : 2.6.12-rc2 + 3 patches
from mchan [1] + tg3 interrupt
coalescence patch [3]
[1] http://marc.theaimsgroup.com/?l=linux-netdev&m=111446723510962&w=2
(This is one of a series of 3 patches - the others can't be
found in the archive. But they're all in 2.6.12-rc4.)
[2] http://marc.theaimsgroup.com/?l=linux-netdev&m=111567944730302&w=2
[3] http://marc.theaimsgroup.com/?l=linux-netdev&m=111586526522981&w=2
The system I used was an Altix with 1300MHz CPUs, and
a 5704 Broadcom NIC. The workload was bulk data receive
via TCP, with 1500 a byte MTU.
The following tables summarize the data in the attached
graphs. I had to (grossly) interpolate in some cases,
see the graphs for the real data.
CPU Util[%]
-------------------------------------
base base+ base+ base+
mchan1-3 mchan1-3+ mchan1-3+
Link Util[%] tagged coal
=====================================================
40 36 34 41 27
60 48 45 50 35
80 58 56 58 40
90 59 58 63 42
95 - 57 - 42
Packets/Intr
-------------------------------------
base base+ base+ base+
mchan1-3 mchan1-3+ mchan1-3+
Link Util[%] tagged coal
=====================================================
40 2.2 2.3 1.4 3.4
60 2.7 2.9 1.8 4.1
80 3.0 3.2 2.3 5.2
90 3.1 3.4 2.4 6.2
95 - 3.5 - 6.6
"mchan1-3" gets us up to ~.5 more packets/interrupt,
and adding the "coal" patch ~3.5 more. The "tagged"
patch made things a bit worse, though I haven't pinned
down exactly why that is. Processing more packets per
interrupt results in lower CPU utilization, largely
because we spend less time waiting for PIOs to flush.
--
Arthur
[-- Attachment #2: CPU utilization --]
[-- Type: IMAGE/PNG, Size: 3803 bytes --]
[-- Attachment #3: Received Packets/Interrupt --]
[-- Type: IMAGE/PNG, Size: 3622 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Perf data with recent tg3 patches
[not found] ` <20050512.211935.67881321.davem@davemloft.net>
@ 2005-05-13 23:57 ` Arthur Kepner
2005-05-14 0:50 ` David S. Miller
0 siblings, 1 reply; 9+ messages in thread
From: Arthur Kepner @ 2005-05-13 23:57 UTC (permalink / raw)
To: David S.Miller; +Cc: mchan, netdev
[-- Attachment #1: Type: TEXT/PLAIN, Size: 1932 bytes --]
On Thu, 12 May 2005, David S.Miller wrote:
> ......
> The tg3_interrupt coalesce patch from me is supposed
> to be applied on top of my tagged status patch.
>
OK, but the "tagged status" patch and the "hw
coalescing infrastructure" patch aren't really
dependent, right?
In any case, I've repeated the measurements with
both patches. Same experiment as yesterday.
The data is in the attached graphs is labelled as follows:
---------------------------------------------------------
base : is a "vanilla" 2.6.12-rc3 kernel
base+[1]+...+[i] : "vanilla" 2.6.12-rc3 kernel + patches
as labelled below
[1] http://marc.theaimsgroup.com/?l=linux-netdev&m=111446723510962&w=2
(This is one of a series of 3 patches - the others can't be
found in the archive. But they're all in 2.6.12-rc4.)
[2] http://marc.theaimsgroup.com/?l=linux-netdev&m=111567944730302&w=2
("tagged status" patch)
[3] http://marc.theaimsgroup.com/?l=linux-netdev&m=111586526522981&w=2
("hw coalescing infrastructure" patch)
The data I sent yesterday was also with 2.6.12-rc3 (I
mistakenly said it was rc2.) Also, I should have said
that I only used the default coalescence parameters
with [3] - didn't tune them with ethtool. Same is true
of today's data.
The graphs show that the tagged status patch ([2]) is
associated with fewer received packets/interrupt and
higher CPU utilization. I found that the reason is that,
under high receive load, most of the time (~80%) the
tag in the status block changes between the time that
it's read (and saved as last_tag) in tg3_poll(), and when
it's written back to MAILBOX_INTERRUPT_0 in
tg3_restart_ints(). If I understand the way the status
tag works, that means that the card will immediately
generate another interrupt. That's consistent with
what I'm seeing - a much higher interrupt rate when the
tagged status patch is used.
--
Arthur
[-- Attachment #2: CPU utilization --]
[-- Type: IMAGE/png, Size: 2991 bytes --]
[-- Attachment #3: Received Packets/Interrupt --]
[-- Type: IMAGE/png, Size: 2617 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Perf data with recent tg3 patches
2005-05-14 0:50 ` David S. Miller
@ 2005-05-14 0:39 ` Michael Chan
2005-05-14 5:20 ` David S. Miller
0 siblings, 1 reply; 9+ messages in thread
From: Michael Chan @ 2005-05-14 0:39 UTC (permalink / raw)
To: David S.Miller; +Cc: akepner, netdev
On Fri, 2005-05-13 at 17:50 -0700, David S.Miller wrote:
> Perhaps we can make the logic in tg3_poll() smarter about
> this. Something like:
>
> tg3_process_phy_events();
> tg3_tx();
> tg3_rx();
>
> if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
> tp->last_tag = sblk->status_tag;
> rmb();
> done = !tg3_has_work(tp);
> if (done) {
> spin_lock_irqsave(&tp->lock, flags);
> __netif_rx_complete(netdev);
> tg3_restart_ints(tp);
> spin_unlock_irqrestore(&tp->lock, flags);
> }
> return (done ? 0 : 1);
>
> Basically, move the last_tag sample to after we do the
> work, then recheck the RX/TX producer/consumer indexes.
>
I like this. I think it will work well.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Perf data with recent tg3 patches
2005-05-13 23:57 ` Arthur Kepner
@ 2005-05-14 0:50 ` David S. Miller
2005-05-14 0:39 ` Michael Chan
0 siblings, 1 reply; 9+ messages in thread
From: David S. Miller @ 2005-05-14 0:50 UTC (permalink / raw)
To: akepner; +Cc: mchan, netdev
From: Arthur Kepner <akepner@sgi.com>
Subject: Re: Perf data with recent tg3 patches
Date: Fri, 13 May 2005 16:57:51 -0700 (PDT)
> I found that the reason is that,
> under high receive load, most of the time (~80%) the
> tag in the status block changes between the time that
> it's read (and saved as last_tag) in tg3_poll(), and when
> it's written back to MAILBOX_INTERRUPT_0 in
> tg3_restart_ints(). If I understand the way the status
> tag works, that means that the card will immediately
> generate another interrupt. That's consistent with
> what I'm seeing - a much higher interrupt rate when the
> tagged status patch is used.
Thanks for tracking this down.
Perhaps we can make the logic in tg3_poll() smarter about
this. Something like:
tg3_process_phy_events();
tg3_tx();
tg3_rx();
if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
tp->last_tag = sblk->status_tag;
rmb();
done = !tg3_has_work(tp);
if (done) {
spin_lock_irqsave(&tp->lock, flags);
__netif_rx_complete(netdev);
tg3_restart_ints(tp);
spin_unlock_irqrestore(&tp->lock, flags);
}
return (done ? 0 : 1);
Basically, move the last_tag sample to after we do the
work, then recheck the RX/TX producer/consumer indexes.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Perf data with recent tg3 patches
2005-05-14 0:39 ` Michael Chan
@ 2005-05-14 5:20 ` David S. Miller
2005-05-20 21:52 ` Arthur Kepner
0 siblings, 1 reply; 9+ messages in thread
From: David S. Miller @ 2005-05-14 5:20 UTC (permalink / raw)
To: mchan; +Cc: akepner, netdev
From: "Michael Chan" <mchan@broadcom.com>
Subject: Re: Perf data with recent tg3 patches
Date: Fri, 13 May 2005 17:39:19 -0700
> I like this. I think it will work well.
Here is a quick patch which implements this.
--- 1/drivers/net/tg3.c.~1~ 2005-05-13 22:13:02.000000000 -0700
+++ 2/drivers/net/tg3.c 2005-05-13 22:18:03.000000000 -0700
@@ -2869,9 +2869,6 @@ static int tg3_poll(struct net_device *n
spin_lock_irqsave(&tp->lock, flags);
- if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
- tp->last_tag = sblk->status_tag;
-
/* handle link change and other phy events */
if (!(tp->tg3_flags &
(TG3_FLAG_USE_LINKCHG_REG |
@@ -2896,7 +2893,6 @@ static int tg3_poll(struct net_device *n
* All RX "locking" is done by ensuring outside
* code synchronizes with dev->poll()
*/
- done = 1;
if (sblk->idx[0].rx_producer != tp->rx_rcb_ptr) {
int orig_budget = *budget;
int work_done;
@@ -2908,12 +2904,14 @@ static int tg3_poll(struct net_device *n
*budget -= work_done;
netdev->quota -= work_done;
-
- if (work_done >= orig_budget)
- done = 0;
}
+ if (tp->tg3_flags & TG3_FLAG_TAGGED_STATUS)
+ tp->last_tag = sblk->status_tag;
+ rmb();
+
/* if no more work, tell net stack and NIC we're done */
+ done = !tg3_has_work(tp);
if (done) {
spin_lock_irqsave(&tp->lock, flags);
__netif_rx_complete(netdev);
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Perf data with recent tg3 patches
2005-05-14 5:20 ` David S. Miller
@ 2005-05-20 21:52 ` Arthur Kepner
2005-05-20 22:33 ` David S. Miller
0 siblings, 1 reply; 9+ messages in thread
From: Arthur Kepner @ 2005-05-20 21:52 UTC (permalink / raw)
To: David S.Miller; +Cc: mchan, netdev
[-- Attachment #1: Type: TEXT/PLAIN, Size: 4383 bytes --]
Here are a couple more data points with the recent
interrupt coalescing patches for the tg3 driver.
Please see the attached graphs, which show how CPU
utilization, and number of received packets per
interrupt vary with link utilization. The workload
here is receive-as-fast-as-you-can-over-TCP, with
a single sending and a single receiving process.
The data in the graphs is labelled as follows:
----------------------------------------------
2.6.12-rc3: unmodified 2.6.12-rc3
dflt coal : 2.6.12-rc3 + [1] + [2] + [3] + [4]
using the default intr coalescence
values (rx-frames = rx-usecs-irq = 5)
4x coal : 2.6.12-rc3 + [1] + [2] + [3] + [4] + [5]
using 4 times the default values
for rx-frames and rx-frames-irq
[1] http://marc.theaimsgroup.com/?l=linux-netdev&m=111446723510962&w=2
(This is one of a series of 3 patches - the others can't be
found in the archive. But they're all in 2.6.12-rc4.)
[2] http://marc.theaimsgroup.com/?l=linux-netdev&m=111567944730302&w=2
("tagged status" patch)
[3] http://marc.theaimsgroup.com/?l=linux-netdev&m=111586526522981&w=2
("hw coalescing infrastructure" patch)
[4] http://marc.theaimsgroup.com/?l=linux-netdev&m=111604846510646&w=2
("tagged status update")
[5] the patches below which allow "ethtool -[cC]" to work
Patch [4] almost entirely eliminates updates to the tag in
the status block between when it's been saved in tg3_poll()
and when it's written back to the NIC in tg3_restart_ints().
It still happens, but the frequency is a few times in a
thousand, so it doesn't significantly affect the interrupt
rate.
I had to make a couple of changes to allow setting/
retrieving the coalescence parameters with ethtool. Those
patches are at the end.
When the default coalescence parameters are used (rx-frames,
rx-frames-irq both set to 5) the maximum number of received
packets per interrupt is ~4.2. Setting rx-frames and
rx-frames-irq to 20 caused the maximum number of received
packets per interrupt to rise to ~19.6. Maximum CPU
utilization went down from ~52% to ~35%. Very nice.
Fix typo in ethtool_set_coalesce()
Signed-off-by: Arthur Kepner <akepner@sgi.com>
--- linux.save/net/core/ethtool.c 2005-05-20 12:40:04.426385446 -0700
+++ linux/net/core/ethtool.c 2005-05-20 12:49:34.087515306 -0700
@@ -347,7 +347,7 @@ static int ethtool_set_coalesce(struct n
{
struct ethtool_coalesce coalesce;
- if (!dev->ethtool_ops->get_coalesce)
+ if (!dev->ethtool_ops->set_coalesce)
return -EOPNOTSUPP;
if (copy_from_user(&coalesce, useraddr, sizeof(coalesce)))
Changes to allow setting/getting coalescence parameters
with tg3.
Signed-off-by: Arthur Kepner <akepner@sgi.com>
--- linux.save/drivers/net/tg3.c 2005-05-20 13:02:41.610865448 -0700
+++ linux/drivers/net/tg3.c 2005-05-20 13:11:36.467011288 -0700
@@ -5094,8 +5094,11 @@ static void tg3_set_bdinfo(struct tg3 *t
}
static void __tg3_set_rx_mode(struct net_device *);
-static void tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec)
+static int tg3_set_coalesce(struct net_device *dev,
+ struct ethtool_coalesce *ec)
{
+ struct tg3 *tp = netdev_priv(dev);
+
tw32(HOSTCC_RXCOL_TICKS, ec->rx_coalesce_usecs);
tw32(HOSTCC_TXCOL_TICKS, ec->tx_coalesce_usecs);
tw32(HOSTCC_RXMAX_FRAMES, ec->rx_max_coalesced_frames);
@@ -5114,6 +5117,9 @@ static void tg3_set_coalesce(struct tg3
tw32(HOSTCC_STAT_COAL_TICKS, val);
}
+
+ memcpy(&tp->coal, ec, sizeof(tp->coal));
+ return 0;
}
/* tp->lock is held. */
@@ -5437,7 +5443,7 @@ static int tg3_reset_hw(struct tg3 *tp)
udelay(10);
}
- tg3_set_coalesce(tp, &tp->coal);
+ tg3_set_coalesce(tp->dev, &tp->coal);
/* set status block DMA address */
tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH,
@@ -7302,6 +7308,8 @@ static int tg3_get_coalesce(struct net_d
return 0;
}
+static int tg3_set_coalesce(struct net_device *, struct ethtool_coalesce *);
+
static struct ethtool_ops tg3_ethtool_ops = {
.get_settings = tg3_get_settings,
.set_settings = tg3_set_settings,
@@ -7335,6 +7343,7 @@ static struct ethtool_ops tg3_ethtool_op
.get_stats_count = tg3_get_stats_count,
.get_ethtool_stats = tg3_get_ethtool_stats,
.get_coalesce = tg3_get_coalesce,
+ .set_coalesce = tg3_set_coalesce,
};
static void __devinit tg3_get_eeprom_size(struct tg3 *tp)
--
Arthur
[-- Attachment #2: CPU utilization --]
[-- Type: IMAGE/png, Size: 3303 bytes --]
[-- Attachment #3: Received Pkts/Intr --]
[-- Type: IMAGE/png, Size: 3195 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Perf data with recent tg3 patches
2005-05-20 21:52 ` Arthur Kepner
@ 2005-05-20 22:33 ` David S. Miller
2005-05-20 22:52 ` Rick Jones
2005-05-20 22:54 ` Arthur Kepner
0 siblings, 2 replies; 9+ messages in thread
From: David S. Miller @ 2005-05-20 22:33 UTC (permalink / raw)
To: akepner; +Cc: mchan, netdev
From: Arthur Kepner <akepner@sgi.com>
Date: Fri, 20 May 2005 14:52:35 -0700 (PDT)
> When the default coalescence parameters are used (rx-frames,
> rx-frames-irq both set to 5) the maximum number of received
> packets per interrupt is ~4.2. Setting rx-frames and
> rx-frames-irq to 20 caused the maximum number of received
> packets per interrupt to rise to ~19.6. Maximum CPU
> utilization went down from ~52% to ~35%. Very nice.
Yes, but using such a high value makes latency go into the
toilet. :-)
I'd much rather see dynamic settings based upon packet rate.
It's easy to resurrect the ancient code from the early
tg3 days which does this.
Thanks for all your testing, it is very informative and
useful.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Perf data with recent tg3 patches
2005-05-20 22:33 ` David S. Miller
@ 2005-05-20 22:52 ` Rick Jones
2005-05-20 22:54 ` Arthur Kepner
1 sibling, 0 replies; 9+ messages in thread
From: Rick Jones @ 2005-05-20 22:52 UTC (permalink / raw)
To: netdev
> Yes, but using such a high value makes latency go into the
> toilet. :-)
For low packet rates.
>
> I'd much rather see dynamic settings based upon packet rate.
> It's easy to resurrect the ancient code from the early
> tg3 days which does this.
If that is the stuff I think it was, it was giving me _fits_ trying to run
TCP_RR tests. Results bounced all over the place. I think it was trying to
kick-in at pps rates that were below the limits of what a pair of systems could
do on a single, synchronous request/response stream.
Now, modulo an OS that I cannot mention because its EULA forbits discussing
results with third parties, where the netperf TCP_RR perf is 8000 transactions
per second no matter how powerful the CPU... if folks are simply free to set
high coalescing parms on their own, presumably with some knowledge of their
workloads, wouldn't that be enough? That has been "good enough" for one OS I
can discuss - HP-UX - and its bcm570X-based GbE NICs and before to Tigon2.
rick jones
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Perf data with recent tg3 patches
2005-05-20 22:33 ` David S. Miller
2005-05-20 22:52 ` Rick Jones
@ 2005-05-20 22:54 ` Arthur Kepner
1 sibling, 0 replies; 9+ messages in thread
From: Arthur Kepner @ 2005-05-20 22:54 UTC (permalink / raw)
To: David S.Miller; +Cc: mchan, netdev
On Fri, 20 May 2005, David S.Miller wrote:
> .....
> Yes, but using such a high value makes latency go into the
> toilet. :-)
> .....
Latency measurements are on my to-do list.
--
Arthur
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2005-05-20 22:54 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-05-13 2:49 Perf data with recent tg3 patches Arthur Kepner
[not found] ` <20050512.211935.67881321.davem@davemloft.net>
2005-05-13 23:57 ` Arthur Kepner
2005-05-14 0:50 ` David S. Miller
2005-05-14 0:39 ` Michael Chan
2005-05-14 5:20 ` David S. Miller
2005-05-20 21:52 ` Arthur Kepner
2005-05-20 22:33 ` David S. Miller
2005-05-20 22:52 ` Rick Jones
2005-05-20 22:54 ` Arthur Kepner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).