1.. SPDX-License-Identifier: GPL-2.0 2 3=============== 4Detailed Usages 5=============== 6 7DAMON provides below interfaces for different users. 8 9- *DAMON user space tool.* 10 `This <https://github.com/awslabs/damo>`_ is for privileged people such as 11 system administrators who want a just-working human-friendly interface. 12 Using this, users can use the DAMON’s major features in a human-friendly way. 13 It may not be highly tuned for special cases, though. It supports both 14 virtual and physical address spaces monitoring. For more detail, please 15 refer to its `usage document 16 <https://github.com/awslabs/damo/blob/next/USAGE.md>`_. 17- *sysfs interface.* 18 :ref:`This <sysfs_interface>` is for privileged user space programmers who 19 want more optimized use of DAMON. Using this, users can use DAMON’s major 20 features by reading from and writing to special sysfs files. Therefore, 21 you can write and use your personalized DAMON sysfs wrapper programs that 22 reads/writes the sysfs files instead of you. The `DAMON user space tool 23 <https://github.com/awslabs/damo>`_ is one example of such programs. It 24 supports both virtual and physical address spaces monitoring. Note that this 25 interface provides only simple :ref:`statistics <damos_stats>` for the 26 monitoring results. For detailed monitoring results, DAMON provides a 27 :ref:`tracepoint <tracepoint>`. 28- *debugfs interface.* 29 :ref:`This <debugfs_interface>` is almost identical to :ref:`sysfs interface 30 <sysfs_interface>`. This will be removed after next LTS kernel is released, 31 so users should move to the :ref:`sysfs interface <sysfs_interface>`. 32- *Kernel Space Programming Interface.* 33 :doc:`This </vm/damon/api>` is for kernel space programmers. Using this, 34 users can utilize every feature of DAMON most flexibly and efficiently by 35 writing kernel space DAMON application programs for you. You can even extend 36 DAMON for various address spaces. For detail, please refer to the interface 37 :doc:`document </vm/damon/api>`. 38 39.. _sysfs_interface: 40 41sysfs Interface 42=============== 43 44DAMON sysfs interface is built when ``CONFIG_DAMON_SYSFS`` is defined. It 45creates multiple directories and files under its sysfs directory, 46``<sysfs>/kernel/mm/damon/``. You can control DAMON by writing to and reading 47from the files under the directory. 48 49For a short example, users can monitor the virtual address space of a given 50workload as below. :: 51 52 # cd /sys/kernel/mm/damon/admin/ 53 # echo 1 > kdamonds/nr && echo 1 > kdamonds/0/contexts/nr 54 # echo vaddr > kdamonds/0/contexts/0/operations 55 # echo 1 > kdamonds/0/contexts/0/targets/nr 56 # echo $(pidof <workload>) > kdamonds/0/contexts/0/targets/0/pid 57 # echo on > kdamonds/0/state 58 59Files Hierarchy 60--------------- 61 62The files hierarchy of DAMON sysfs interface is shown below. In the below 63figure, parents-children relations are represented with indentations, each 64directory is having ``/`` suffix, and files in each directory are separated by 65comma (","). :: 66 67 /sys/kernel/mm/damon/admin 68 │ kdamonds/nr_kdamonds 69 │ │ 0/state,pid 70 │ │ │ contexts/nr_contexts 71 │ │ │ │ 0/avail_operations,operations 72 │ │ │ │ │ monitoring_attrs/ 73 │ │ │ │ │ │ intervals/sample_us,aggr_us,update_us 74 │ │ │ │ │ │ nr_regions/min,max 75 │ │ │ │ │ targets/nr_targets 76 │ │ │ │ │ │ 0/pid_target 77 │ │ │ │ │ │ │ regions/nr_regions 78 │ │ │ │ │ │ │ │ 0/start,end 79 │ │ │ │ │ │ │ │ ... 80 │ │ │ │ │ │ ... 81 │ │ │ │ │ schemes/nr_schemes 82 │ │ │ │ │ │ 0/action 83 │ │ │ │ │ │ │ access_pattern/ 84 │ │ │ │ │ │ │ │ sz/min,max 85 │ │ │ │ │ │ │ │ nr_accesses/min,max 86 │ │ │ │ │ │ │ │ age/min,max 87 │ │ │ │ │ │ │ quotas/ms,bytes,reset_interval_ms 88 │ │ │ │ │ │ │ │ weights/sz_permil,nr_accesses_permil,age_permil 89 │ │ │ │ │ │ │ watermarks/metric,interval_us,high,mid,low 90 │ │ │ │ │ │ │ stats/nr_tried,sz_tried,nr_applied,sz_applied,qt_exceeds 91 │ │ │ │ │ │ ... 92 │ │ │ │ ... 93 │ │ ... 94 95Root 96---- 97 98The root of the DAMON sysfs interface is ``<sysfs>/kernel/mm/damon/``, and it 99has one directory named ``admin``. The directory contains the files for 100privileged user space programs' control of DAMON. User space tools or deamons 101having the root permission could use this directory. 102 103kdamonds/ 104--------- 105 106The monitoring-related information including request specifications and results 107are called DAMON context. DAMON executes each context with a kernel thread 108called kdamond, and multiple kdamonds could run in parallel. 109 110Under the ``admin`` directory, one directory, ``kdamonds``, which has files for 111controlling the kdamonds exist. In the beginning, this directory has only one 112file, ``nr_kdamonds``. Writing a number (``N``) to the file creates the number 113of child directories named ``0`` to ``N-1``. Each directory represents each 114kdamond. 115 116kdamonds/<N>/ 117------------- 118 119In each kdamond directory, two files (``state`` and ``pid``) and one directory 120(``contexts``) exist. 121 122Reading ``state`` returns ``on`` if the kdamond is currently running, or 123``off`` if it is not running. Writing ``on`` or ``off`` makes the kdamond be 124in the state. Writing ``update_schemes_stats`` to ``state`` file updates the 125contents of stats files for each DAMON-based operation scheme of the kdamond. 126For details of the stats, please refer to :ref:`stats section 127<sysfs_schemes_stats>`. 128 129If the state is ``on``, reading ``pid`` shows the pid of the kdamond thread. 130 131``contexts`` directory contains files for controlling the monitoring contexts 132that this kdamond will execute. 133 134kdamonds/<N>/contexts/ 135---------------------- 136 137In the beginning, this directory has only one file, ``nr_contexts``. Writing a 138number (``N``) to the file creates the number of child directories named as 139``0`` to ``N-1``. Each directory represents each monitoring context. At the 140moment, only one context per kdamond is supported, so only ``0`` or ``1`` can 141be written to the file. 142 143contexts/<N>/ 144------------- 145 146In each context directory, two files (``avail_operations`` and ``operations``) 147and three directories (``monitoring_attrs``, ``targets``, and ``schemes``) 148exist. 149 150DAMON supports multiple types of monitoring operations, including those for 151virtual address space and the physical address space. You can get the list of 152available monitoring operations set on the currently running kernel by reading 153``avail_operations`` file. Based on the kernel configuration, the file will 154list some or all of below keywords. 155 156 - vaddr: Monitor virtual address spaces of specific processes 157 - paddr: Monitor the physical address space of the system 158 159You can set and get what type of monitoring operations DAMON will use for the 160context by writing one of the keywords listed in ``avail_operations`` file and 161reading from the ``operations`` file. 162 163contexts/<N>/monitoring_attrs/ 164------------------------------ 165 166Files for specifying attributes of the monitoring including required quality 167and efficiency of the monitoring are in ``monitoring_attrs`` directory. 168Specifically, two directories, ``intervals`` and ``nr_regions`` exist in this 169directory. 170 171Under ``intervals`` directory, three files for DAMON's sampling interval 172(``sample_us``), aggregation interval (``aggr_us``), and update interval 173(``update_us``) exist. You can set and get the values in micro-seconds by 174writing to and reading from the files. 175 176Under ``nr_regions`` directory, two files for the lower-bound and upper-bound 177of DAMON's monitoring regions (``min`` and ``max``, respectively), which 178controls the monitoring overhead, exist. You can set and get the values by 179writing to and rading from the files. 180 181For more details about the intervals and monitoring regions range, please refer 182to the Design document (:doc:`/vm/damon/design`). 183 184contexts/<N>/targets/ 185--------------------- 186 187In the beginning, this directory has only one file, ``nr_targets``. Writing a 188number (``N``) to the file creates the number of child directories named ``0`` 189to ``N-1``. Each directory represents each monitoring target. 190 191targets/<N>/ 192------------ 193 194In each target directory, one file (``pid_target``) and one directory 195(``regions``) exist. 196 197If you wrote ``vaddr`` to the ``contexts/<N>/operations``, each target should 198be a process. You can specify the process to DAMON by writing the pid of the 199process to the ``pid_target`` file. 200 201targets/<N>/regions 202------------------- 203 204When ``vaddr`` monitoring operations set is being used (``vaddr`` is written to 205the ``contexts/<N>/operations`` file), DAMON automatically sets and updates the 206monitoring target regions so that entire memory mappings of target processes 207can be covered. However, users could want to set the initial monitoring region 208to specific address ranges. 209 210In contrast, DAMON do not automatically sets and updates the monitoring target 211regions when ``paddr`` monitoring operations set is being used (``paddr`` is 212written to the ``contexts/<N>/operations``). Therefore, users should set the 213monitoring target regions by themselves in the case. 214 215For such cases, users can explicitly set the initial monitoring target regions 216as they want, by writing proper values to the files under this directory. 217 218In the beginning, this directory has only one file, ``nr_regions``. Writing a 219number (``N``) to the file creates the number of child directories named ``0`` 220to ``N-1``. Each directory represents each initial monitoring target region. 221 222regions/<N>/ 223------------ 224 225In each region directory, you will find two files (``start`` and ``end``). You 226can set and get the start and end addresses of the initial monitoring target 227region by writing to and reading from the files, respectively. 228 229contexts/<N>/schemes/ 230--------------------- 231 232For usual DAMON-based data access aware memory management optimizations, users 233would normally want the system to apply a memory management action to a memory 234region of a specific access pattern. DAMON receives such formalized operation 235schemes from the user and applies those to the target memory regions. Users 236can get and set the schemes by reading from and writing to files under this 237directory. 238 239In the beginning, this directory has only one file, ``nr_schemes``. Writing a 240number (``N``) to the file creates the number of child directories named ``0`` 241to ``N-1``. Each directory represents each DAMON-based operation scheme. 242 243schemes/<N>/ 244------------ 245 246In each scheme directory, four directories (``access_pattern``, ``quotas``, 247``watermarks``, and ``stats``) and one file (``action``) exist. 248 249The ``action`` file is for setting and getting what action you want to apply to 250memory regions having specific access pattern of the interest. The keywords 251that can be written to and read from the file and their meaning are as below. 252 253 - ``willneed``: Call ``madvise()`` for the region with ``MADV_WILLNEED`` 254 - ``cold``: Call ``madvise()`` for the region with ``MADV_COLD`` 255 - ``pageout``: Call ``madvise()`` for the region with ``MADV_PAGEOUT`` 256 - ``hugepage``: Call ``madvise()`` for the region with ``MADV_HUGEPAGE`` 257 - ``nohugepage``: Call ``madvise()`` for the region with ``MADV_NOHUGEPAGE`` 258 - ``stat``: Do nothing but count the statistics 259 260schemes/<N>/access_pattern/ 261--------------------------- 262 263The target access pattern of each DAMON-based operation scheme is constructed 264with three ranges including the size of the region in bytes, number of 265monitored accesses per aggregate interval, and number of aggregated intervals 266for the age of the region. 267 268Under the ``access_pattern`` directory, three directories (``sz``, 269``nr_accesses``, and ``age``) each having two files (``min`` and ``max``) 270exist. You can set and get the access pattern for the given scheme by writing 271to and reading from the ``min`` and ``max`` files under ``sz``, 272``nr_accesses``, and ``age`` directories, respectively. 273 274schemes/<N>/quotas/ 275------------------- 276 277Optimal ``target access pattern`` for each ``action`` is workload dependent, so 278not easy to find. Worse yet, setting a scheme of some action too aggressive 279can cause severe overhead. To avoid such overhead, users can limit time and 280size quota for each scheme. In detail, users can ask DAMON to try to use only 281up to specific time (``time quota``) for applying the action, and to apply the 282action to only up to specific amount (``size quota``) of memory regions having 283the target access pattern within a given time interval (``reset interval``). 284 285When the quota limit is expected to be exceeded, DAMON prioritizes found memory 286regions of the ``target access pattern`` based on their size, access frequency, 287and age. For personalized prioritization, users can set the weights for the 288three properties. 289 290Under ``quotas`` directory, three files (``ms``, ``bytes``, 291``reset_interval_ms``) and one directory (``weights``) having three files 292(``sz_permil``, ``nr_accesses_permil``, and ``age_permil``) in it exist. 293 294You can set the ``time quota`` in milliseconds, ``size quota`` in bytes, and 295``reset interval`` in milliseconds by writing the values to the three files, 296respectively. You can also set the prioritization weights for size, access 297frequency, and age in per-thousand unit by writing the values to the three 298files under the ``weights`` directory. 299 300schemes/<N>/watermarks/ 301----------------------- 302 303To allow easy activation and deactivation of each scheme based on system 304status, DAMON provides a feature called watermarks. The feature receives five 305values called ``metric``, ``interval``, ``high``, ``mid``, and ``low``. The 306``metric`` is the system metric such as free memory ratio that can be measured. 307If the metric value of the system is higher than the value in ``high`` or lower 308than ``low`` at the memoent, the scheme is deactivated. If the value is lower 309than ``mid``, the scheme is activated. 310 311Under the watermarks directory, five files (``metric``, ``interval_us``, 312``high``, ``mid``, and ``low``) for setting each value exist. You can set and 313get the five values by writing to the files, respectively. 314 315Keywords and meanings of those that can be written to the ``metric`` file are 316as below. 317 318 - none: Ignore the watermarks 319 - free_mem_rate: System's free memory rate (per thousand) 320 321The ``interval`` should written in microseconds unit. 322 323.. _sysfs_schemes_stats: 324 325schemes/<N>/stats/ 326------------------ 327 328DAMON counts the total number and bytes of regions that each scheme is tried to 329be applied, the two numbers for the regions that each scheme is successfully 330applied, and the total number of the quota limit exceeds. This statistics can 331be used for online analysis or tuning of the schemes. 332 333The statistics can be retrieved by reading the files under ``stats`` directory 334(``nr_tried``, ``sz_tried``, ``nr_applied``, ``sz_applied``, and 335``qt_exceeds``), respectively. The files are not updated in real time, so you 336should ask DAMON sysfs interface to updte the content of the files for the 337stats by writing a special keyword, ``update_schemes_stats`` to the relevant 338``kdamonds/<N>/state`` file. 339 340Example 341~~~~~~~ 342 343Below commands applies a scheme saying "If a memory region of size in [4KiB, 3448KiB] is showing accesses per aggregate interval in [0, 5] for aggregate 345interval in [10, 20], page out the region. For the paging out, use only up to 34610ms per second, and also don't page out more than 1GiB per second. Under the 347limitation, page out memory regions having longer age first. Also, check the 348free memory rate of the system every 5 seconds, start the monitoring and paging 349out when the free memory rate becomes lower than 50%, but stop it if the free 350memory rate becomes larger than 60%, or lower than 30%". :: 351 352 # cd <sysfs>/kernel/mm/damon/admin 353 # # populate directories 354 # echo 1 > kdamonds/nr_kdamonds; echo 1 > kdamonds/0/contexts/nr_contexts; 355 # echo 1 > kdamonds/0/contexts/0/schemes/nr_schemes 356 # cd kdamonds/0/contexts/0/schemes/0 357 # # set the basic access pattern and the action 358 # echo 4096 > access_patterns/sz/min 359 # echo 8192 > access_patterns/sz/max 360 # echo 0 > access_patterns/nr_accesses/min 361 # echo 5 > access_patterns/nr_accesses/max 362 # echo 10 > access_patterns/age/min 363 # echo 20 > access_patterns/age/max 364 # echo pageout > action 365 # # set quotas 366 # echo 10 > quotas/ms 367 # echo $((1024*1024*1024)) > quotas/bytes 368 # echo 1000 > quotas/reset_interval_ms 369 # # set watermark 370 # echo free_mem_rate > watermarks/metric 371 # echo 5000000 > watermarks/interval_us 372 # echo 600 > watermarks/high 373 # echo 500 > watermarks/mid 374 # echo 300 > watermarks/low 375 376Please note that it's highly recommended to use user space tools like `damo 377<https://github.com/awslabs/damo>`_ rather than manually reading and writing 378the files as above. Above is only for an example. 379 380.. _debugfs_interface: 381 382debugfs Interface 383================= 384 385DAMON exports eight files, ``attrs``, ``target_ids``, ``init_regions``, 386``schemes``, ``monitor_on``, ``kdamond_pid``, ``mk_contexts`` and 387``rm_contexts`` under its debugfs directory, ``<debugfs>/damon/``. 388 389 390Attributes 391---------- 392 393Users can get and set the ``sampling interval``, ``aggregation interval``, 394``update interval``, and min/max number of monitoring target regions by 395reading from and writing to the ``attrs`` file. To know about the monitoring 396attributes in detail, please refer to the :doc:`/vm/damon/design`. For 397example, below commands set those values to 5 ms, 100 ms, 1,000 ms, 10 and 3981000, and then check it again:: 399 400 # cd <debugfs>/damon 401 # echo 5000 100000 1000000 10 1000 > attrs 402 # cat attrs 403 5000 100000 1000000 10 1000 404 405 406Target IDs 407---------- 408 409Some types of address spaces supports multiple monitoring target. For example, 410the virtual memory address spaces monitoring can have multiple processes as the 411monitoring targets. Users can set the targets by writing relevant id values of 412the targets to, and get the ids of the current targets by reading from the 413``target_ids`` file. In case of the virtual address spaces monitoring, the 414values should be pids of the monitoring target processes. For example, below 415commands set processes having pids 42 and 4242 as the monitoring targets and 416check it again:: 417 418 # cd <debugfs>/damon 419 # echo 42 4242 > target_ids 420 # cat target_ids 421 42 4242 422 423Users can also monitor the physical memory address space of the system by 424writing a special keyword, "``paddr\n``" to the file. Because physical address 425space monitoring doesn't support multiple targets, reading the file will show a 426fake value, ``42``, as below:: 427 428 # cd <debugfs>/damon 429 # echo paddr > target_ids 430 # cat target_ids 431 42 432 433Note that setting the target ids doesn't start the monitoring. 434 435 436Initial Monitoring Target Regions 437--------------------------------- 438 439In case of the virtual address space monitoring, DAMON automatically sets and 440updates the monitoring target regions so that entire memory mappings of target 441processes can be covered. However, users can want to limit the monitoring 442region to specific address ranges, such as the heap, the stack, or specific 443file-mapped area. Or, some users can know the initial access pattern of their 444workloads and therefore want to set optimal initial regions for the 'adaptive 445regions adjustment'. 446 447In contrast, DAMON do not automatically sets and updates the monitoring target 448regions in case of physical memory monitoring. Therefore, users should set the 449monitoring target regions by themselves. 450 451In such cases, users can explicitly set the initial monitoring target regions 452as they want, by writing proper values to the ``init_regions`` file. Each line 453of the input should represent one region in below form.:: 454 455 <target idx> <start address> <end address> 456 457The ``target idx`` should be the index of the target in ``target_ids`` file, 458starting from ``0``, and the regions should be passed in address order. For 459example, below commands will set a couple of address ranges, ``1-100`` and 460``100-200`` as the initial monitoring target region of pid 42, which is the 461first one (index ``0``) in ``target_ids``, and another couple of address 462ranges, ``20-40`` and ``50-100`` as that of pid 4242, which is the second one 463(index ``1``) in ``target_ids``.:: 464 465 # cd <debugfs>/damon 466 # cat target_ids 467 42 4242 468 # echo "0 1 100 469 0 100 200 470 1 20 40 471 1 50 100" > init_regions 472 473Note that this sets the initial monitoring target regions only. In case of 474virtual memory monitoring, DAMON will automatically updates the boundary of the 475regions after one ``update interval``. Therefore, users should set the 476``update interval`` large enough in this case, if they don't want the 477update. 478 479 480Schemes 481------- 482 483For usual DAMON-based data access aware memory management optimizations, users 484would simply want the system to apply a memory management action to a memory 485region of a specific access pattern. DAMON receives such formalized operation 486schemes from the user and applies those to the target processes. 487 488Users can get and set the schemes by reading from and writing to ``schemes`` 489debugfs file. Reading the file also shows the statistics of each scheme. To 490the file, each of the schemes should be represented in each line in below 491form:: 492 493 <target access pattern> <action> <quota> <watermarks> 494 495You can disable schemes by simply writing an empty string to the file. 496 497Target Access Pattern 498~~~~~~~~~~~~~~~~~~~~~ 499 500The ``<target access pattern>`` is constructed with three ranges in below 501form:: 502 503 min-size max-size min-acc max-acc min-age max-age 504 505Specifically, bytes for the size of regions (``min-size`` and ``max-size``), 506number of monitored accesses per aggregate interval for access frequency 507(``min-acc`` and ``max-acc``), number of aggregate intervals for the age of 508regions (``min-age`` and ``max-age``) are specified. Note that the ranges are 509closed interval. 510 511Action 512~~~~~~ 513 514The ``<action>`` is a predefined integer for memory management actions, which 515DAMON will apply to the regions having the target access pattern. The 516supported numbers and their meanings are as below. 517 518 - 0: Call ``madvise()`` for the region with ``MADV_WILLNEED`` 519 - 1: Call ``madvise()`` for the region with ``MADV_COLD`` 520 - 2: Call ``madvise()`` for the region with ``MADV_PAGEOUT`` 521 - 3: Call ``madvise()`` for the region with ``MADV_HUGEPAGE`` 522 - 4: Call ``madvise()`` for the region with ``MADV_NOHUGEPAGE`` 523 - 5: Do nothing but count the statistics 524 525Quota 526~~~~~ 527 528Optimal ``target access pattern`` for each ``action`` is workload dependent, so 529not easy to find. Worse yet, setting a scheme of some action too aggressive 530can cause severe overhead. To avoid such overhead, users can limit time and 531size quota for the scheme via the ``<quota>`` in below form:: 532 533 <ms> <sz> <reset interval> <priority weights> 534 535This makes DAMON to try to use only up to ``<ms>`` milliseconds for applying 536the action to memory regions of the ``target access pattern`` within the 537``<reset interval>`` milliseconds, and to apply the action to only up to 538``<sz>`` bytes of memory regions within the ``<reset interval>``. Setting both 539``<ms>`` and ``<sz>`` zero disables the quota limits. 540 541When the quota limit is expected to be exceeded, DAMON prioritizes found memory 542regions of the ``target access pattern`` based on their size, access frequency, 543and age. For personalized prioritization, users can set the weights for the 544three properties in ``<priority weights>`` in below form:: 545 546 <size weight> <access frequency weight> <age weight> 547 548Watermarks 549~~~~~~~~~~ 550 551Some schemes would need to run based on current value of the system's specific 552metrics like free memory ratio. For such cases, users can specify watermarks 553for the condition.:: 554 555 <metric> <check interval> <high mark> <middle mark> <low mark> 556 557``<metric>`` is a predefined integer for the metric to be checked. The 558supported numbers and their meanings are as below. 559 560 - 0: Ignore the watermarks 561 - 1: System's free memory rate (per thousand) 562 563The value of the metric is checked every ``<check interval>`` microseconds. 564 565If the value is higher than ``<high mark>`` or lower than ``<low mark>``, the 566scheme is deactivated. If the value is lower than ``<mid mark>``, the scheme 567is activated. 568 569.. _damos_stats: 570 571Statistics 572~~~~~~~~~~ 573 574It also counts the total number and bytes of regions that each scheme is tried 575to be applied, the two numbers for the regions that each scheme is successfully 576applied, and the total number of the quota limit exceeds. This statistics can 577be used for online analysis or tuning of the schemes. 578 579The statistics can be shown by reading the ``schemes`` file. Reading the file 580will show each scheme you entered in each line, and the five numbers for the 581statistics will be added at the end of each line. 582 583Example 584~~~~~~~ 585 586Below commands applies a scheme saying "If a memory region of size in [4KiB, 5878KiB] is showing accesses per aggregate interval in [0, 5] for aggregate 588interval in [10, 20], page out the region. For the paging out, use only up to 58910ms per second, and also don't page out more than 1GiB per second. Under the 590limitation, page out memory regions having longer age first. Also, check the 591free memory rate of the system every 5 seconds, start the monitoring and paging 592out when the free memory rate becomes lower than 50%, but stop it if the free 593memory rate becomes larger than 60%, or lower than 30%".:: 594 595 # cd <debugfs>/damon 596 # scheme="4096 8192 0 5 10 20 2" # target access pattern and action 597 # scheme+=" 10 $((1024*1024*1024)) 1000" # quotas 598 # scheme+=" 0 0 100" # prioritization weights 599 # scheme+=" 1 5000000 600 500 300" # watermarks 600 # echo "$scheme" > schemes 601 602 603Turning On/Off 604-------------- 605 606Setting the files as described above doesn't incur effect unless you explicitly 607start the monitoring. You can start, stop, and check the current status of the 608monitoring by writing to and reading from the ``monitor_on`` file. Writing 609``on`` to the file starts the monitoring of the targets with the attributes. 610Writing ``off`` to the file stops those. DAMON also stops if every target 611process is terminated. Below example commands turn on, off, and check the 612status of DAMON:: 613 614 # cd <debugfs>/damon 615 # echo on > monitor_on 616 # echo off > monitor_on 617 # cat monitor_on 618 off 619 620Please note that you cannot write to the above-mentioned debugfs files while 621the monitoring is turned on. If you write to the files while DAMON is running, 622an error code such as ``-EBUSY`` will be returned. 623 624 625Monitoring Thread PID 626--------------------- 627 628DAMON does requested monitoring with a kernel thread called ``kdamond``. You 629can get the pid of the thread by reading the ``kdamond_pid`` file. When the 630monitoring is turned off, reading the file returns ``none``. :: 631 632 # cd <debugfs>/damon 633 # cat monitor_on 634 off 635 # cat kdamond_pid 636 none 637 # echo on > monitor_on 638 # cat kdamond_pid 639 18594 640 641 642Using Multiple Monitoring Threads 643--------------------------------- 644 645One ``kdamond`` thread is created for each monitoring context. You can create 646and remove monitoring contexts for multiple ``kdamond`` required use case using 647the ``mk_contexts`` and ``rm_contexts`` files. 648 649Writing the name of the new context to the ``mk_contexts`` file creates a 650directory of the name on the DAMON debugfs directory. The directory will have 651DAMON debugfs files for the context. :: 652 653 # cd <debugfs>/damon 654 # ls foo 655 # ls: cannot access 'foo': No such file or directory 656 # echo foo > mk_contexts 657 # ls foo 658 # attrs init_regions kdamond_pid schemes target_ids 659 660If the context is not needed anymore, you can remove it and the corresponding 661directory by putting the name of the context to the ``rm_contexts`` file. :: 662 663 # echo foo > rm_contexts 664 # ls foo 665 # ls: cannot access 'foo': No such file or directory 666 667Note that ``mk_contexts``, ``rm_contexts``, and ``monitor_on`` files are in the 668root directory only. 669 670 671.. _tracepoint: 672 673Tracepoint for Monitoring Results 674================================= 675 676DAMON provides the monitoring results via a tracepoint, 677``damon:damon_aggregated``. While the monitoring is turned on, you could 678record the tracepoint events and show results using tracepoint supporting tools 679like ``perf``. For example:: 680 681 # echo on > monitor_on 682 # perf record -e damon:damon_aggregated & 683 # sleep 5 684 # kill 9 $(pidof perf) 685 # echo off > monitor_on 686 # perf script 687