From Fedora Project Wiki

The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
VhostNet Testing =

Configuration

Guest : { RHEL3.9z(only 32) | RHEL4.8z | RHEL5.4z | WinXP(only 32) | WinVista | Win2k3 | Win2k8 | Win2k8R2 }

NicModel: { rtl8139 | virtio | e1000 }

Vhost : { on | off }

  1. modprobe vhost_net

$ qemu-kvm -drive file=$Guest.img,boot=on,if=... \

-net nic,model=$NicModel,netdev=foo \

-netdev tap,id=foo,ifname=msttap0,script=/ifup,downscript=no,vhost=$VHost

Testcases

  1. data transmission/receving
  2. ping testing
  3. jumbo frame test
  4. promisc mode testing
  5. PXE booting
  6. 802.1q vlan testing
  7. multicast testing
  8. fragmentation offload testing
  9. driver load/unload testing
  10. s4/s3 suspending for guest nics
  11. stress testing with netperf
  12. Multiple Nics Stress
  13. nic bonding test
1. data transmission/receving

    * create an 5G file in the host

dd if=/dev/zero of=zero bs=1024k count=5000

    * boot the virtual machine

qemu-kvm ......

    * determine the guest ip address: guest_ip
    * determine the host ip address: host_ip
    * create an 5G file in the guest:

dd if=/dev/zero of=zero bs=1024k count=5000

    * scp the host file into guest:

scp zero root@guest_ip:/tmp

    * in the mean time, scp the guest file into host:

scp zero root@host_ip:/tmp

    * wait until both transferring to complete
    * ping the guest in host:

ping -c 10 $guest_ip

    * ths packet loss ratio should be zero

2. ping test: ping the guest with different packetsize and interval
for each nic in the guest, do the following steps

    * determine the guest ip address: guest_ip
    * determine the ping counts: ping_count
    * packet_size = [ 0, 1, 48, 64, 512, 1440, 1500, 1505, 4096, 4192, 32767, 65507 ]
    * interval = [ 0.1, 0.01, 0.001, 0.0001 ]
    * ping the guest with the following commands:

ping guest_ip -s foreach packet_size -i foreach interval -c ping_count

    * determine the packet loss ratio, if the packet loss ratio is not zero, fail the whole testcases

    * ping the guest with the 65508 size

ping guest_ip -s 65508 -i foreach interval -c ping_count

    * determin the packet loss ratio, if the packet loss ratio is not one hundred, fail the whole testecases
    * flood ping the guest with 10 minutes and then ping the guest to see if could still get zero packet loss, if not, fail the test cases.

ping guest_ip -f -s foreach packet_size 

    * search panic/oops in the dmesg and /var/log/messages, if found any fail the whole testcases

3. jumbo frame testing: test the function of jumbo frame support

    * determine the nicmodel of the guest: nicmodel
    * determine the max frame length supported by the nicmodel: max_frame_length (mtu):
    * determine the max icmp packet length support by the nic_model: _max_icmp_packet_size = max_frame_length - 28:
    * packet_size = [ 0, 1, 48, 64, 512, 1440, 1500, 1505, 4096, 4192, 32767, 65507 ]
    * start the virtual machine with interface name of IFNAME
    * determine the bridge whcih IFNAME is connected: bridge

qemu-kvm -net nic,model=nicmodel,macaddr={macaddr},ifname=IFNAME -net tap ...

    * change the MTU of the tap device in the host

ifconfig IFNAME mtu 65521

    * change the MTU of the ethernet device in the guest

ifconfig eth0 mtu _max_frame_length_

    * if needed, add a dedicated route entry in the host [Resolution]

route add guest_ip IFNAME

    * if needed, add an static entry for guest nic

arp -s guest_ip guest_mac

    * ping the guest in the host with path mtu discovery

ping -M do guest_ip -s max_icmp_packet_size -c 10

    * check the packet loss ratio, if the ratio is not zero, fail the whole cases.

    * execute the following script in the guest:

while true; do ifconfig eth0 mtu 1500; ifconfig eth0 mtu max_fram_length done

and in the same time flood ping the guest in the host for five minutes.

ping -f -s max_icmp_packet_size

    * ping the guest in the host and see if the packet loss ratio is zero, if not, fail the whole case

ping -c 2 guest_ip

    * restore the mtu

ifconfig eth0 mtu 1500

4. promisc mode testing: transfering data in promisc mode

    * start the virtual machine
    * create an 1G file in the host

