mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

Document the new DAMON sysfs file, refresh_ms, on the usage document. Link: https://lkml.kernel.org/r/20250717055448.56976-4-sj@kernel.org Signed-off-by: SeongJae Park <sj@kernel.org> Cc: Jonathan Corbet <corbet@lwn.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
668 lines
30 KiB
ReStructuredText
668 lines
30 KiB
ReStructuredText
.. SPDX-License-Identifier: GPL-2.0
|
||
|
||
===============
|
||
Detailed Usages
|
||
===============
|
||
|
||
DAMON provides below interfaces for different users.
|
||
|
||
- *DAMON user space tool.*
|
||
`This <https://github.com/damonitor/damo>`_ is for privileged people such as
|
||
system administrators who want a just-working human-friendly interface.
|
||
Using this, users can use the DAMON’s major features in a human-friendly way.
|
||
It may not be highly tuned for special cases, though. For more detail,
|
||
please refer to its `usage document
|
||
<https://github.com/damonitor/damo/blob/next/USAGE.md>`_.
|
||
- *sysfs interface.*
|
||
:ref:`This <sysfs_interface>` is for privileged user space programmers who
|
||
want more optimized use of DAMON. Using this, users can use DAMON’s major
|
||
features by reading from and writing to special sysfs files. Therefore,
|
||
you can write and use your personalized DAMON sysfs wrapper programs that
|
||
reads/writes the sysfs files instead of you. The `DAMON user space tool
|
||
<https://github.com/damonitor/damo>`_ is one example of such programs.
|
||
- *Kernel Space Programming Interface.*
|
||
:doc:`This </mm/damon/api>` is for kernel space programmers. Using this,
|
||
users can utilize every feature of DAMON most flexibly and efficiently by
|
||
writing kernel space DAMON application programs for you. You can even extend
|
||
DAMON for various address spaces. For detail, please refer to the interface
|
||
:doc:`document </mm/damon/api>`.
|
||
|
||
.. _sysfs_interface:
|
||
|
||
sysfs Interface
|
||
===============
|
||
|
||
DAMON sysfs interface is built when ``CONFIG_DAMON_SYSFS`` is defined. It
|
||
creates multiple directories and files under its sysfs directory,
|
||
``<sysfs>/kernel/mm/damon/``. You can control DAMON by writing to and reading
|
||
from the files under the directory.
|
||
|
||
For a short example, users can monitor the virtual address space of a given
|
||
workload as below. ::
|
||
|
||
# cd /sys/kernel/mm/damon/admin/
|
||
# echo 1 > kdamonds/nr_kdamonds && echo 1 > kdamonds/0/contexts/nr_contexts
|
||
# echo vaddr > kdamonds/0/contexts/0/operations
|
||
# echo 1 > kdamonds/0/contexts/0/targets/nr_targets
|
||
# echo $(pidof <workload>) > kdamonds/0/contexts/0/targets/0/pid_target
|
||
# echo on > kdamonds/0/state
|
||
|
||
Files Hierarchy
|
||
---------------
|
||
|
||
The files hierarchy of DAMON sysfs interface is shown below. In the below
|
||
figure, parents-children relations are represented with indentations, each
|
||
directory is having ``/`` suffix, and files in each directory are separated by
|
||
comma (",").
|
||
|
||
.. parsed-literal::
|
||
|
||
:ref:`/sys/kernel/mm/damon <sysfs_root>`/admin
|
||
│ :ref:`kdamonds <sysfs_kdamonds>`/nr_kdamonds
|
||
│ │ :ref:`0 <sysfs_kdamond>`/state,pid,refresh_ms
|
||
│ │ │ :ref:`contexts <sysfs_contexts>`/nr_contexts
|
||
│ │ │ │ :ref:`0 <sysfs_context>`/avail_operations,operations
|
||
│ │ │ │ │ :ref:`monitoring_attrs <sysfs_monitoring_attrs>`/
|
||
│ │ │ │ │ │ intervals/sample_us,aggr_us,update_us
|
||
│ │ │ │ │ │ │ intervals_goal/access_bp,aggrs,min_sample_us,max_sample_us
|
||
│ │ │ │ │ │ nr_regions/min,max
|
||
│ │ │ │ │ :ref:`targets <sysfs_targets>`/nr_targets
|
||
│ │ │ │ │ │ :ref:`0 <sysfs_target>`/pid_target
|
||
│ │ │ │ │ │ │ :ref:`regions <sysfs_regions>`/nr_regions
|
||
│ │ │ │ │ │ │ │ :ref:`0 <sysfs_region>`/start,end
|
||
│ │ │ │ │ │ │ │ ...
|
||
│ │ │ │ │ │ ...
|
||
│ │ │ │ │ :ref:`schemes <sysfs_schemes>`/nr_schemes
|
||
│ │ │ │ │ │ :ref:`0 <sysfs_scheme>`/action,target_nid,apply_interval_us
|
||
│ │ │ │ │ │ │ :ref:`access_pattern <sysfs_access_pattern>`/
|
||
│ │ │ │ │ │ │ │ sz/min,max
|
||
│ │ │ │ │ │ │ │ nr_accesses/min,max
|
||
│ │ │ │ │ │ │ │ age/min,max
|
||
│ │ │ │ │ │ │ :ref:`quotas <sysfs_quotas>`/ms,bytes,reset_interval_ms,effective_bytes
|
||
│ │ │ │ │ │ │ │ weights/sz_permil,nr_accesses_permil,age_permil
|
||
│ │ │ │ │ │ │ │ :ref:`goals <sysfs_schemes_quota_goals>`/nr_goals
|
||
│ │ │ │ │ │ │ │ │ 0/target_metric,target_value,current_value,nid
|
||
│ │ │ │ │ │ │ :ref:`watermarks <sysfs_watermarks>`/metric,interval_us,high,mid,low
|
||
│ │ │ │ │ │ │ :ref:`{core_,ops_,}filters <sysfs_filters>`/nr_filters
|
||
│ │ │ │ │ │ │ │ 0/type,matching,allow,memcg_path,addr_start,addr_end,target_idx,min,max
|
||
│ │ │ │ │ │ │ :ref:`dests <damon_sysfs_dests>`/nr_dests
|
||
│ │ │ │ │ │ │ │ 0/id,weight
|
||
│ │ │ │ │ │ │ :ref:`stats <sysfs_schemes_stats>`/nr_tried,sz_tried,nr_applied,sz_applied,sz_ops_filter_passed,qt_exceeds
|
||
│ │ │ │ │ │ │ :ref:`tried_regions <sysfs_schemes_tried_regions>`/total_bytes
|
||
│ │ │ │ │ │ │ │ 0/start,end,nr_accesses,age,sz_filter_passed
|
||
│ │ │ │ │ │ │ │ ...
|
||
│ │ │ │ │ │ ...
|
||
│ │ │ │ ...
|
||
│ │ ...
|
||
|
||
.. _sysfs_root:
|
||
|
||
Root
|
||
----
|
||
|
||
The root of the DAMON sysfs interface is ``<sysfs>/kernel/mm/damon/``, and it
|
||
has one directory named ``admin``. The directory contains the files for
|
||
privileged user space programs' control of DAMON. User space tools or daemons
|
||
having the root permission could use this directory.
|
||
|
||
.. _sysfs_kdamonds:
|
||
|
||
kdamonds/
|
||
---------
|
||
|
||
Under the ``admin`` directory, one directory, ``kdamonds``, which has files for
|
||
controlling the kdamonds (refer to
|
||
:ref:`design <damon_design_execution_model_and_data_structures>` for more
|
||
details) exists. In the beginning, this directory has only one file,
|
||
``nr_kdamonds``. Writing a number (``N``) to the file creates the number of
|
||
child directories named ``0`` to ``N-1``. Each directory represents each
|
||
kdamond.
|
||
|
||
.. _sysfs_kdamond:
|
||
|
||
kdamonds/<N>/
|
||
-------------
|
||
|
||
In each kdamond directory, three files (``state``, ``pid`` and ``refresh_ms``)
|
||
and one directory (``contexts``) exist.
|
||
|
||
Reading ``state`` returns ``on`` if the kdamond is currently running, or
|
||
``off`` if it is not running.
|
||
|
||
Users can write below commands for the kdamond to the ``state`` file.
|
||
|
||
- ``on``: Start running.
|
||
- ``off``: Stop running.
|
||
- ``commit``: Read the user inputs in the sysfs files except ``state`` file
|
||
again.
|
||
- ``update_tuned_intervals``: Update the contents of ``sample_us`` and
|
||
``aggr_us`` files of the kdamond with the auto-tuning applied ``sampling
|
||
interval`` and ``aggregation interval`` for the files. Please refer to
|
||
:ref:`intervals_goal section <damon_usage_sysfs_monitoring_intervals_goal>`
|
||
for more details.
|
||
- ``commit_schemes_quota_goals``: Read the DAMON-based operation schemes'
|
||
:ref:`quota goals <sysfs_schemes_quota_goals>`.
|
||
- ``update_schemes_stats``: Update the contents of stats files for each
|
||
DAMON-based operation scheme of the kdamond. For details of the stats,
|
||
please refer to :ref:`stats section <sysfs_schemes_stats>`.
|
||
- ``update_schemes_tried_regions``: Update the DAMON-based operation scheme
|
||
action tried regions directory for each DAMON-based operation scheme of the
|
||
kdamond. For details of the DAMON-based operation scheme action tried
|
||
regions directory, please refer to
|
||
:ref:`tried_regions section <sysfs_schemes_tried_regions>`.
|
||
- ``update_schemes_tried_bytes``: Update only ``.../tried_regions/total_bytes``
|
||
files.
|
||
- ``clear_schemes_tried_regions``: Clear the DAMON-based operating scheme
|
||
action tried regions directory for each DAMON-based operation scheme of the
|
||
kdamond.
|
||
- ``update_schemes_effective_quotas``: Update the contents of
|
||
``effective_bytes`` files for each DAMON-based operation scheme of the
|
||
kdamond. For more details, refer to :ref:`quotas directory <sysfs_quotas>`.
|
||
|
||
If the state is ``on``, reading ``pid`` shows the pid of the kdamond thread.
|
||
|
||
Users can ask the kernel to periodically update files showing auto-tuned
|
||
parameters and DAMOS stats instead of manually writing
|
||
``update_tuned_intervals`` like keywords to ``state`` file. For this, users
|
||
should write the desired update time interval in milliseconds to ``refresh_ms``
|
||
file. If the interval is zero, the periodic update is disabled. Reading the
|
||
file shows currently set time interval.
|
||
|
||
``contexts`` directory contains files for controlling the monitoring contexts
|
||
that this kdamond will execute.
|
||
|
||
.. _sysfs_contexts:
|
||
|
||
kdamonds/<N>/contexts/
|
||
----------------------
|
||
|
||
In the beginning, this directory has only one file, ``nr_contexts``. Writing a
|
||
number (``N``) to the file creates the number of child directories named as
|
||
``0`` to ``N-1``. Each directory represents each monitoring context (refer to
|
||
:ref:`design <damon_design_execution_model_and_data_structures>` for more
|
||
details). At the moment, only one context per kdamond is supported, so only
|
||
``0`` or ``1`` can be written to the file.
|
||
|
||
.. _sysfs_context:
|
||
|
||
contexts/<N>/
|
||
-------------
|
||
|
||
In each context directory, two files (``avail_operations`` and ``operations``)
|
||
and three directories (``monitoring_attrs``, ``targets``, and ``schemes``)
|
||
exist.
|
||
|
||
DAMON supports multiple types of :ref:`monitoring operations
|
||
<damon_design_configurable_operations_set>`, including those for virtual address
|
||
space and the physical address space. You can get the list of available
|
||
monitoring operations set on the currently running kernel by reading
|
||
``avail_operations`` file. Based on the kernel configuration, the file will
|
||
list different available operation sets. Please refer to the :ref:`design
|
||
<damon_operations_set>` for the list of all available operation sets and their
|
||
brief explanations.
|
||
|
||
You can set and get what type of monitoring operations DAMON will use for the
|
||
context by writing one of the keywords listed in ``avail_operations`` file and
|
||
reading from the ``operations`` file.
|
||
|
||
.. _sysfs_monitoring_attrs:
|
||
|
||
contexts/<N>/monitoring_attrs/
|
||
------------------------------
|
||
|
||
Files for specifying attributes of the monitoring including required quality
|
||
and efficiency of the monitoring are in ``monitoring_attrs`` directory.
|
||
Specifically, two directories, ``intervals`` and ``nr_regions`` exist in this
|
||
directory.
|
||
|
||
Under ``intervals`` directory, three files for DAMON's sampling interval
|
||
(``sample_us``), aggregation interval (``aggr_us``), and update interval
|
||
(``update_us``) exist. You can set and get the values in micro-seconds by
|
||
writing to and reading from the files.
|
||
|
||
Under ``nr_regions`` directory, two files for the lower-bound and upper-bound
|
||
of DAMON's monitoring regions (``min`` and ``max``, respectively), which
|
||
controls the monitoring overhead, exist. You can set and get the values by
|
||
writing to and rading from the files.
|
||
|
||
For more details about the intervals and monitoring regions range, please refer
|
||
to the Design document (:doc:`/mm/damon/design`).
|
||
|
||
.. _damon_usage_sysfs_monitoring_intervals_goal:
|
||
|
||
contexts/<N>/monitoring_attrs/intervals/intervals_goal/
|
||
-------------------------------------------------------
|
||
|
||
Under the ``intervals`` directory, one directory for automated tuning of
|
||
``sample_us`` and ``aggr_us``, namely ``intervals_goal`` directory also exists.
|
||
Under the directory, four files for the auto-tuning control, namely
|
||
``access_bp``, ``aggrs``, ``min_sample_us`` and ``max_sample_us`` exist.
|
||
Please refer to the :ref:`design document of the feature
|
||
<damon_design_monitoring_intervals_autotuning>` for the internal of the tuning
|
||
mechanism. Reading and writing the four files under ``intervals_goal``
|
||
directory shows and updates the tuning parameters that described in the
|
||
:ref:design doc <damon_design_monitoring_intervals_autotuning>` with the same
|
||
names. The tuning starts with the user-set ``sample_us`` and ``aggr_us``. The
|
||
tuning-applied current values of the two intervals can be read from the
|
||
``sample_us`` and ``aggr_us`` files after writing ``update_tuned_intervals`` to
|
||
the ``state`` file.
|
||
|
||
.. _sysfs_targets:
|
||
|
||
contexts/<N>/targets/
|
||
---------------------
|
||
|
||
In the beginning, this directory has only one file, ``nr_targets``. Writing a
|
||
number (``N``) to the file creates the number of child directories named ``0``
|
||
to ``N-1``. Each directory represents each monitoring target.
|
||
|
||
.. _sysfs_target:
|
||
|
||
targets/<N>/
|
||
------------
|
||
|
||
In each target directory, one file (``pid_target``) and one directory
|
||
(``regions``) exist.
|
||
|
||
If you wrote ``vaddr`` to the ``contexts/<N>/operations``, each target should
|
||
be a process. You can specify the process to DAMON by writing the pid of the
|
||
process to the ``pid_target`` file.
|
||
|
||
.. _sysfs_regions:
|
||
|
||
targets/<N>/regions
|
||
-------------------
|
||
|
||
In case of ``fvaddr`` or ``paddr`` monitoring operations sets, users are
|
||
required to set the monitoring target address ranges. In case of ``vaddr``
|
||
operations set, it is not mandatory, but users can optionally set the initial
|
||
monitoring region to specific address ranges. Please refer to the :ref:`design
|
||
<damon_design_vaddr_target_regions_construction>` for more details.
|
||
|
||
For such cases, users can explicitly set the initial monitoring target regions
|
||
as they want, by writing proper values to the files under this directory.
|
||
|
||
In the beginning, this directory has only one file, ``nr_regions``. Writing a
|
||
number (``N``) to the file creates the number of child directories named ``0``
|
||
to ``N-1``. Each directory represents each initial monitoring target region.
|
||
|
||
.. _sysfs_region:
|
||
|
||
regions/<N>/
|
||
------------
|
||
|
||
In each region directory, you will find two files (``start`` and ``end``). You
|
||
can set and get the start and end addresses of the initial monitoring target
|
||
region by writing to and reading from the files, respectively.
|
||
|
||
Each region should not overlap with others. ``end`` of directory ``N`` should
|
||
be equal or smaller than ``start`` of directory ``N+1``.
|
||
|
||
.. _sysfs_schemes:
|
||
|
||
contexts/<N>/schemes/
|
||
---------------------
|
||
|
||
The directory for DAMON-based Operation Schemes (:ref:`DAMOS
|
||
<damon_design_damos>`). Users can get and set the schemes by reading from and
|
||
writing to files under this directory.
|
||
|
||
In the beginning, this directory has only one file, ``nr_schemes``. Writing a
|
||
number (``N``) to the file creates the number of child directories named ``0``
|
||
to ``N-1``. Each directory represents each DAMON-based operation scheme.
|
||
|
||
.. _sysfs_scheme:
|
||
|
||
schemes/<N>/
|
||
------------
|
||
|
||
In each scheme directory, eight directories (``access_pattern``, ``quotas``,
|
||
``watermarks``, ``core_filters``, ``ops_filters``, ``filters``, ``dests``,
|
||
``stats``, and ``tried_regions``) and three files (``action``, ``target_nid``
|
||
and ``apply_interval``) exist.
|
||
|
||
The ``action`` file is for setting and getting the scheme's :ref:`action
|
||
<damon_design_damos_action>`. The keywords that can be written to and read
|
||
from the file and their meaning are same to those of the list on
|
||
:ref:`design doc <damon_design_damos_action>`.
|
||
|
||
The ``target_nid`` file is for setting the migration target node, which is
|
||
only meaningful when the ``action`` is either ``migrate_hot`` or
|
||
``migrate_cold``.
|
||
|
||
The ``apply_interval_us`` file is for setting and getting the scheme's
|
||
:ref:`apply_interval <damon_design_damos>` in microseconds.
|
||
|
||
.. _sysfs_access_pattern:
|
||
|
||
schemes/<N>/access_pattern/
|
||
---------------------------
|
||
|
||
The directory for the target access :ref:`pattern
|
||
<damon_design_damos_access_pattern>` of the given DAMON-based operation scheme.
|
||
|
||
Under the ``access_pattern`` directory, three directories (``sz``,
|
||
``nr_accesses``, and ``age``) each having two files (``min`` and ``max``)
|
||
exist. You can set and get the access pattern for the given scheme by writing
|
||
to and reading from the ``min`` and ``max`` files under ``sz``,
|
||
``nr_accesses``, and ``age`` directories, respectively. Note that the ``min``
|
||
and the ``max`` form a closed interval.
|
||
|
||
.. _sysfs_quotas:
|
||
|
||
schemes/<N>/quotas/
|
||
-------------------
|
||
|
||
The directory for the :ref:`quotas <damon_design_damos_quotas>` of the given
|
||
DAMON-based operation scheme.
|
||
|
||
Under ``quotas`` directory, four files (``ms``, ``bytes``,
|
||
``reset_interval_ms``, ``effective_bytes``) and two directores (``weights`` and
|
||
``goals``) exist.
|
||
|
||
You can set the ``time quota`` in milliseconds, ``size quota`` in bytes, and
|
||
``reset interval`` in milliseconds by writing the values to the three files,
|
||
respectively. Then, DAMON tries to use only up to ``time quota`` milliseconds
|
||
for applying the ``action`` to memory regions of the ``access_pattern``, and to
|
||
apply the action to only up to ``bytes`` bytes of memory regions within the
|
||
``reset_interval_ms``. Setting both ``ms`` and ``bytes`` zero disables the
|
||
quota limits unless at least one :ref:`goal <sysfs_schemes_quota_goals>` is
|
||
set.
|
||
|
||
The time quota is internally transformed to a size quota. Between the
|
||
transformed size quota and user-specified size quota, smaller one is applied.
|
||
Based on the user-specified :ref:`goal <sysfs_schemes_quota_goals>`, the
|
||
effective size quota is further adjusted. Reading ``effective_bytes`` returns
|
||
the current effective size quota. The file is not updated in real time, so
|
||
users should ask DAMON sysfs interface to update the content of the file for
|
||
the stats by writing a special keyword, ``update_schemes_effective_quotas`` to
|
||
the relevant ``kdamonds/<N>/state`` file.
|
||
|
||
Under ``weights`` directory, three files (``sz_permil``,
|
||
``nr_accesses_permil``, and ``age_permil``) exist.
|
||
You can set the :ref:`prioritization weights
|
||
<damon_design_damos_quotas_prioritization>` for size, access frequency, and age
|
||
in per-thousand unit by writing the values to the three files under the
|
||
``weights`` directory.
|
||
|
||
.. _sysfs_schemes_quota_goals:
|
||
|
||
schemes/<N>/quotas/goals/
|
||
-------------------------
|
||
|
||
The directory for the :ref:`automatic quota tuning goals
|
||
<damon_design_damos_quotas_auto_tuning>` of the given DAMON-based operation
|
||
scheme.
|
||
|
||
In the beginning, this directory has only one file, ``nr_goals``. Writing a
|
||
number (``N``) to the file creates the number of child directories named ``0``
|
||
to ``N-1``. Each directory represents each goal and current achievement.
|
||
Among the multiple feedback, the best one is used.
|
||
|
||
Each goal directory contains four files, namely ``target_metric``,
|
||
``target_value``, ``current_value`` and ``nid``. Users can set and get the
|
||
four parameters for the quota auto-tuning goals that specified on the
|
||
:ref:`design doc <damon_design_damos_quotas_auto_tuning>` by writing to and
|
||
reading from each of the files. Note that users should further write
|
||
``commit_schemes_quota_goals`` to the ``state`` file of the :ref:`kdamond
|
||
directory <sysfs_kdamond>` to pass the feedback to DAMON.
|
||
|
||
.. _sysfs_watermarks:
|
||
|
||
schemes/<N>/watermarks/
|
||
-----------------------
|
||
|
||
The directory for the :ref:`watermarks <damon_design_damos_watermarks>` of the
|
||
given DAMON-based operation scheme.
|
||
|
||
Under the watermarks directory, five files (``metric``, ``interval_us``,
|
||
``high``, ``mid``, and ``low``) for setting the metric, the time interval
|
||
between check of the metric, and the three watermarks exist. You can set and
|
||
get the five values by writing to the files, respectively.
|
||
|
||
Keywords and meanings of those that can be written to the ``metric`` file are
|
||
as below.
|
||
|
||
- none: Ignore the watermarks
|
||
- free_mem_rate: System's free memory rate (per thousand)
|
||
|
||
The ``interval`` should written in microseconds unit.
|
||
|
||
.. _sysfs_filters:
|
||
|
||
schemes/<N>/{core\_,ops\_,}filters/
|
||
-----------------------------------
|
||
|
||
Directories for :ref:`filters <damon_design_damos_filters>` of the given
|
||
DAMON-based operation scheme.
|
||
|
||
``core_filters`` and ``ops_filters`` directories are for the filters handled by
|
||
the DAMON core layer and operations set layer, respectively. ``filters``
|
||
directory can be used for installing filters regardless of their handled
|
||
layers. Filters that requested by ``core_filters`` and ``ops_filters`` will be
|
||
installed before those of ``filters``. All three directories have same files.
|
||
|
||
Use of ``filters`` directory can make expecting evaluation orders of given
|
||
filters with the files under directory bit confusing. Users are hence
|
||
recommended to use ``core_filters`` and ``ops_filters`` directories. The
|
||
``filters`` directory could be deprecated in future.
|
||
|
||
In the beginning, the directory has only one file, ``nr_filters``. Writing a
|
||
number (``N``) to the file creates the number of child directories named ``0``
|
||
to ``N-1``. Each directory represents each filter. The filters are evaluated
|
||
in the numeric order.
|
||
|
||
Each filter directory contains nine files, namely ``type``, ``matching``,
|
||
``allow``, ``memcg_path``, ``addr_start``, ``addr_end``, ``min``, ``max``
|
||
and ``target_idx``. To ``type`` file, you can write the type of the filter.
|
||
Refer to :ref:`the design doc <damon_design_damos_filters>` for available type
|
||
names, their meaning and on what layer those are handled.
|
||
|
||
For ``memcg`` type, you can specify the memory cgroup of the interest by
|
||
writing the path of the memory cgroup from the cgroups mount point to
|
||
``memcg_path`` file. For ``addr`` type, you can specify the start and end
|
||
address of the range (open-ended interval) to ``addr_start`` and ``addr_end``
|
||
files, respectively. For ``hugepage_size`` type, you can specify the minimum
|
||
and maximum size of the range (closed interval) to ``min`` and ``max`` files,
|
||
respectively. For ``target`` type, you can specify the index of the target
|
||
between the list of the DAMON context's monitoring targets list to
|
||
``target_idx`` file.
|
||
|
||
You can write ``Y`` or ``N`` to ``matching`` file to specify whether the filter
|
||
is for memory that matches the ``type``. You can write ``Y`` or ``N`` to
|
||
``allow`` file to specify if applying the action to the memory that satisfies
|
||
the ``type`` and ``matching`` should be allowed or not.
|
||
|
||
For example, below restricts a DAMOS action to be applied to only non-anonymous
|
||
pages of all memory cgroups except ``/having_care_already``.::
|
||
|
||
# cd ops_filters/0/
|
||
# echo 2 > nr_filters
|
||
# # disallow anonymous pages
|
||
echo anon > 0/type
|
||
echo Y > 0/matching
|
||
echo N > 0/allow
|
||
# # further filter out all cgroups except one at '/having_care_already'
|
||
echo memcg > 1/type
|
||
echo /having_care_already > 1/memcg_path
|
||
echo Y > 1/matching
|
||
echo N > 1/allow
|
||
|
||
Refer to the :ref:`DAMOS filters design documentation
|
||
<damon_design_damos_filters>` for more details including how multiple filters
|
||
of different ``allow`` works, when each of the filters are supported, and
|
||
differences on stats.
|
||
|
||
.. _damon_sysfs_dests:
|
||
|
||
schemes/<N>/dests/
|
||
------------------
|
||
|
||
Directory for specifying the destinations of given DAMON-based operation
|
||
scheme's action. This directory is ignored if the action of the given scheme
|
||
is not supporting multiple destinations. Only ``DAMOS_MIGRATE_{HOT,COLD}``
|
||
actions are supporting multiple destinations.
|
||
|
||
In the beginning, the directory has only one file, ``nr_dests``. Writing a
|
||
number (``N``) to the file creates the number of child directories named ``0``
|
||
to ``N-1``. Each directory represents each action destination.
|
||
|
||
Each destination directory contains two files, namely ``id`` and ``weight``.
|
||
Users can write and read the identifier of the destination to ``id`` file.
|
||
For ``DAMOS_MIGRATE_{HOT,COLD}`` actions, the migrate destination node's node
|
||
id should be written to ``id`` file. Users can write and read the weight of
|
||
the destination among the given destinations to the ``weight`` file. The
|
||
weight can be an arbitrary integer. When DAMOS apply the action to each entity
|
||
of the memory region, it will select the destination of the action based on the
|
||
relative weights of the destinations.
|
||
|
||
.. _sysfs_schemes_stats:
|
||
|
||
schemes/<N>/stats/
|
||
------------------
|
||
|
||
DAMON counts statistics for each scheme. This statistics can be used for
|
||
online analysis or tuning of the schemes. Refer to :ref:`design doc
|
||
<damon_design_damos_stat>` for more details about the stats.
|
||
|
||
The statistics can be retrieved by reading the files under ``stats`` directory
|
||
(``nr_tried``, ``sz_tried``, ``nr_applied``, ``sz_applied``,
|
||
``sz_ops_filter_passed``, and ``qt_exceeds``), respectively. The files are not
|
||
updated in real time, so you should ask DAMON sysfs interface to update the
|
||
content of the files for the stats by writing a special keyword,
|
||
``update_schemes_stats`` to the relevant ``kdamonds/<N>/state`` file.
|
||
|
||
.. _sysfs_schemes_tried_regions:
|
||
|
||
schemes/<N>/tried_regions/
|
||
--------------------------
|
||
|
||
This directory initially has one file, ``total_bytes``.
|
||
|
||
When a special keyword, ``update_schemes_tried_regions``, is written to the
|
||
relevant ``kdamonds/<N>/state`` file, DAMON updates the ``total_bytes`` file so
|
||
that reading it returns the total size of the scheme tried regions, and creates
|
||
directories named integer starting from ``0`` under this directory. Each
|
||
directory contains files exposing detailed information about each of the memory
|
||
region that the corresponding scheme's ``action`` has tried to be applied under
|
||
this directory, during next :ref:`apply interval <damon_design_damos>` of the
|
||
corresponding scheme. The information includes address range, ``nr_accesses``,
|
||
and ``age`` of the region.
|
||
|
||
Writing ``update_schemes_tried_bytes`` to the relevant ``kdamonds/<N>/state``
|
||
file will only update the ``total_bytes`` file, and will not create the
|
||
subdirectories.
|
||
|
||
The directories will be removed when another special keyword,
|
||
``clear_schemes_tried_regions``, is written to the relevant
|
||
``kdamonds/<N>/state`` file.
|
||
|
||
The expected usage of this directory is investigations of schemes' behaviors,
|
||
and query-like efficient data access monitoring results retrievals. For the
|
||
latter use case, in particular, users can set the ``action`` as ``stat`` and
|
||
set the ``access pattern`` as their interested pattern that they want to query.
|
||
|
||
.. _sysfs_schemes_tried_region:
|
||
|
||
tried_regions/<N>/
|
||
------------------
|
||
|
||
In each region directory, you will find five files (``start``, ``end``,
|
||
``nr_accesses``, ``age``, and ``sz_filter_passed``). Reading the files will
|
||
show the properties of the region that corresponding DAMON-based operation
|
||
scheme ``action`` has tried to be applied.
|
||
|
||
Example
|
||
~~~~~~~
|
||
|
||
Below commands applies a scheme saying "If a memory region of size in [4KiB,
|
||
8KiB] is showing accesses per aggregate interval in [0, 5] for aggregate
|
||
interval in [10, 20], page out the region. For the paging out, use only up to
|
||
10ms per second, and also don't page out more than 1GiB per second. Under the
|
||
limitation, page out memory regions having longer age first. Also, check the
|
||
free memory rate of the system every 5 seconds, start the monitoring and paging
|
||
out when the free memory rate becomes lower than 50%, but stop it if the free
|
||
memory rate becomes larger than 60%, or lower than 30%". ::
|
||
|
||
# cd <sysfs>/kernel/mm/damon/admin
|
||
# # populate directories
|
||
# echo 1 > kdamonds/nr_kdamonds; echo 1 > kdamonds/0/contexts/nr_contexts;
|
||
# echo 1 > kdamonds/0/contexts/0/schemes/nr_schemes
|
||
# cd kdamonds/0/contexts/0/schemes/0
|
||
# # set the basic access pattern and the action
|
||
# echo 4096 > access_pattern/sz/min
|
||
# echo 8192 > access_pattern/sz/max
|
||
# echo 0 > access_pattern/nr_accesses/min
|
||
# echo 5 > access_pattern/nr_accesses/max
|
||
# echo 10 > access_pattern/age/min
|
||
# echo 20 > access_pattern/age/max
|
||
# echo pageout > action
|
||
# # set quotas
|
||
# echo 10 > quotas/ms
|
||
# echo $((1024*1024*1024)) > quotas/bytes
|
||
# echo 1000 > quotas/reset_interval_ms
|
||
# # set watermark
|
||
# echo free_mem_rate > watermarks/metric
|
||
# echo 5000000 > watermarks/interval_us
|
||
# echo 600 > watermarks/high
|
||
# echo 500 > watermarks/mid
|
||
# echo 300 > watermarks/low
|
||
|
||
Please note that it's highly recommended to use user space tools like `damo
|
||
<https://github.com/damonitor/damo>`_ rather than manually reading and writing
|
||
the files as above. Above is only for an example.
|
||
|
||
.. _tracepoint:
|
||
|
||
Tracepoints for Monitoring Results
|
||
==================================
|
||
|
||
Users can get the monitoring results via the :ref:`tried_regions
|
||
<sysfs_schemes_tried_regions>`. The interface is useful for getting a
|
||
snapshot, but it could be inefficient for fully recording all the monitoring
|
||
results. For the purpose, two trace points, namely ``damon:damon_aggregated``
|
||
and ``damon:damos_before_apply``, are provided. ``damon:damon_aggregated``
|
||
provides the whole monitoring results, while ``damon:damos_before_apply``
|
||
provides the monitoring results for regions that each DAMON-based Operation
|
||
Scheme (:ref:`DAMOS <damon_design_damos>`) is gonna be applied. Hence,
|
||
``damon:damos_before_apply`` is more useful for recording internal behavior of
|
||
DAMOS, or DAMOS target access
|
||
:ref:`pattern <damon_design_damos_access_pattern>` based query-like efficient
|
||
monitoring results recording.
|
||
|
||
While the monitoring is turned on, you could record the tracepoint events and
|
||
show results using tracepoint supporting tools like ``perf``. For example::
|
||
|
||
# echo on > kdamonds/0/state
|
||
# perf record -e damon:damon_aggregated &
|
||
# sleep 5
|
||
# kill 9 $(pidof perf)
|
||
# echo off > kdamonds/0/state
|
||
# perf script
|
||
kdamond.0 46568 [027] 79357.842179: damon:damon_aggregated: target_id=0 nr_regions=11 122509119488-135708762112: 0 864
|
||
[...]
|
||
|
||
Each line of the perf script output represents each monitoring region. The
|
||
first five fields are as usual other tracepoint outputs. The sixth field
|
||
(``target_id=X``) shows the ide of the monitoring target of the region. The
|
||
seventh field (``nr_regions=X``) shows the total number of monitoring regions
|
||
for the target. The eighth field (``X-Y:``) shows the start (``X``) and end
|
||
(``Y``) addresses of the region in bytes. The ninth field (``X``) shows the
|
||
``nr_accesses`` of the region (refer to
|
||
:ref:`design <damon_design_region_based_sampling>` for more details of the
|
||
counter). Finally the tenth field (``X``) shows the ``age`` of the region
|
||
(refer to :ref:`design <damon_design_age_tracking>` for more details of the
|
||
counter).
|
||
|
||
If the event was ``damon:damos_beofre_apply``, the ``perf script`` output would
|
||
be somewhat like below::
|
||
|
||
kdamond.0 47293 [000] 80801.060214: damon:damos_before_apply: ctx_idx=0 scheme_idx=0 target_idx=0 nr_regions=11 121932607488-135128711168: 0 136
|
||
[...]
|
||
|
||
Each line of the output represents each monitoring region that each DAMON-based
|
||
Operation Scheme was about to be applied at the traced time. The first five
|
||
fields are as usual. It shows the index of the DAMON context (``ctx_idx=X``)
|
||
of the scheme in the list of the contexts of the context's kdamond, the index
|
||
of the scheme (``scheme_idx=X``) in the list of the schemes of the context, in
|
||
addition to the output of ``damon_aggregated`` tracepoint.
|