Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 29 Jan 2024 09:46:45 -0800
From:      Jim Long <freebsd-questions@umpquanet.com>
To:        freebsd-questions@freebsd.org
Subject:   VirtIO/ipfw/natd throughput problem in hosted VM
Message-ID:  <ZbfkhQXCobk0jKBg@sfo.umpquanet.com>

index | next in thread | raw e-mail

I'm running FreeBSD 14.0-RELEASE in a quad-core, 12G VM commercially
hosted under KVM (I'm told).  It was installed from the main disc1.iso
image, not any of the VM-centric ISOs.

# grep -i network /var/run/dmesg.boot
virtio_pci0: <VirtIO PCI (legacy) Network adapter> port 0xc000-0xc03f mem 0xfebd1000-0xfebd1fff,0xfe000000-0xfe003fff irq 11 at device 3.0 on pci0
vtnet0: <VirtIO Networking Adapter> on virtio_pci0
# ifconfig public
public: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
        options=4c079b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,TXCSUM_IPV6>
        ether fa:16:3e:ca:b5:9c
        inet 10.1.170.27 netmask 0xffffff00 broadcast 10.1.170.255
        media: Ethernet autoselect (10Gbase-T <full-duplex>)
        status: active
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

(10.1.170.27 is my obfuscated routable public IP.)

Using ipfw *without* any "divert" rule, I get good network speed.
Transfering two larger files, one time apiece:

# ipfw show
65000 2966704 2831806570 allow ip from any to any
65535     135      35585 deny ip from any to any

# 128MB @ > 94MB/s:
# rm -f random-data-test-128M
# time rsync -Ppv example.com:random-data-test-128M .
random-data-test-128M
    134,217,728 100%   94.26MB/s    0:00:01 (xfr#1, to-chk=0/1)

sent 43 bytes  received 134,250,588 bytes  53,700,252.40 bytes/sec
total size is 134,217,728  speedup is 1.00

real    0m1.645s
user    0m0.826s
sys     0m0.788s

# 1024MB @ > 105MB/s:
# rm -f random-data-test-1G
# time rsync -Ppv example.com:random-data-test-1G .
random-data-test-1G
  1,073,741,824 100%  105.98MB/s    0:00:09 (xfr#1, to-chk=0/1)

sent 43 bytes  received 1,074,004,060 bytes  102,286,105.05 bytes/sec
total size is 1,073,741,824  speedup is 1.00

real    0m9.943s
user    0m4.701s
sys     0m5.769s



But with an "ipfw divert" rule in place (and natd running as 'natd -n
public'), across 5 transfers of a 2M file of /dev/random, I get very
poor transfer speeds:

# ipfw add 65000 divert natd all from any to any via public
# ipfw show
60000       3        292 divert 8668 ip from any to any via public
65000 2950208 2817524670 allow ip from any to any
65535     135      35585 deny ip from any to any

Test 1 of 5, < 180kB/s:

# rm -f random-data-test-2M
# time rsync -Ppv example.com:random-data-test-2M .
random-data-test-2M
      2,097,152 100%  179.08kB/s    0:00:11 (xfr#1, to-chk=0/1)

sent 43 bytes  received 2,097,752 bytes  167,823.60 bytes/sec
total size is 2,097,152  speedup is 1.00

real    0m12.199s
user    0m0.085s
sys     0m0.027s

Test 2 of 5, < 115kB/s:

# rm -f random-data-test-2M
# rsync -Ppv example.com:random-data-test-2M .
random-data-test-2M
      2,097,152 100%  114.40kB/s    0:00:17 (xfr#1, to-chk=0/1)

sent 43 bytes  received 2,097,752 bytes  107,579.23 bytes/sec
total size is 2,097,152  speedup is 1.00

real    0m19.300s
user    0m0.072s
sys     0m0.051s

Test 3 of 5, < 37kB/s (almost 57s elapsed time):

# rm -f random-data-test-2M
# time rsync -Ppv example.com:random-data-test-2M .
random-data-test-2M
      2,097,152 100%   36.49kB/s    0:00:56 (xfr#1, to-chk=0/1)

sent 43 bytes  received 2,097,752 bytes  36,483.39 bytes/sec
total size is 2,097,152  speedup is 1.00

real    0m56.868s
user    0m0.080s
sys     0m0.023s

Test 4 of 5, < 112kB/s:

# rm -f random-data-test-2M
# time rsync -Ppv example.com:random-data-test-2M .
random-data-test-2M
      2,097,152 100%  111.89kB/s    0:00:18 (xfr#1, to-chk=0/1)

sent 43 bytes  received 2,097,752 bytes  102,331.46 bytes/sec
total size is 2,097,152  speedup is 1.00

real    0m19.544s
user    0m0.095s
sys     0m0.015s

Test 5 of 5, 130kB/s:

# rm -f random-data-test-2M
# time rsync -Ppv example.com:random-data-test-2M .
random-data-test-2M
      2,097,152 100%  130.21kB/s    0:00:15 (xfr#1, to-chk=0/1)

sent 43 bytes  received 2,097,752 bytes  127,139.09 bytes/sec
total size is 2,097,152  speedup is 1.00

real    0m16.583s
user    0m0.072s
sys     0m0.035s


How can I tweak my network stack to get reasonable throughput from natd?
I'm happy to respond to requests for additional details.


Thank you!




help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?ZbfkhQXCobk0jKBg>