dd if=/dev/urandom of=/tmp/random bs=1024k count=1000 

    * get che checksum of the random file

md5sum /tmp/random

    * open a guest session and execute the following command to switch between promisc and non-promisc mode

while true; do
ifconfig eth0 promisc 
sleep 0.01
ifconfig eth0 -promisc
sleep 0.01
done

    * in the meantime, scp the random file to the guest

scp /tmp/random root@guest_ip:/tmp

    * get the md5sum in the guest

md5sum /tmp/random

    * compare the md5sum for both guest and host, if they are different, fail the whole testcase
    * kill the previous script in the guest
    * restore the nic to non-promisc mode

ifconfig eth0 -promisc

5. PXE booting

    * start the virtual machie with interface name IFNAME

qemu-kvm -net nic,ifname=IFNAME,... -net tap ...

    * using tcpdump to snoop the tftp traffic

tcpdump -l -n port 69 -i IFNAME > tcpdump

    * wait for 2 minutes and search tftp packet in the tcpdump

grep tftp tcpdump

    * if could find tftp in the tcpdump, testcase pass then fail

6. 802.1q vlan testing

    * boot two virtual machines
    * log into first virtual machine, and config the vlan through: ( join the vlan 10 )

vconfig add eth0 10;ifconfig eht0.10 192.168.123.11

    * log into second virtual machine, and config the vlan through: ( join the vlan 20 )

vconfig add eth0 20;ifconfig eth0.20 192.168.123.12

    * ping the second virtual machine in the first virtual machine and check the packet loss, if the packet loss is not 100%, fail the whole test case

ping -c 10 192.168.123.12

    * log into second virtual machine, and config the vlan through: (join the vlan 10)

vconfig rem eth0.20;vconfig add eth0 10;ifconfig eth0.10 192.168.123.12

    * ping the second virtual machine in the first virtualmachine and check the packet loss, if the packet loss is not 0%, fail the whole test case

    * for each guest (both first and second), remove the vlan config

vconfig rem eth0.10

7. multicast testing

    * boot a virtual machine

    * log into this virtual machine, and join it three multicast groups

ip maddr add 01:00:5e:c0:01:64 eth0
ip maddr add 02:00:5e:c0:01:64 eth0
ip maddr add 03:00:00:00:40:00 eth0


01:00:5e:c0:01:64 is a IP Multicast macaddress
02:00:5e:c0:01:64 is a General macaddress
03:00:00:00:40:00 is a Lan Manage Multicast mac address

    * listen the multicast packets using tcpdump on this virtual machine

tcpdump -ep ether multicast 2>/dev/null |tee /tmp/multicast.tmp 1>/dev/null

    * produce three random date packets and send to three multicast macaddress on host

packet1 --> 01:00:5e:c0:01:64
packet2 --> 02:00:5e:c0:01:64
packet3 --> 03:00:00:00:40:00

    * sleep 20 seconds, and kill tcpdump processer in the virtual machine

    * copy the tcpdump result to host, and check if the tcpdump's result contains that three packets.

grep content[i] /tmp/multicast.tmp

8. fragmentation offload test

    * boot a virtual machine

    * log into this virtual machine, and disable gso function of nic, only enable tso. if you check the function of gso, just disable tso and enable gso

ethtool -K eth0 gso off
ethtool -K etho tso on

    * check if success to setup tso/gso on guest

ethtool -k eth0

    * listen tcp packets on host

nc -l 5334 |tee /tmp/frag_offload.dd >/dev/null

    * use dd to create a 10M file on guest

dd if=/dev/urandom of=/tmp/frag_offload.dd bs=10M count=1

    * use tcpdump capture the packets on data link layer on guest

tcpdump -e port 5334 1 >/tmp/frag_offload.tcpdump 2>/dev/null

    * sent the 10M file to host

cat /tmp/frag_offlaod.dd |nc $hostIP 5334

    * check if there exists some packet larger than MTU

    * compute md5sum of /tmp/frag_offload.dd on host and the virtual machine, and check if they are same

md5sum /tmp/frag_offload.dd

9. driver load/unload testing

    * boot the guests and determine the driver for the guest nics: driver

ethtool -i eth0 | grep driver | awk '{print $2}'

    * download and install prozilla in the guests : may need libncurses5 ( libncurses5-dev )

wget http://10.66.70.67:3000/attachments/52/prozilla-1.3.7.3.tar.gz
tar -zxf prozilla-1.3.7.3.tar.gz
cd prozilla-1.3.7.3
./configure
make install

    * open a guest session and run the following scripts

