2021-09-07 19:57:05 -07:00
|
|
|
.. SPDX-License-Identifier: GPL-2.0
|
|
|
|
|
|
|
|
===============
|
|
|
|
Getting Started
|
|
|
|
===============
|
|
|
|
|
|
|
|
This document briefly describes how you can use DAMON by demonstrating its
|
|
|
|
default user space tool. Please note that this document describes only a part
|
2021-11-05 13:48:13 -07:00
|
|
|
of its features for brevity. Please refer to the usage `doc
|
2024-08-25 18:57:39 -07:00
|
|
|
<https://github.com/damonitor/damo/blob/next/USAGE.md>`_ of the tool for more
|
2021-11-05 13:48:13 -07:00
|
|
|
details.
|
2021-09-07 19:57:05 -07:00
|
|
|
|
|
|
|
|
|
|
|
Prerequisites
|
|
|
|
=============
|
|
|
|
|
|
|
|
Kernel
|
|
|
|
------
|
|
|
|
|
|
|
|
You should first ensure your system is running on a kernel built with
|
|
|
|
``CONFIG_DAMON_*=y``.
|
|
|
|
|
|
|
|
|
|
|
|
User Space Tool
|
|
|
|
---------------
|
|
|
|
|
|
|
|
For the demonstration, we will use the default user space tool for DAMON,
|
|
|
|
called DAMON Operator (DAMO). It is available at
|
2024-08-25 18:57:39 -07:00
|
|
|
https://github.com/damonitor/damo. The examples below assume that ``damo`` is on
|
2021-09-07 19:57:05 -07:00
|
|
|
your ``$PATH``. It's not mandatory, though.
|
|
|
|
|
2022-09-09 20:29:00 +00:00
|
|
|
Because DAMO is using the sysfs interface (refer to :doc:`usage` for the
|
|
|
|
detail) of DAMON, you should ensure :doc:`sysfs </filesystems/sysfs>` is
|
|
|
|
mounted.
|
2021-09-07 19:57:05 -07:00
|
|
|
|
|
|
|
|
2024-07-01 12:27:00 -07:00
|
|
|
Snapshot Data Access Patterns
|
|
|
|
=============================
|
|
|
|
|
|
|
|
The commands below show the memory access pattern of a program at the moment of
|
|
|
|
the execution. ::
|
|
|
|
|
|
|
|
$ git clone https://github.com/sjp38/masim; cd masim; make
|
|
|
|
$ sudo damo start "./masim ./configs/stairs.cfg --quiet"
|
2025-01-10 10:52:31 -08:00
|
|
|
$ sudo damo report access
|
|
|
|
heatmap: 641111111000000000000000000000000000000000000000000000[...]33333333333333335557984444[...]7
|
|
|
|
# min/max temperatures: -1,840,000,000, 370,010,000, column size: 3.925 MiB
|
|
|
|
0 addr 86.182 TiB size 8.000 KiB access 0 % age 14.900 s
|
|
|
|
1 addr 86.182 TiB size 8.000 KiB access 60 % age 0 ns
|
|
|
|
2 addr 86.182 TiB size 3.422 MiB access 0 % age 4.100 s
|
|
|
|
3 addr 86.182 TiB size 2.004 MiB access 95 % age 2.200 s
|
|
|
|
4 addr 86.182 TiB size 29.688 MiB access 0 % age 14.100 s
|
|
|
|
5 addr 86.182 TiB size 29.516 MiB access 0 % age 16.700 s
|
|
|
|
6 addr 86.182 TiB size 29.633 MiB access 0 % age 17.900 s
|
|
|
|
7 addr 86.182 TiB size 117.652 MiB access 0 % age 18.400 s
|
|
|
|
8 addr 126.990 TiB size 62.332 MiB access 0 % age 9.500 s
|
|
|
|
9 addr 126.990 TiB size 13.980 MiB access 0 % age 5.200 s
|
|
|
|
10 addr 126.990 TiB size 9.539 MiB access 100 % age 3.700 s
|
|
|
|
11 addr 126.990 TiB size 16.098 MiB access 0 % age 6.400 s
|
|
|
|
12 addr 127.987 TiB size 132.000 KiB access 0 % age 2.900 s
|
|
|
|
total size: 314.008 MiB
|
|
|
|
$ sudo damo stop
|
2024-07-01 12:27:00 -07:00
|
|
|
|
|
|
|
The first command of the above example downloads and builds an artificial
|
|
|
|
memory access generator program called ``masim``. The second command asks DAMO
|
2025-01-10 10:52:31 -08:00
|
|
|
to start the program via the given command and make DAMON monitors the newly
|
|
|
|
started process. The third command retrieves the current snapshot of the
|
|
|
|
monitored access pattern of the process from DAMON and shows the pattern in a
|
|
|
|
human readable format.
|
|
|
|
|
|
|
|
The first line of the output shows the relative access temperature (hotness) of
|
|
|
|
the regions in a single row hetmap format. Each column on the heatmap
|
|
|
|
represents regions of same size on the monitored virtual address space. The
|
|
|
|
position of the colun on the row and the number on the column represents the
|
|
|
|
relative location and access temperature of the region. ``[...]`` means
|
|
|
|
unmapped huge regions on the virtual address spaces. The second line shows
|
|
|
|
additional information for better understanding the heatmap.
|
|
|
|
|
|
|
|
Each line of the output from the third line shows which virtual address range
|
|
|
|
(``addr XX size XX``) of the process is how frequently (``access XX %``)
|
|
|
|
accessed for how long time (``age XX``). For example, the evelenth region of
|
|
|
|
~9.5 MiB size is being most frequently accessed for last 3.7 seconds. Finally,
|
|
|
|
the fourth command stops DAMON.
|
2024-07-01 12:27:00 -07:00
|
|
|
|
|
|
|
Note that DAMON can monitor not only virtual address spaces but multiple types
|
|
|
|
of address spaces including the physical address space.
|
|
|
|
|
|
|
|
|
2021-09-07 19:57:05 -07:00
|
|
|
Recording Data Access Patterns
|
|
|
|
==============================
|
|
|
|
|
|
|
|
The commands below record the memory access patterns of a program and save the
|
|
|
|
monitoring results to a file. ::
|
|
|
|
|
2024-07-01 12:27:00 -07:00
|
|
|
$ ./masim ./configs/zigzag.cfg &
|
2021-09-07 19:57:05 -07:00
|
|
|
$ sudo damo record -o damon.data $(pidof masim)
|
|
|
|
|
2024-07-01 12:27:00 -07:00
|
|
|
The line of the commands run the artificial memory access
|
|
|
|
generator program again. The generator will repeatedly
|
2021-09-07 19:57:05 -07:00
|
|
|
access two 100 MiB sized memory regions one by one. You can substitute this
|
|
|
|
with your real workload. The last line asks ``damo`` to record the access
|
|
|
|
pattern in the ``damon.data`` file.
|
|
|
|
|
|
|
|
|
|
|
|
Visualizing Recorded Patterns
|
|
|
|
=============================
|
|
|
|
|
2021-11-05 13:48:16 -07:00
|
|
|
You can visualize the pattern in a heatmap, showing which memory region
|
|
|
|
(x-axis) got accessed when (y-axis) and how frequently (number).::
|
|
|
|
|
2025-01-10 10:52:31 -08:00
|
|
|
$ sudo damo report heatmap
|
2021-11-05 13:48:16 -07:00
|
|
|
22222222222222222222222222222222222222211111111111111111111111111111111111111100
|
|
|
|
44444444444444444444444444444444444444434444444444444444444444444444444444443200
|
|
|
|
44444444444444444444444444444444444444433444444444444444444444444444444444444200
|
|
|
|
33333333333333333333333333333333333333344555555555555555555555555555555555555200
|
|
|
|
33333333333333333333333333333333333344444444444444444444444444444444444444444200
|
|
|
|
22222222222222222222222222222222222223355555555555555555555555555555555555555200
|
|
|
|
00000000000000000000000000000000000000288888888888888888888888888888888888888400
|
|
|
|
00000000000000000000000000000000000000288888888888888888888888888888888888888400
|
|
|
|
33333333333333333333333333333333333333355555555555555555555555555555555555555200
|
|
|
|
88888888888888888888888888888888888888600000000000000000000000000000000000000000
|
|
|
|
88888888888888888888888888888888888888600000000000000000000000000000000000000000
|
|
|
|
33333333333333333333333333333333333333444444444444444444444444444444444444443200
|
|
|
|
00000000000000000000000000000000000000288888888888888888888888888888888888888400
|
|
|
|
[...]
|
|
|
|
# access_frequency: 0 1 2 3 4 5 6 7 8 9
|
|
|
|
# x-axis: space (139728247021568-139728453431248: 196.848 MiB)
|
|
|
|
# y-axis: time (15256597248362-15326899978162: 1 m 10.303 s)
|
|
|
|
# resolution: 80x40 (2.461 MiB and 1.758 s for each character)
|
|
|
|
|
|
|
|
You can also visualize the distribution of the working set size, sorted by the
|
|
|
|
size.::
|
|
|
|
|
|
|
|
$ sudo damo report wss --range 0 101 10
|
|
|
|
# <percentile> <wss>
|
|
|
|
# target_id 18446632103789443072
|
|
|
|
# avr: 107.708 MiB
|
|
|
|
0 0 B | |
|
|
|
|
10 95.328 MiB |**************************** |
|
|
|
|
20 95.332 MiB |**************************** |
|
|
|
|
30 95.340 MiB |**************************** |
|
|
|
|
40 95.387 MiB |**************************** |
|
|
|
|
50 95.387 MiB |**************************** |
|
|
|
|
60 95.398 MiB |**************************** |
|
|
|
|
70 95.398 MiB |**************************** |
|
|
|
|
80 95.504 MiB |**************************** |
|
|
|
|
90 190.703 MiB |********************************************************* |
|
|
|
|
100 196.875 MiB |***********************************************************|
|
|
|
|
|
|
|
|
Using ``--sortby`` option with the above command, you can show how the working
|
|
|
|
set size has chronologically changed.::
|
|
|
|
|
|
|
|
$ sudo damo report wss --range 0 101 10 --sortby time
|
|
|
|
# <percentile> <wss>
|
|
|
|
# target_id 18446632103789443072
|
|
|
|
# avr: 107.708 MiB
|
|
|
|
0 3.051 MiB | |
|
|
|
|
10 190.703 MiB |***********************************************************|
|
|
|
|
20 95.336 MiB |***************************** |
|
|
|
|
30 95.328 MiB |***************************** |
|
|
|
|
40 95.387 MiB |***************************** |
|
|
|
|
50 95.332 MiB |***************************** |
|
|
|
|
60 95.320 MiB |***************************** |
|
|
|
|
70 95.398 MiB |***************************** |
|
|
|
|
80 95.398 MiB |***************************** |
|
|
|
|
90 95.340 MiB |***************************** |
|
|
|
|
100 95.398 MiB |***************************** |
|
2021-09-07 19:57:05 -07:00
|
|
|
|
2021-11-05 13:46:39 -07:00
|
|
|
|
|
|
|
Data Access Pattern Aware Memory Management
|
|
|
|
===========================================
|
|
|
|
|
2023-06-16 19:17:37 +00:00
|
|
|
Below command makes every memory region of size >=4K that has not accessed for
|
|
|
|
>=60 seconds in your workload to be swapped out. ::
|
2021-11-05 13:46:39 -07:00
|
|
|
|
2025-01-10 10:52:31 -08:00
|
|
|
$ sudo damo start --damos_access_rate 0 0 --damos_sz_region 4K max \
|
|
|
|
--damos_age 60s max --damos_action pageout \
|
|
|
|
<pid of your workload>
|