Skip to content

Commit 178469c

Browse files
authored
Merge pull request #6318 from liang-cong-red-hat/new_case_VIRT-299024
Add new case VIRT-299024 for memory balloon freepagereporting
2 parents 483bd78 + afca49f commit 178469c

File tree

2 files changed

+171
-0
lines changed

2 files changed

+171
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
- memory.balloon.freepagereporting:
2+
type = memory_balloon_freepagereporting
3+
start_vm = no
4+
current_mem = 4194304
5+
mem_value = 4194304
6+
set_memroy = 3145728
7+
mem_consume_cmd = "timeout 20s memhog -r80 %sk"
8+
unconsumed_mem = 204800
9+
variants:
10+
- virtio:
11+
model = "virtio"
12+
- virtio-non-transitional:
13+
no s390-virtio
14+
model = "virtio-non-transitional"
15+
variants:
16+
- undefined:
17+
freepage_reporting_config = ""
18+
max_memory_difference = 51200
19+
- off:
20+
freepagereporting = off
21+
freepage_reporting_config = ", 'freepage_reporting':'${freepagereporting}'"
22+
max_memory_difference = 51200
23+
- on:
24+
freepagereporting = on
25+
freepage_reporting_config = ", 'freepage_reporting':'${freepagereporting}'"
26+
min_memory_difference = 819200
27+
memballoon_dict ={'model':'${model}' ${freepage_reporting_config}}
28+
mem_attrs = {'memory_unit':'KiB','memory':${mem_value},'current_mem':${current_mem},'current_mem_unit':'KiB'}
29+
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2+
#
3+
# Copyright Red Hat
4+
#
5+
# SPDX-License-Identifier: GPL-2.0
6+
#
7+
# Author: Liang Cong <[email protected]>
8+
#
9+
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10+
import re
11+
import time
12+
13+
from virttest import utils_misc
14+
from virttest import virsh
15+
from virttest.libvirt_xml import vm_xml
16+
from virttest.libvirt_xml.devices import memballoon
17+
from virttest.staging import utils_memory
18+
from virttest.utils_test import libvirt
19+
20+
21+
def run(test, params, env):
22+
"""
23+
Verify the freepagereporting takes effect with various memory balloon models
24+
"""
25+
def get_rss_mem_list(timeout=30):
26+
""""
27+
Get rss memory list from virsh dommemstat cmd per second
28+
29+
:param timeout: timeout of getting rss memory list from virsh dommemstat cmd
30+
:return: rss memory list
31+
"""
32+
current = 0
33+
rss_mem_list = []
34+
while current < timeout:
35+
time.sleep(1)
36+
rss_mem_list.append(get_rss_mem())
37+
current += 1
38+
return rss_mem_list
39+
40+
def get_rss_mem():
41+
""""
42+
Get rss memory from virsh dommemstat cmd
43+
"""
44+
output = virsh.dommemstat(vm_name, **virsh_dargs).stdout_text
45+
match = re.search(r"rss\s+(\d+)", output)
46+
return int(match.group(1))
47+
48+
def run_test():
49+
"""
50+
Test steps
51+
1. Define guest
52+
2. Start the domain
53+
3. Check the memory usage of the guest on host
54+
4. Login the guest and consume the guest memory
55+
5. Verify the memory usage is increased after consuming more memory on host
56+
6. Check the memory after memory consumption
57+
"""
58+
test.log.info("TEST_STEP1: Define guest")
59+
vmxml.del_device('memballoon', by_tag=True)
60+
mem_balloon = memballoon.Memballoon()
61+
mem_balloon.setup_attrs(**memballoon_dict)
62+
vmxml.devices = vmxml.devices.append(mem_balloon)
63+
vmxml.setup_attrs(**mem_attrs)
64+
vmxml.sync()
65+
66+
test.log.info("TEST_STEP2: Start the domain")
67+
vm.start()
68+
69+
test.log.info("TEST_STEP3: Check the memory usage of the guest on host")
70+
session = vm.wait_for_login()
71+
init_rss = get_rss_mem()
72+
73+
test.log.info(
74+
"TEST_STEP4: Login the guest and consume the guest memory")
75+
rss_mem_thread = utils_misc.InterruptedThread(get_rss_mem_list)
76+
rss_mem_thread.start()
77+
free_mem = utils_memory.freememtotal(session)
78+
session.cmd_status("swapoff -a")
79+
session.cmd_status(mem_consume_cmd % (free_mem - unconsumed_mem))
80+
session.close()
81+
rss_mem_list = rss_mem_thread.join()
82+
test.log.debug(
83+
"The rss memory list is %s during guest consumption." % rss_mem_list)
84+
85+
test.log.info(
86+
"TEST_STEP5: Verify the memory usage is increased after consuming more memory on host")
87+
second_rss_mem = max(rss_mem_list)
88+
if second_rss_mem < init_rss:
89+
test.fail("Expected rss memory after consuming %s is larger than %s" % (
90+
second_rss_mem, init_rss))
91+
92+
test.log.info("TEST_STEP6: Check the memory after memory consumption")
93+
third_rss_mem = rss_mem_list[-1]
94+
rss_mem_changed = second_rss_mem - third_rss_mem
95+
if max_memory_difference and abs(rss_mem_changed) > max_memory_difference:
96+
test.fail("Expected rss memory changed lower than %s, but got %s" % (
97+
max_memory_difference, abs(rss_mem_changed)))
98+
if min_memory_difference and rss_mem_changed < min_memory_difference:
99+
test.fail("Expected rss memory changed larger than %s, but got %s" % (
100+
min_memory_difference, rss_mem_changed))
101+
102+
test.log.info(
103+
"TEST_STEP7: Change the current memory allocation of the guest.")
104+
result = virsh.setmem(domain=vm_name, size=set_memory, **virsh_dargs)
105+
libvirt.check_exit_status(result)
106+
107+
test.log.info(
108+
"TEST_STEP8: Check the memory allocation config by virsh dominfo.")
109+
if not utils_misc.wait_for(lambda: vm.get_used_mem() == int(set_memory), timeout=10):
110+
test.fail("Expect used memory of dominfo is %s, but got %s" % (
111+
set_memory, vm.get_used_mem()))
112+
max_mem = vm.get_max_mem()
113+
if max_mem != int(mem_value):
114+
test.fail("Expected max memory of dominfo is %s, but got %s" %
115+
(mem_value, max_mem))
116+
117+
def teardown_test():
118+
"""
119+
Clean test environment.
120+
"""
121+
test.log.info("TEST_TEARDOWN: Clean up environment.")
122+
bkxml.sync()
123+
124+
vm_name = params.get("main_vm")
125+
vm = env.get_vm(vm_name)
126+
vmxml = vm_xml.VMXML.new_from_inactive_dumpxml(vm_name)
127+
bkxml = vmxml.copy()
128+
memballoon_dict = eval(params.get('memballoon_dict', '{}'))
129+
mem_attrs = eval(params.get('mem_attrs', '{}'))
130+
virsh_dargs = {"debug": True, "ignore_status": True}
131+
max_memory_difference = int(params.get('max_memory_difference', '0'))
132+
min_memory_difference = int(params.get('min_memory_difference', '0'))
133+
set_memory = params.get('set_memroy')
134+
mem_value = params.get('mem_value')
135+
mem_consume_cmd = params.get('mem_consume_cmd')
136+
unconsumed_mem = int(params.get('unconsumed_mem'))
137+
138+
try:
139+
run_test()
140+
141+
finally:
142+
teardown_test()

0 commit comments

Comments
 (0)