|
| 1 | +#!/usr/bin/env python3 |
| 2 | +# SPDX-License-Identifier: GPL-2.0 |
| 3 | + |
| 4 | +import subprocess |
| 5 | +import time |
| 6 | + |
| 7 | +import _damon_sysfs |
| 8 | + |
| 9 | +def 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 | + goal = _damon_sysfs.DamosQuotaGoal( |
| 15 | + metric=_damon_sysfs.qgoal_metric_user_input, target_value=10000) |
| 16 | + kdamonds = _damon_sysfs.Kdamonds([_damon_sysfs.Kdamond( |
| 17 | + contexts=[_damon_sysfs.DamonCtx( |
| 18 | + ops='vaddr', |
| 19 | + targets=[_damon_sysfs.DamonTarget(pid=proc.pid)], |
| 20 | + schemes=[_damon_sysfs.Damos( |
| 21 | + action='stat', |
| 22 | + quota=_damon_sysfs.DamosQuota( |
| 23 | + goals=[goal], reset_interval_ms=100), |
| 24 | + )] # schemes |
| 25 | + )] # contexts |
| 26 | + )]) # kdamonds |
| 27 | + |
| 28 | + err = kdamonds.start() |
| 29 | + if err != None: |
| 30 | + print('kdamond start failed: %s' % err) |
| 31 | + exit(1) |
| 32 | + |
| 33 | + score_values_to_test = [0, 15000, 5000, 18000] |
| 34 | + while proc.poll() == None: |
| 35 | + if len(score_values_to_test) == 0: |
| 36 | + time.sleep(0.1) |
| 37 | + continue |
| 38 | + |
| 39 | + goal.current_value = score_values_to_test.pop(0) |
| 40 | + expect_increase = goal.current_value < goal.target_value |
| 41 | + |
| 42 | + err = kdamonds.kdamonds[0].commit_schemes_quota_goals() |
| 43 | + if err is not None: |
| 44 | + print('commit_schemes_quota_goals failed: %s' % err) |
| 45 | + exit(1) |
| 46 | + |
| 47 | + err = kdamonds.kdamonds[0].update_schemes_effective_quotas() |
| 48 | + if err is not None: |
| 49 | + print('before-update_schemes_effective_quotas failed: %s' % err) |
| 50 | + exit(1) |
| 51 | + last_effective_bytes = goal.effective_bytes |
| 52 | + |
| 53 | + time.sleep(0.5) |
| 54 | + |
| 55 | + err = kdamonds.kdamonds[0].update_schemes_effective_quotas() |
| 56 | + if err is not None: |
| 57 | + print('after-update_schemes_effective_quotas failed: %s' % err) |
| 58 | + exit(1) |
| 59 | + |
| 60 | + print('score: %s, effective quota: %d -> %d (%.3fx)' % ( |
| 61 | + goal.current_value, last_effective_bytes, goal.effective_bytes, |
| 62 | + goal.effective_bytes / last_effective_bytes |
| 63 | + if last_effective_bytes != 0 else -1.0)) |
| 64 | + |
| 65 | + if last_effective_bytes == goal.effective_bytes: |
| 66 | + print('efective bytes not changed: %d' % goal.effective_bytes) |
| 67 | + exit(1) |
| 68 | + |
| 69 | + increased = last_effective_bytes < goal.effective_bytes |
| 70 | + if expect_increase != increased: |
| 71 | + print('expectation of increase (%s) != increased (%s)' % |
| 72 | + (expect_increase, increased)) |
| 73 | + exit(1) |
| 74 | + last_effective_bytes = goal.effective_bytes |
| 75 | + |
| 76 | +if __name__ == '__main__': |
| 77 | + main() |
0 commit comments