1#!/usr/bin/env python3 2# SPDX-License-Identifier: GPL-2.0 3 4import subprocess 5import time 6 7import _damon_sysfs 8 9def main(): 10 # access two 10 MiB memory regions, 2 second per each 11 sz_region = 10 * 1024 * 1024 12 proc = subprocess.Popen(['./access_memory', '2', '%d' % sz_region, '2000']) 13 14 # Set quota up to 1 MiB per 100 ms 15 kdamonds = _damon_sysfs.Kdamonds([_damon_sysfs.Kdamond( 16 contexts=[_damon_sysfs.DamonCtx( 17 ops='vaddr', 18 targets=[_damon_sysfs.DamonTarget(pid=proc.pid)], 19 schemes=[ 20 _damon_sysfs.Damos( 21 access_pattern=_damon_sysfs.DamosAccessPattern( 22 # >= 25% access rate, >= 200ms age 23 nr_accesses=[5, 20], age=[2, 2**64 - 1]), 24 # aggregation interval (100 ms) is used 25 apply_interval_us=0), 26 # use 10ms apply interval 27 _damon_sysfs.Damos( 28 access_pattern=_damon_sysfs.DamosAccessPattern( 29 # >= 25% access rate, >= 200ms age 30 nr_accesses=[5, 20], age=[2, 2**64 - 1]), 31 # explicitly set 10 ms apply interval 32 apply_interval_us=10 * 1000) 33 ] # schemes 34 )] # contexts 35 )]) # kdamonds 36 37 err = kdamonds.start() 38 if err != None: 39 print('kdamond start failed: %s' % err) 40 exit(1) 41 42 wss_collected = [] 43 nr_quota_exceeds = 0 44 while proc.poll() == None: 45 time.sleep(0.1) 46 err = kdamonds.kdamonds[0].update_schemes_stats() 47 if err != None: 48 print('stats update failed: %s' % err) 49 exit(1) 50 schemes = kdamonds.kdamonds[0].contexts[0].schemes 51 nr_tried_stats = [s.stats.nr_tried for s in schemes] 52 if nr_tried_stats[0] == 0 or nr_tried_stats[1] == 0: 53 print('scheme(s) are not tried') 54 exit(1) 55 56 # Because the second scheme was having the apply interval that is ten times 57 # lower than that of the first scheme, the second scheme should be tried 58 # about ten times more frequently than the first scheme. For possible 59 # timing errors, check if it was at least nine times more freuqnetly tried. 60 ratio = nr_tried_stats[1] / nr_tried_stats[0] 61 if ratio < 9: 62 print('%d / %d = %f (< 9)' % 63 (nr_tried_stats[1], nr_tried_stats[0], ratio)) 64 exit(1) 65 66if __name__ == '__main__': 67 main() 68