Re: [AUTOTEST][KVM][PATCH] Add test for testing of killing guest when network is under usage.

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

 



----- Original Message -----
> Hi Jiří,
> 
> Do you have any further plans with this test? I'm not convinced that
> netperf only as a stress is necessarily. You can use netcat or simple
> python udp send/recv (flood attack ;-) ).

With netperf is easy to simulate easy way lots of type of network load.
In addition netperf is used from many places in autotest. 

> 
> Dne 17.8.2011 16:17, Jiří Župka napsal(a):
> > This patch contain two tests.
> > 1) Try kill guest when guest netwok is under loading.
> > 2) Try kill guest after multiple adding and removing network
> > drivers.
> >
> > Signed-off-by: Jiří Župka<jzupka@xxxxxxxxxx>
> > ---
> >   client/tests/kvm/tests_base.cfg.sample | 23 +++++
> >   client/virt/tests/netstress_kill_guest.py | 146
> >   +++++++++++++++++++++++++++++
> >   2 files changed, 169 insertions(+), 0 deletions(-)
> >   create mode 100644 client/virt/tests/netstress_kill_guest.py
> >
> > diff --git a/client/tests/kvm/tests_base.cfg.sample
> > b/client/tests/kvm/tests_base.cfg.sample
> > index ec1b48d..2c88088 100644
> > --- a/client/tests/kvm/tests_base.cfg.sample
> > +++ b/client/tests/kvm/tests_base.cfg.sample
> > @@ -845,6 +845,29 @@ variants:
> >           restart_vm = yes
> >           kill_vm_on_error = yes
> >
> > + - netstress_kill_guest: install setup unattended_install.cdrom
> > + only Linux
> > + type = netstress_kill_guest
> > + image_snapshot = yes
> > + nic_mode = tap
> > + # There should be enough vms for build topology.
> > + variants:
> > + -driver:
> > + mode = driver
> > + -load:
> > + mode = load
> > + netperf_files = netperf-2.4.5.tar.bz2 wait_before_data.patch
> > + packet_size = 1500
> > + setup_cmd = "cd %s&& tar xvfj netperf-2.4.5.tar.bz2&& cd
> > netperf-2.4.5&& patch -p0< ../wait_before_data.patch&& ./configure&&
> > make"
> > + clean_cmd = " while killall -9 netserver; do True test; done;"
> > + netserver_cmd = %s/netperf-2.4.5/src/netserver
> > + netperf_cmd = %s/netperf-2.4.5/src/netperf -t %s -H %s -l 60 -- -m
> > %s
> > + variants:
> > + - vhost:
> > + netdev_extra_params = "vhost=on"
> 
> 
> You might add "modprobe vhost-net" command as vhost-net might not be
> loaded by default.

Yes this is true. But clearest way is remove vhost from testing. 
Everybody who want vhost can add this to tests_base.conf