while true; do
ifconfig eth0 down
sleep 0.1
modprobe -r driver
modprobe driver
ifconfig eth0 up
sleep 0.1
done

    * in the meantime, open a guest session and download the the kernel archives from lkml.org

proz -k 10 http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.5.tar.bz2

    * kill the scripts
    * tar the kernel archives, if any errors during the extracting, fail the whole testcase

tar -zxf linux-2.6.31.5.tar.bz2

10. s4/s3 suspending for guest nics

    * determine the ip address of guest: guest_ip
    * boot the guest
    * suspend the guest into s3/s4

echo mem|disk > /sys/power/state

    * waken from s3/s4 and test the virtual nics through ping, and determine the packet loss ratio, if the ratio is not zero, fail the whole test

ping _guest_ip -c 10

11. stress testing with netperf

    * boot the virtual machine
    * determine the test time for stress t seconds
    * determine the ip address of the guest: ip_guest
    * determine the ip address of the host: ip_host
    * install netperf2 in both guest and host
    * run netperf server in guest

./netserver

    * run netperf client in the host to test TCP

./netperf -H ip_guest -l t

    * wait until the netperf to finish
    * run netperf client in host to test UDP

./netperf -H ip_guest -l t -t UDP_STREAM

    * wait until the netperf to finish
    * run netperf server in the host

./netserver

    * run the netperf client in the guest

./netperf -H ip_host -l t

    * wait until the netperf to finish
    * run netperf client in host to test UDP

./netperf -H ip_host -l t -t UDP_STREAM

    * wait until the netperf to finish
    * ping the guest in host, the packet loss should be zero

ping -c 10 ip_guest

    * search dmesg in guest and see if there have calltrace

12. Multiple Nics Stress

    * determine the test time: testtime
    * boot the virtual machine with three different modles of virtual nics: 8139,virtio,e1000

qemu-kvm -net nic,model=rtl8139... -net tap -net nic,model=e1000,... -net tap...... -net nic,model=virtio,...... -net tap...... ...

    * Adjust the arp policy: use the dedicated interface hw addr to announce and response the arp packet

echo 2 > /proc/sys/net/ipv4/conf/default/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/default/arp_announce

    * Set the max MTU for each nics

ifconfig eth0 mtu 1500 ( for rtl8139 )
ifconfig eth1 mtu 16110 ( for e1000 )
ifconfig eth2 mtu 65535 ( for virtio )

    * determine the guest ip address: ip1 ip2 ip3
    * In the host, parallel flood ping each nics through the following commands and last for testtime seconds.

ping -f ip1 -s {size from 0 to 1500}
ping -f ip2 -s {size from 0 to 16110}
ping -f ip3 -s {size form 0 to 65507}

    * ping each nics to find whether it still work, the packet loss should be zero.

ping -c 10 ip1
ping -c 10 ip2
ping -c 10 ip3

13. nic bonding test

    * determine the four nic models used in the test model1,model2,model3,model4

qemu-kvm -net nic,model=model1,vlan=0 -net tap,vlan=0 -net nic,model=model2,vlan=1 -net tap,vlan=1 -net nic,model=model3,vlan=2 -net tap,vlan=2 -net nic,model=model4,vlan=3 -net tap,vlan=3 -m 1024 ......

    * configure the bonding interfaces configuration files:

/etc/sysconfig/network-scripts/ifcfg-{ethnum}

DEVICE={ethnum}
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none

/etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0
BOOTPROTO=dhcp
ONBOOT=yes
USERCTL=no

    * modprobe the bonding module

modprobe bonding

    * re-start the network interfaces

service netowrk restart

    * use ifconfig to see if bond0 device have been setup and get the ip address ip_bond0

ifconfig bond0

    * in the guest run the following scripts to down/up the interface eth0,eth1,eth2,eth3

while true do;
ifconfig eth0 down
ifconfig eth0 up
ifconfig eth1 down 
ifconfig eth1 up
ifconfig eth2 down
ifconfig eth2 up
ifconfig eth3 down
ifconfig eth3 up
done

    * in the mean time ping the guest in host with the following command, the packet loss ratio should be zero

ping _ip_bond0_ -c 1000

    * then flood ping the guest for two minutes

ping -f _ip_bond0_ 

    * and then ping the guest, the packet loss ratio should be zero

ping -c 100 _ip_bond0_

    * the packet loss should be zero.