amd64/144148: [msk] Slow network performance and high system cpu load while transfering data

Emanuele A. Bagnaschi zephyrus.271 at gmail.com
Sat Feb 20 20:50:01 UTC 2010


>Number:         144148
>Category:       amd64
>Synopsis:       [msk] Slow network performance and high system cpu load while transfering data
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-amd64
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Feb 20 20:50:00 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Emanuele A. Bagnaschi
>Release:        RELENG8
>Organization:
>Environment:
FreeBSD polaris 8.0-STABLE FreeBSD 8.0-STABLE #31: Fri Feb 19 18:55:27 CET 2010     toor at polaris:/usr/obj/usr/src/sys/POLARIS  amd64
>Description:
Hi,
I've been experiencing a troubling issue with a Marvell 8072 NIC on an HP
ProBook 4710s.
I first noticed that there is a problem with the NIC while transferring some files with scp to a FreeBSD8-STABLE server: CPUs usage sky-rocketed to 100% (system) and network performance was awful (about 1.8 MiB/s).

At first I reproduced the issue in a controlled way with 'ttcp' but I was informed on the FreeBSD stable mailing that it is better to use 'netperf' due to some problem with 'ttcp' threading code. Therefore I repeated the tests with netperf.
The tests show that the maximum achievable transfer rate is about 2 MiB/s, that disabling tso and txcsum (as suggested by Pyun YongHyeon on the FreeBSD stable mailing list) help a bit but does not resolve the problem and that the NIC works as expected on Linux (so I think that we can rule out that the problem is server side). The 'ttcp' tests were also originally executed with MSI interrupts disabled, again with no improvements.
All tests were run with no firewall on both systems.
You can find the full 'netperf' output attached.

Here it's some relevant information to identify the NIC:

first from 'dmesg'

mskc0: <Marvell Yukon 88E8072 Gigabit Ethernet> port 0x2000-0x20ff mem
0x90100000-0x90103fff irq 17 at device 0.0 on pci134
msk0: <Marvell Technology Group Ltd. Yukon EX Id 0xb5 Rev 0x02> on mskc0
msk0: Ethernet address: 00:25:b3:52:fc:fa
miibus0: <MII bus> on msk0
mskc0: [FILTER]
msk0: link state changed to DOWN
msk0: link state changed to UP

and then from 'pciconf -lv'

mskc0 at pci0:134:0:0:     class=0x020000 card=0x3074103c chip=0x436c11ab
rev=0x10 hdr=0x00
    vendor     = 'Marvell Semiconductor (Was: Galileo Technology Ltd)'
    device     = 'Marvell 8072 Ethernet Nic (88E8072)'
    class      = network
    subclass   = ethernet

Here it's the output of 'ifconfig':

msk0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu
1500
        options=19b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4>
        ether 00:25:b3:52:fc:fa
        inet 192.168.1.4 netmask 0xffffff00 broadcast 192.168.1.255
        media: Ethernet autoselect (100baseTX <full-duplex,flag0,flag1>)
        satus: active


According to Pyun YongHyeon (again on the FreeBSD stable mailing lists), the NIC is a Yukon Extreme controller revision B0 and it is know that it has some silicon bugs.

I know that, without errata and data sheets, probably there is not much that can be done at the moment, but I thought that filing a PR would be at least a good way to point out the issue. Thanks for any help.

Best regards
Emanuele A. Bagnaschi
>How-To-Repeat:
Transfer data trough the network interface.
>Fix:


Patch attached with submission follows:

All netperf runs were executed with the following command line:

netperf -T TCP_SENDFILE -H hostname -f 'M'  -I 99,5 -i 10,2
--

* notebook - Linux 2.6.32 - hostname: elsinore *
* server - FreeBSD8-STABLE - hostname:atlantis * 

FIRST RUN - netperf executed on elsinore (Linux - Laptop)

TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to atlantis (192.168.1.1) port 0 AF_INET : +/-2.500% @ 99% conf.  : cpu bind
Recv   Send    Send                          
Socket Socket  Message  Elapsed              
Size   Size    Size     Time     Throughput  
bytes  bytes   bytes    secs.    MBytes/sec  

 65536  16384  16384    10.04      11.19   


SECOND RUN - netperf executed on atlantis (FreeBSD - Server)

TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to elsinore (192.168.1.4) port 0 AF_INET : +/-2.500% @ 99% conf.  : cpu bind
Recv   Send    Send                          
Socket Socket  Message  Elapsed              
Size   Size    Size     Time     Throughput  
bytes  bytes   bytes    secs.    MBytes/sec  

 87380  32768  32768    10.02      11.10 

-----

* notebook - FreeBSD8-STABLE - hostname:polaris - msk with tcxsum and tso disabled *
* server - FreeBSD8-STABLE - hostname:atlantis *


FIRST RUN - netperf executed on polaris (FreeBSD - laptop)

TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to atlantis (192.168.1.1) port 0 AF_INET : +/-2.500% @ 99% conf.  : cpu bind
!!! WARNING
!!! Desired confidence was not achieved within the specified iterations.
!!! This implies that there was variability in the test environment that
!!! must be investigated before going further.
!!! Confidence intervals: Throughput      : 74.033%
!!!                       Local CPU util  : 0.000%
!!!                       Remote CPU util : 0.000%

Recv   Send    Send                          
Socket Socket  Message  Elapsed              
Size   Size    Size     Time     Throughput  
bytes  bytes   bytes    secs.    MBytes/sec  

 65536  32768  32768    11.44       2.23 


SECOND RUN - netperf executed on atlantis (FreeBSD - server)

TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to elsinore (192.168.1.4) port 0 AF_INET : +/-2.500% @ 99% conf.  : cpu bind
!!! WARNING
!!! Desired confidence was not achieved within the specified iterations.
!!! This implies that there was variability in the test environment that
!!! must be investigated before going further.
!!! Confidence intervals: Throughput      : 10.916%
!!!                       Local CPU util  : 0.000%
!!!                       Remote CPU util : 0.000%

Recv   Send    Send                          
Socket Socket  Message  Elapsed              
Size   Size    Size     Time     Throughput  
bytes  bytes   bytes    secs.    MBytes/sec  

 65536  32768  32768    10.08       2.58  

-----

* notebook - FreeBSD8-STABLE - hostname:polaris - msk with txcsum and tso enabled *
* server - FreeBSD8-STABLE - hostname:atlantis *


FIRST RUN - polaris transmits, atlantis receives

TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to atlantis (192.168.1.1) port 0 AF_INET : +/-2.500% @ 99% conf.  : cpu bind
netperf: data send error: Connection reset by peer
len was -1

SECOND RUN - polaris receives, atlantis transmits

TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to elsinore (192.168.1.4) port 0 AF_INET : +/-2.500% @ 99% conf.  : cpu bind
!!! WARNING
!!! Desired confidence was not achieved within the specified iterations.
!!! This implies that there was variability in the test environment that
!!! must be investigated before going further.
!!! Confidence intervals: Throughput      : 5.228%
!!!                       Local CPU util  : 0.000%
!!!                       Remote CPU util : 0.000%

Recv   Send    Send                          
Socket Socket  Message  Elapsed              
Size   Size    Size     Time     Throughput  
bytes  bytes   bytes    secs.    MBytes/sec  

 65536  32768  32768    10.08       2.63


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-amd64 mailing list