> 
> > + - vhost-no:
> > + netdev_extra_params = ""
> > +
> >       - set_link: install setup image_copy unattended_install.cdrom
> >           type = set_link
> >           test_timeout = 1000
> > diff --git a/client/virt/tests/netstress_kill_guest.py
> > b/client/virt/tests/netstress_kill_guest.py
> > new file mode 100644
> > index 0000000..7daec95
> > --- /dev/null
> > +++ b/client/virt/tests/netstress_kill_guest.py
> > @@ -0,0 +1,146 @@
> > +import logging, os, signal, re, time
> > +from autotest_lib.client.common_lib import error
> > +from autotest_lib.client.bin import utils
> > +from autotest_lib.client.virt import aexpect, virt_utils
> > +
> > +
> > +def run_netstress_kill_guest(test, params, env):
> > + """
> > + Try stop network interface in VM when other VM try to communicate.
> > +
> > + @param test: kvm test object
> > + @param params: Dictionary with the test parameters
> > + @param env: Dictionary with test environment.
> > + """
> > + def get_corespond_ip(ip):
> > + """
> > + Get local ip address which is used for contact ip.
> > +
> > + @param ip: Remote ip
> > + @return: Local corespond IP.
> > + """
> > + result = utils.run("ip route get %s" % (ip)).stdout
> > + ip = re.search("src (.+)", result)
> > + if ip is not None:
> > + ip = ip.groups()[0]
> > + return ip
> > +
> > +
> > + def get_ethernet_driver(session):
> > + """
> > + Get driver of network cards.
> > +
> > + @param session: session to machine
> > + """
> > + modules = []
> > + out = session.cmd("ls -l /sys/class/net/*/device/driver/module")
> > + for module in out.split("\n"):
> > + modules.append(module.split("/")[-1])
> > + modules.remove("")
> > + return set(modules)
> > +
> > +
> > + def kill_and_check(vm):
> > + vm_pid = vm.get_pid()
> > + vm.destroy(gracefully=False)
> > + time.sleep(2)
> > + try:
> > + os.kill(vm_pid, 0)
> > + logging.error("VM is not dead.")
> > + raise error.TestFail("Problem with killing guest.")
> > + except OSError:
> > + logging.info("VM is dead.")
> > +
> > +
> > + def netload_kill_problem(session_serial):
> 
> I think you should clean this function. I belive it would be better
> and
> more readable, if you first get all the params/variables, than prepare
> the host/guests and after all of this start the guest. See the
> comments
> further...
> 
> > + netperf_dir = os.path.join(os.environ['AUTODIR'],
> > "tests/netperf2")
> > + setup_cmd = params.get("setup_cmd")
> > + clean_cmd = params.get("clean_cmd")
> > +
> > + firewall_flush = "iptables -F"
> > + session_serial.cmd_output(firewall_flush)
> > + try:
> > + utils.run("iptables -F")
> you have firewall_flush command-string, why not to use it here to.
> Also
> you should either warn everywhere or not at all... (you log the
> failure
> when flushing the guest but not here)
> 
> > + except:
> > + pass
> > +
> > + for i in params.get("netperf_files").split():
> > + vm.copy_files_to(os.path.join(netperf_dir, i), "/tmp")
> > +
> > + try:
> > + session_serial.cmd(firewall_flush)
> > + except aexpect.ShellError:
> > + logging.warning("Could not flush firewall rules on guest")
> > +
> > + guest_ip = vm.get_address(0)
> > + server_ip = get_corespond_ip(guest_ip)
> > +
> > + session_serial.cmd(setup_cmd % "/tmp", timeout=200)
> > + try:
> > + session_serial.cmd(clean_cmd)
> > + except:
> > + pass
> > + session_serial.cmd(params.get("netserver_cmd") % "/tmp")
> > +
> > + utils.run(clean_cmd, ignore_status=True)
> > + utils.run(params.get("netserver_cmd") % netperf_dir)
> prior to this command you should prepare the netperf
> 
> utils.run(setup_cmd % netperf_dir)
> 
> You have it further in the source (perhaps you have it already built
> on
> your system thus it works for you).
> 
> > +
> > + server_netperf_cmd = params.get("netperf_cmd") % (netperf_dir,
> > "TCP_STREAM",
> > + guest_ip, params.get("packet_size", "1500"))
> > + quest_netperf_cmd = params.get("netperf_cmd") % ("/tmp",
> > "TCP_STREAM",
> > + server_ip, params.get("packet_size", "1500"))
> > +
> > + tcpdump = env.get("tcpdump")
> > + pid = None
> > + if tcpdump:
> > + # Stop the background tcpdump process
> > + try:
> > + pid = int(utils.system_output("pidof tcpdump"))
> > + logging.debug("Stopping the background tcpdump")
> > + os.kill(pid, signal.SIGSTOP)
> > + except:
> > + pass
> > +
> > + try:
> > + logging.info("Setup and run netperf clients on host")
> > + utils.run(setup_cmd % netperf_dir)
> This won't be needed once you execute this at the beginning. (see the
> comment before)
> 
> > +
> > + logging.info("Start heavy network load host<=> guest.")
> > + session_serial.sendline(quest_netperf_cmd)
> > + utils.BgJob(server_netperf_cmd)
> > +
> > + #Wait for create big network usage.
> > + time.sleep(10)
> > + kill_and_check(vm)
> > +
> > + finally:
> > + utils.run(clean_cmd, ignore_status=True)
> > + if tcpdump and pid:
> > + logging.debug("Resuming the background tcpdump")
> > + logging.info("pid is %s" % pid)
> > + os.kill(pid, signal.SIGCONT)
> > +
> > + def netdriver_kill_problem(session_serial):
> > + modules = get_ethernet_driver(session_serial)
> > + print modules
> > + for _ in range(50):
> > + for module in modules:
> > + session_serial.cmd("rmmod %s" % (module))
> > + time.sleep(0.2)
> > + for module in modules:
> > + session_serial.cmd("modprobe %s" % (module))
> > + time.sleep(0.2)
> > + kill_and_check(vm)
> > +
> > + vm = env.get_vm(params["main_vm"])
> > + vm.verify_alive()
> > + login_timeout = int(params.get("login_timeout", 360))
> > + session = vm.wait_for_login(timeout=login_timeout)
> > + session.close()
> > + session_serial = vm.wait_for_serial_login(timeout=login_timeout)
> > +
> > + mode = params.get("mode")
> > + if mode == "driver":
> > + netdriver_kill_problem(session_serial)
> > + elif mode == "load":
> > + netload_kill_problem(session_serial)
> 
> 
> The "driver" test is good. The load test with the netperf setup
> modification works also fine. Would you please clean the function and
> resend the patch and clarify why you use such a heavy tool for simple
> stress test?

This is heavy tool with simple configuration which is already contained in
autotest.

I'll repair netperf setup and others minor thing and I'll send
this patch again.

> 
> Thanks,
> Lukáš
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux