| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- .. 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
- of its features for brevity. Please refer to the usage `doc
- <https://github.com/damonitor/damo/blob/next/USAGE.md>`_ of the tool for more
- details.
- 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
- https://github.com/damonitor/damo. The examples below assume that ``damo`` is on
- your ``$PATH``. It's not mandatory, though.
- 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.
- 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"
- $ sudo ./damo show
- 0 addr [85.541 TiB , 85.541 TiB ) (57.707 MiB ) access 0 % age 10.400 s
- 1 addr [85.541 TiB , 85.542 TiB ) (413.285 MiB) access 0 % age 11.400 s
- 2 addr [127.649 TiB , 127.649 TiB) (57.500 MiB ) access 0 % age 1.600 s
- 3 addr [127.649 TiB , 127.649 TiB) (32.500 MiB ) access 0 % age 500 ms
- 4 addr [127.649 TiB , 127.649 TiB) (9.535 MiB ) access 100 % age 300 ms
- 5 addr [127.649 TiB , 127.649 TiB) (8.000 KiB ) access 60 % age 0 ns
- 6 addr [127.649 TiB , 127.649 TiB) (6.926 MiB ) access 0 % age 1 s
- 7 addr [127.998 TiB , 127.998 TiB) (120.000 KiB) access 0 % age 11.100 s
- 8 addr [127.998 TiB , 127.998 TiB) (8.000 KiB ) access 40 % age 100 ms
- 9 addr [127.998 TiB , 127.998 TiB) (4.000 KiB ) access 0 % age 11 s
- total size: 577.590 MiB
- $ sudo ./damo stop
- The first command of the above example downloads and builds an artificial
- memory access generator program called ``masim``. The second command asks DAMO
- to execute the artificial generator process start via the given command and
- make DAMON monitors the generator 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.
- Each line of the output shows which virtual address range (``addr [XX, XX)``)
- of the process is how frequently (``access XX %``) accessed for how long time
- (``age XX``). For example, the fifth region of ~9 MiB size is being most
- frequently accessed for last 300 milliseconds. Finally, the fourth command
- stops DAMON.
- Note that DAMON can monitor not only virtual address spaces but multiple types
- of address spaces including the physical address space.
- Recording Data Access Patterns
- ==============================
- The commands below record the memory access patterns of a program and save the
- monitoring results to a file. ::
- $ ./masim ./configs/zigzag.cfg &
- $ sudo damo record -o damon.data $(pidof masim)
- The line of the commands run the artificial memory access
- generator program again. The generator will repeatedly
- 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
- =============================
- You can visualize the pattern in a heatmap, showing which memory region
- (x-axis) got accessed when (y-axis) and how frequently (number).::
- $ sudo damo report heats --heatmap stdout
- 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 |***************************** |
- Data Access Pattern Aware Memory Management
- ===========================================
- Below command makes every memory region of size >=4K that has not accessed for
- >=60 seconds in your workload to be swapped out. ::
- $ sudo damo schemes --damos_access_rate 0 0 --damos_sz_region 4K max \
- --damos_age 60s max --damos_action pageout \
- <pid of your workload>
|