damos_tried_regions.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #!/usr/bin/env python3
  2. # SPDX-License-Identifier: GPL-2.0
  3. import subprocess
  4. import time
  5. import _damon_sysfs
  6. def main():
  7. # repeatedly access even-numbered ones in 14 regions of 10 MiB size
  8. sz_region = 10 * 1024 * 1024
  9. proc = subprocess.Popen(['./access_memory_even', '14', '%d' % sz_region])
  10. # stat every monitored regions
  11. kdamonds = _damon_sysfs.Kdamonds([_damon_sysfs.Kdamond(
  12. contexts=[_damon_sysfs.DamonCtx(
  13. ops='vaddr',
  14. targets=[_damon_sysfs.DamonTarget(pid=proc.pid)],
  15. schemes=[_damon_sysfs.Damos(action='stat',
  16. )] # schemes
  17. )] # contexts
  18. )]) # kdamonds
  19. err = kdamonds.start()
  20. if err is not None:
  21. proc.terminate()
  22. print('kdamond start failed: %s' % err)
  23. exit(1)
  24. collected_nr_regions = []
  25. while proc.poll() is None:
  26. time.sleep(0.1)
  27. err = kdamonds.kdamonds[0].update_schemes_tried_regions()
  28. if err is not None:
  29. proc.terminate()
  30. print('tried regions update failed: %s' % err)
  31. exit(1)
  32. scheme = kdamonds.kdamonds[0].contexts[0].schemes[0]
  33. if scheme.tried_regions is None:
  34. proc.terminate()
  35. print('tried regions is not collected')
  36. exit(1)
  37. nr_tried_regions = len(scheme.tried_regions)
  38. if nr_tried_regions <= 0:
  39. proc.terminate()
  40. print('tried regions is not created')
  41. exit(1)
  42. collected_nr_regions.append(nr_tried_regions)
  43. if len(collected_nr_regions) > 10:
  44. break
  45. proc.terminate()
  46. collected_nr_regions.sort()
  47. sample = collected_nr_regions[4]
  48. print('50-th percentile nr_regions: %d' % sample)
  49. print('expectation (>= 14) is %s' % 'met' if sample >= 14 else 'not met')
  50. if collected_nr_regions[4] < 14:
  51. print('full nr_regions:')
  52. print('\n'.join(collected_nr_regions))
  53. exit(1)
  54. if __name__ == '__main__':
  55. main()