Index: client/tests/kvm/tests/ksm_overcommit.py |
diff --git a/client/tests/kvm/tests/ksm_overcommit.py b/client/tests/kvm/tests/ksm_overcommit.py |
index dd4a30d1a0d568d23849790d306a0805d457bce8..5aba25a937f52f274a7c0289a8fa201584e40047 100644 |
--- a/client/tests/kvm/tests/ksm_overcommit.py |
+++ b/client/tests/kvm/tests/ksm_overcommit.py |
@@ -1,4 +1,4 @@ |
-import logging, time, random, string, math, os, tempfile |
+import logging, time, random, math, os |
from autotest_lib.client.common_lib import error |
from autotest_lib.client.bin import utils |
import kvm_subprocess, kvm_test_utils, kvm_utils, kvm_preprocessing |
@@ -18,27 +18,27 @@ def run_ksm_overcommit(test, params, env): |
def _start_allocator(vm, session, timeout): |
""" |
- Execute allocator.py on a guest, wait until it is initialized. |
+ Execute ksm_overcommit_guest.py on a guest, wait until it is initialized. |
@param vm: VM object. |
@param session: Remote session to a VM object. |
- @param timeout: Timeout that will be used to verify if allocator.py |
- started properly. |
+ @param timeout: Timeout that will be used to verify if |
+ ksm_overcommit_guest.py started properly. |
""" |
- logging.debug("Starting allocator.py on guest %s", vm.name) |
- session.sendline("python /tmp/allocator.py") |
- (match, data) = session.read_until_last_line_matches(["PASS:", "FAIL:"], |
- timeout) |
- if match == 1 or match is None: |
- raise error.TestFail("Command allocator.py on guest %s failed.\n" |
- "return code: %s\n output:\n%s" % |
- (vm.name, match, data)) |
+ logging.debug("Starting ksm_overcommit_guest.py on guest %s", vm.name) |
+ session.sendline("python /tmp/ksm_overcommit_guest.py") |
+ try: |
+ session.read_until_last_line_matches(["PASS:", "FAIL:"], timeout) |
+ except kvm_subprocess.ExpectProcessTerminatedError, e: |
+ e_msg = ("Command ksm_overcommit_guest.py on vm '%s' failed: %s" % |
+ (vm.name, str(e))) |
+ raise error.TestFail(e_msg) |
def _execute_allocator(command, vm, session, timeout): |
""" |
- Execute a given command on allocator.py main loop, indicating the vm |
- the command was executed on. |
+ Execute a given command on ksm_overcommit_guest.py main loop, |
+ indicating the vm the command was executed on. |
@param command: Command that will be executed. |
@param vm: VM object. |
@@ -47,15 +47,18 @@ def run_ksm_overcommit(test, params, env): |
@return: Tuple (match index, data) |
""" |
- logging.debug("Executing '%s' on allocator.py loop, vm: %s, timeout: %s", |
- command, vm.name, timeout) |
+ logging.debug("Executing '%s' on ksm_overcommit_guest.py loop, " |
+ "vm: %s, timeout: %s", command, vm.name, timeout) |
session.sendline(command) |
- (match, data) = session.read_until_last_line_matches(["PASS:","FAIL:"], |
+ try: |
+ (match, data) = session.read_until_last_line_matches( |
+ ["PASS:","FAIL:"], |
timeout) |
- if match == 1 or match is None: |
- raise error.TestFail("Failed to execute '%s' on allocator.py, " |
- "vm: %s, output:\n%s" % |
- (command, vm.name, data)) |
+ except kvm_subprocess.ExpectProcessTerminatedError, e: |
+ e_msg = ("Failed to execute command '%s' on " |
+ "ksm_overcommit_guest.py, vm '%s': %s" % |
+ (command, vm.name, str(e))) |
+ raise error.TestFail(e_msg) |
return (match, data) |
@@ -79,10 +82,8 @@ def run_ksm_overcommit(test, params, env): |
for session in lsessions: |
vm = lvms[lsessions.index(session)] |
- logging.debug("Turning off swap on vm %s" % vm.name) |
- ret = session.get_command_status("swapoff -a", timeout=300) |
- if ret is None or ret: |
- raise error.TestFail("Failed to swapoff on VM %s" % vm.name) |
+ logging.debug("Turning off swap on vm %s", vm.name) |
+ session.cmd("swapoff -a", timeout=300) |
# Start the allocator |
_start_allocator(vm, session, 60 * perf_ratio) |
@@ -97,7 +98,7 @@ def run_ksm_overcommit(test, params, env): |
a_cmd = "mem.value_fill(%d)" % skeys[0] |
_execute_allocator(a_cmd, vm, lsessions[i], 120 * perf_ratio) |
- # Let allocator.py do its job |
+ # Let ksm_overcommit_guest.py do its job |
# (until shared mem reaches expected value) |
shm = 0 |
j = 0 |
@@ -110,7 +111,7 @@ def run_ksm_overcommit(test, params, env): |
raise error.TestError("SHM didn't merge the memory until " |
"the DL on guest: %s" % vm.name) |
st = ksm_size / 200 * perf_ratio |
- logging.debug("Waiting %ds before proceeding..." % st) |
+ logging.debug("Waiting %ds before proceeding...", st) |
time.sleep(st) |
if (new_ksm): |
shm = get_ksmstat() |
@@ -136,8 +137,8 @@ def run_ksm_overcommit(test, params, env): |
logging.info("Phase 2: Split the pages on the first guest") |
a_cmd = "mem.static_random_fill()" |
- (match, data) = _execute_allocator(a_cmd, lvms[0], lsessions[0], |
- 120 * perf_ratio) |
+ data = _execute_allocator(a_cmd, lvms[0], lsessions[0], |
+ 120 * perf_ratio)[1] |
r_msg = data.splitlines()[-1] |
logging.debug("Return message of static_random_fill: %s", r_msg) |
@@ -167,8 +168,8 @@ def run_ksm_overcommit(test, params, env): |
vm = lvms[i] |
session = lsessions[i] |
a_cmd = "mem.static_random_fill()" |
- logging.debug("Executing %s on allocator.py loop, vm: %s", |
- a_cmd, vm.name) |
+ logging.debug("Executing %s on ksm_overcommit_guest.py loop, " |
+ "vm: %s", a_cmd, vm.name) |
session.sendline(a_cmd) |
out = "" |
@@ -184,7 +185,7 @@ def run_ksm_overcommit(test, params, env): |
if (ksm_swap): |
free_mem = (free_mem + |
int(utils.read_from_meminfo("SwapFree"))) |
- logging.debug("Free memory on host: %d" % (free_mem)) |
+ logging.debug("Free memory on host: %d", free_mem) |
# We need to keep some memory for python to run. |
if (free_mem < 64000) or (ksm_swap and |
@@ -194,15 +195,15 @@ def run_ksm_overcommit(test, params, env): |
lvms[j].destroy(gracefully = False) |
time.sleep(20) |
vm.monitor.cmd("c") |
- logging.debug("Only %s free memory, killing %d guests" % |
- (free_mem, (i-1))) |
+ logging.debug("Only %s free memory, killing %d guests", |
+ free_mem, (i - 1)) |
last_vm = i |
break |
out = session.read_nonblocking(0.1) |
time.sleep(2) |
- except OSError, (err): |
- logging.debug("Only %s host free memory, killing %d guests" % |
- (free_mem, (i - 1))) |
+ except OSError: |
+ logging.debug("Only %s host free memory, killing %d guests", |
+ free_mem, (i - 1)) |
logging.debug("Stopping %s", vm.name) |
vm.monitor.cmd("stop") |
for j in range(0, i): |
@@ -214,7 +215,7 @@ def run_ksm_overcommit(test, params, env): |
if last_vm != 0: |
break |
- logging.debug("Memory filled for guest %s" % (vm.name)) |
+ logging.debug("Memory filled for guest %s", vm.name) |
logging.info("Phase 3a: PASS") |
@@ -223,7 +224,7 @@ def run_ksm_overcommit(test, params, env): |
lsessions[i].close() |
if i == (vmsc - 1): |
logging.debug(kvm_test_utils.get_memory_info([lvms[i]])) |
- logging.debug("Destroying guest %s" % lvms[i].name) |
+ logging.debug("Destroying guest %s", lvms[i].name) |
lvms[i].destroy(gracefully = False) |
# Verify last machine with randomly generated memory |
@@ -232,7 +233,7 @@ def run_ksm_overcommit(test, params, env): |
(mem / 200 * 50 * perf_ratio)) |
logging.debug(kvm_test_utils.get_memory_info([lvms[last_vm]])) |
- (status, data) = lsessions[i].get_command_status_output("die()", 20) |
+ lsessions[i].cmd_output("die()", 20) |
lvms[last_vm].destroy(gracefully = False) |
logging.info("Phase 3b: PASS") |
@@ -248,14 +249,9 @@ def run_ksm_overcommit(test, params, env): |
session = lsessions[0] |
vm = lvms[0] |
for i in range(1, max_alloc): |
- lsessions.append(kvm_utils.wait_for(vm.remote_login, 360, 0, 2)) |
- if not lsessions[i]: |
- raise error.TestFail("Could not log into guest %s" % |
- vm.name) |
+ lsessions.append(vm.wait_for_login(timeout=360)) |
- ret = session.get_command_status("swapoff -a", timeout=300) |
- if ret != 0: |
- raise error.TestFail("Failed to turn off swap on %s" % vm.name) |
+ session.cmd("swapoff -a", timeout=300) |
for i in range(0, max_alloc): |
# Start the allocator |
@@ -264,8 +260,8 @@ def run_ksm_overcommit(test, params, env): |
logging.info("Phase 1: PASS") |
logging.info("Phase 2a: Simultaneous merging") |
- logging.debug("Memory used by allocator on guests = %dMB" % |
- (ksm_size / max_alloc)) |
+ logging.debug("Memory used by allocator on guests = %dMB", |
+ (ksm_size / max_alloc)) |
for i in range(0, max_alloc): |
a_cmd = "mem = MemFill(%d, %s, %s)" % ((ksm_size / max_alloc), |
@@ -275,7 +271,7 @@ def run_ksm_overcommit(test, params, env): |
a_cmd = "mem.value_fill(%d)" % (skeys[0]) |
_execute_allocator(a_cmd, vm, lsessions[i], 90 * perf_ratio) |
- # Wait until allocator.py merges the pages (3 * ksm_size / 3) |
+ # Wait until ksm_overcommit_guest.py merges the pages (3 * ksm_size / 3) |
shm = 0 |
i = 0 |
logging.debug("Target shared memory size: %s", ksm_size) |
@@ -300,46 +296,46 @@ def run_ksm_overcommit(test, params, env): |
# Actual splitting |
for i in range(0, max_alloc): |
a_cmd = "mem.static_random_fill()" |
- (match, data) = _execute_allocator(a_cmd, vm, lsessions[i], |
- 90 * perf_ratio) |
+ data = _execute_allocator(a_cmd, vm, lsessions[i], |
+ 90 * perf_ratio)[1] |
data = data.splitlines()[-1] |
logging.debug(data) |
out = int(data.split()[4]) |
- logging.debug("Performance: %dMB * 1000 / %dms = %dMB/s" % |
- ((ksm_size / max_alloc), out, |
- (ksm_size * 1000 / out / max_alloc))) |
+ logging.debug("Performance: %dMB * 1000 / %dms = %dMB/s", |
+ (ksm_size / max_alloc), out, |
+ (ksm_size * 1000 / out / max_alloc)) |
logging.debug(kvm_test_utils.get_memory_info([vm])) |
logging.info("Phase 2b: PASS") |
logging.info("Phase 2c: Simultaneous verification") |
for i in range(0, max_alloc): |
a_cmd = "mem.static_random_verify()" |
- (match, data) = _execute_allocator(a_cmd, vm, lsessions[i], |
- (mem / 200 * 50 * perf_ratio)) |
+ data = _execute_allocator(a_cmd, vm, lsessions[i], |
+ (mem / 200 * 50 * perf_ratio))[1] |
logging.info("Phase 2c: PASS") |
logging.info("Phase 2d: Simultaneous merging") |
# Actual splitting |
for i in range(0, max_alloc): |
a_cmd = "mem.value_fill(%d)" % skeys[0] |
- (match, data) = _execute_allocator(a_cmd, vm, lsessions[i], |
- 120 * perf_ratio) |
+ data = _execute_allocator(a_cmd, vm, lsessions[i], |
+ 120 * perf_ratio)[1] |
logging.debug(kvm_test_utils.get_memory_info([vm])) |
logging.info("Phase 2d: PASS") |
logging.info("Phase 2e: Simultaneous verification") |
for i in range(0, max_alloc): |
a_cmd = "mem.value_check(%d)" % skeys[0] |
- (match, data) = _execute_allocator(a_cmd, vm, lsessions[i], |
- (mem / 200 * 50 * perf_ratio)) |
+ data = _execute_allocator(a_cmd, vm, lsessions[i], |
+ (mem / 200 * 50 * perf_ratio))[1] |
logging.info("Phase 2e: PASS") |
logging.info("Phase 2f: Simultaneous spliting last 96B") |
for i in range(0, max_alloc): |
a_cmd = "mem.static_random_fill(96)" |
- (match, data) = _execute_allocator(a_cmd, vm, lsessions[i], |
- 60 * perf_ratio) |
+ data = _execute_allocator(a_cmd, vm, lsessions[i], |
+ 60 * perf_ratio)[1] |
data = data.splitlines()[-1] |
out = int(data.split()[4]) |
@@ -360,7 +356,7 @@ def run_ksm_overcommit(test, params, env): |
logging.debug("Cleaning up...") |
for i in range(0, max_alloc): |
- lsessions[i].get_command_status_output("die()", 20) |
+ lsessions[i].cmd_output("die()", 20) |
session.close() |
vm.destroy(gracefully = False) |
@@ -373,10 +369,12 @@ def run_ksm_overcommit(test, params, env): |
utils.run("echo 5000 > /sys/kernel/mm/ksm/pages_to_scan") |
utils.run("echo 1 > /sys/kernel/mm/ksm/run") |
- if (os.path.exists("/sys/kernel/mm/transparent_hugepage/enabled")): |
- utils.run("echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled ") |
- if (os.path.exists("/sys/kernel/mm/redhat_transparent_hugepage/enabled")): |
- utils.run("echo 'never' > /sys/kernel/mm/redhat_transparent_hugepage/enabled ") |
+ e_up = "/sys/kernel/mm/transparent_hugepage/enabled" |
+ e_rh = "/sys/kernel/mm/redhat_transparent_hugepage/enabled" |
+ if os.path.exists(e_up): |
+ utils.run("echo 'never' > %s" % e_up) |
+ if os.path.exists(e_rh): |
+ utils.run("echo 'never' > %s" % e_rh) |
new_ksm = True |
else: |
try: |
@@ -518,14 +516,14 @@ def run_ksm_overcommit(test, params, env): |
key = random.randrange(0, 999) |
dkeys.append(key) |
- logging.debug("skeys: %s" % skeys) |
- logging.debug("dkeys: %s" % dkeys) |
+ logging.debug("skeys: %s", skeys) |
+ logging.debug("dkeys: %s", dkeys) |
lvms = [] |
lsessions = [] |
# As we don't know the number and memory amount of VMs in advance, |
- # we need to specify and create them here (FIXME: not a nice thing) |
+ # we need to specify and create them here |
vm_name = params.get("main_vm") |
params['mem'] = mem |
params['vms'] = vm_name |
@@ -541,11 +539,11 @@ def run_ksm_overcommit(test, params, env): |
# ksm_size: amount of memory used by allocator |
ksm_size = mem - guest_reserve |
- logging.debug("Memory used by allocator on guests = %dM" % (ksm_size)) |
+ logging.debug("Memory used by allocator on guests = %dM", ksm_size) |
# Creating the first guest |
kvm_preprocessing.preprocess_vm(test, params, env, vm_name) |
- lvms.append(kvm_utils.env_get_vm(env, vm_name)) |
+ lvms.append(env.get_vm(vm_name)) |
if not lvms[0]: |
raise error.TestError("VM object not found in environment") |
if not lvms[0].is_alive(): |
@@ -554,9 +552,7 @@ def run_ksm_overcommit(test, params, env): |
logging.debug("Booting first guest %s", lvms[0].name) |
- lsessions.append(kvm_utils.wait_for(lvms[0].remote_login, 360, 0, 2)) |
- if not lsessions[0]: |
- raise error.TestFail("Could not log into first guest") |
+ lsessions.append(lvms[0].wait_for_login(timeout=360)) |
# Associate vm PID |
try: |
tmp = open(params.get('pid_' + vm_name), 'r') |
@@ -576,20 +572,16 @@ def run_ksm_overcommit(test, params, env): |
# Last VM is later used to run more allocators simultaneously |
lvms.append(lvms[0].clone(vm_name, params)) |
- kvm_utils.env_register_vm(env, vm_name, lvms[i]) |
+ env.register_vm(vm_name, lvms[i]) |
params['vms'] += " " + vm_name |
- logging.debug("Booting guest %s" % lvms[i].name) |
- if not lvms[i].create(): |
- raise error.TestFail("Cannot create VM %s" % lvms[i].name) |
+ logging.debug("Booting guest %s", lvms[i].name) |
+ lvms[i].create() |
if not lvms[i].is_alive(): |
raise error.TestError("VM %s seems to be dead; Test requires a" |
"living VM" % lvms[i].name) |
- lsessions.append(kvm_utils.wait_for(lvms[i].remote_login, 360, 0, 2)) |
- if not lsessions[i]: |
- raise error.TestFail("Could not log into guest %s" % |
- lvms[i].name) |
+ lsessions.append(lvms[i].wait_for_login(timeout=360)) |
try: |
tmp = open(params.get('pid_' + vm_name), 'r') |
params['pid_' + vm_name] = int(tmp.readline()) |
@@ -602,13 +594,12 @@ def run_ksm_overcommit(test, params, env): |
time.sleep(vmsc * 2 * perf_ratio) |
logging.debug(kvm_test_utils.get_memory_info(lvms)) |
- # Copy allocator.py into guests |
+ # Copy ksm_overcommit_guest.py into guests |
pwd = os.path.join(os.environ['AUTODIR'],'tests/kvm') |
- vksmd_src = os.path.join(pwd, "scripts/allocator.py") |
+ vksmd_src = os.path.join(pwd, "scripts/ksm_overcommit_guest.py") |
dst_dir = "/tmp" |
for vm in lvms: |
- if not vm.copy_files_to(vksmd_src, dst_dir): |
- raise error.TestFail("copy_files_to failed %s" % vm.name) |
+ vm.copy_files_to(vksmd_src, dst_dir) |
logging.info("Phase 0: PASS") |
if params['ksm_mode'] == "parallel": |