selftests/damon: add a test for DAMOS apply intervals

Add a selftest for DAMOS apply intervals.  It runs two schemes having
different apply interval agains an artificial memory access workload, and
check if the scheme with smaller apply interval was applied more
frequently.

Link: https://lkml.kernel.org/r/20240207203134.69976-6-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
SeongJae Park
2024-02-07 12:31:31 -08:00
committed by Andrew Morton
parent 51f58c9da1
commit ce7a283465
2 changed files with 68 additions and 1 deletions
+1 -1
View File
@@ -12,7 +12,7 @@ TEST_PROGS += debugfs_rm_non_contexts.sh
TEST_PROGS += sysfs.sh sysfs_update_removed_scheme_dir.sh
TEST_PROGS += sysfs_update_schemes_tried_regions_hang.py
TEST_PROGS += sysfs_update_schemes_tried_regions_wss_estimation.py
TEST_PROGS += damos_quota.py
TEST_PROGS += damos_quota.py damos_apply_interval.py
TEST_PROGS += reclaim.sh lru_sort.sh
include ../lib.mk
@@ -0,0 +1,67 @@
#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0
import subprocess
import time
import _damon_sysfs
def main():
# access two 10 MiB memory regions, 2 second per each
sz_region = 10 * 1024 * 1024
proc = subprocess.Popen(['./access_memory', '2', '%d' % sz_region, '2000'])
# Set quota up to 1 MiB per 100 ms
kdamonds = _damon_sysfs.Kdamonds([_damon_sysfs.Kdamond(
contexts=[_damon_sysfs.DamonCtx(
ops='vaddr',
targets=[_damon_sysfs.DamonTarget(pid=proc.pid)],
schemes=[
_damon_sysfs.Damos(
access_pattern=_damon_sysfs.DamosAccessPattern(
# >= 25% access rate, >= 200ms age
nr_accesses=[5, 20], age=[2, 2**64 - 1]),
# aggregation interval (100 ms) is used
apply_interval_us=0),
# use 10ms apply interval
_damon_sysfs.Damos(
access_pattern=_damon_sysfs.DamosAccessPattern(
# >= 25% access rate, >= 200ms age
nr_accesses=[5, 20], age=[2, 2**64 - 1]),
# explicitly set 10 ms apply interval
apply_interval_us=10 * 1000)
] # schemes
)] # contexts
)]) # kdamonds
err = kdamonds.start()
if err != None:
print('kdamond start failed: %s' % err)
exit(1)
wss_collected = []
nr_quota_exceeds = 0
while proc.poll() == None:
time.sleep(0.1)
err = kdamonds.kdamonds[0].update_schemes_stats()
if err != None:
print('stats update failed: %s' % err)
exit(1)
schemes = kdamonds.kdamonds[0].contexts[0].schemes
nr_tried_stats = [s.stats.nr_tried for s in schemes]
if nr_tried_stats[0] == 0 or nr_tried_stats[1] == 0:
print('scheme(s) are not tried')
exit(1)
# Because the second scheme was having the apply interval that is ten times
# lower than that of the first scheme, the second scheme should be tried
# about ten times more frequently than the first scheme. For possible
# timing errors, check if it was at least nine times more freuqnetly tried.
ratio = nr_tried_stats[1] / nr_tried_stats[0]
if ratio < 9:
print('%d / %d = %f (< 9)' %
(nr_tried_stats[1], nr_tried_stats[0], ratio))
exit(1)
if __name__ == '__main__':
main()