After using the solution I detailed in my last post for about a week, I found that more often than not, even with spawning entirely new VMs every night, on one or both of the IE machines, while a test was running, iexplore.exe would be using 99% CPU. Under that kind of pressure, a test that normally takes about 46 seconds on Chrome (with another test running in Firefox on the same machine, no less) would take over five minutes on IE 8. No, seriously. I have actual data this time. Didn’t see that coming, did you?
I’ll let you digest that for a few minutes. It’s okay, as you can see, I’ve got plenty of time to wait. Clearly, this is not going to work once we move on to running more than four tests. I investigated some possibile causes in, because I am an inherently lazy sack, order from least difficult to fix to most.
My first thought after seeing occasional 100% usage of all four cores using htop during test runs was that maybe my desktop and/or VirtualBox was having trouble handling three VMs at once, though the fact that the Chrome/Firefox VM never seemed to run into this kind of trouble was a little more than unsettling. I found a number of possible solutions (yes, including an OS-less dummy machine for some reason), but found no real success. So I tried replacing VirtualBox entirely, and switching all my VMs to hardcore mode (also known as QEMU. It actually went a lot better than I expected.
First, my Base images would have to be something useable by QEMU; I needed to convert them from VirtualBox .vdi’s to .qcow’s, but I was also worried about keeping the originals in case I completely boned this new setup and had to revert. This was accomplished easily enough by running these for each VM:
VBoxManage clonehd "Win7 ie8 Base.vdi" "Win7ie8Base.img" --format RAW
qemu-img convert -f raw Win7ie8Base.img -O qcow2 Win7ie8Base.qcow
rm Win7ie8Base.img
Next, my nightly reset script would need a little attention. The fact that QEMU is essentially an entirely command-line based tool made this even easier.
#!/bin/bash
function reset_vm {
echo "resetting $1..."
cd /home/pettazz/VMs/
if [ -a $1.pid ]
then
echo "killing existing VM pid:"
echo `cat $1.pid`
echo -e "\n"
kill -9 `cat $1.pid`
rm $1.pid
fi
rm $1Active.qcow
cp -v $1Base.qcow $1Active.qcow
kvm -m 2048 -usbdevice tablet -hda $1Active.qcow -vga std -redir tcp:$2::$2 > $1.log &
echo $! > $1.pid
echo -e "done.\n\n\n"
}
reset_vm "Win7ie8" 5555
reset_vm "Win7ie9" 5556
reset_vm "Win7ffchrome" 5557
https://gist.github.com/pettazz/4990397
And suddenly I was the proud owner of three VMs running in QEMU, the solution to all my life’s problems.
Oh, son of a bitch.