| .. SPDX-License-Identifier: GPL-2.0 |
| |
| ============================= |
| DAMON-based LRU-lists Sorting |
| ============================= |
| |
| DAMON-based LRU-lists Sorting (DAMON_LRU_SORT) is a static kernel module that |
| aimed to be used for proactive and lightweight data access pattern based |
| (de)prioritization of pages on their LRU-lists for making LRU-lists a more |
| trusworthy data access pattern source. |
| |
| Where Proactive LRU-lists Sorting is Required? |
| ============================================== |
| |
| As page-granularity access checking overhead could be significant on huge |
| systems, LRU lists are normally not proactively sorted but partially and |
| reactively sorted for special events including specific user requests, system |
| calls and memory pressure. As a result, LRU lists are sometimes not so |
| perfectly prepared to be used as a trustworthy access pattern source for some |
| situations including reclamation target pages selection under sudden memory |
| pressure. |
| |
| Because DAMON can identify access patterns of best-effort accuracy while |
| inducing only user-specified range of overhead, proactively running |
| DAMON_LRU_SORT could be helpful for making LRU lists more trustworthy access |
| pattern source with low and controlled overhead. |
| |
| How It Works? |
| ============= |
| |
| DAMON_LRU_SORT finds hot pages (pages of memory regions that showing access |
| rates that higher than a user-specified threshold) and cold pages (pages of |
| memory regions that showing no access for a time that longer than a |
| user-specified threshold) using DAMON, and prioritizes hot pages while |
| deprioritizing cold pages on their LRU-lists. To avoid it consuming too much |
| CPU for the prioritizations, a CPU time usage limit can be configured. Under |
| the limit, it prioritizes and deprioritizes more hot and cold pages first, |
| respectively. System administrators can also configure under what situation |
| this scheme should automatically activated and deactivated with three memory |
| pressure watermarks. |
| |
| Its default parameters for hotness/coldness thresholds and CPU quota limit are |
| conservatively chosen. That is, the module under its default parameters could |
| be widely used without harm for common situations while providing a level of |
| benefits for systems having clear hot/cold access patterns under memory |
| pressure while consuming only a limited small portion of CPU time. |
| |
| Interface: Module Parameters |
| ============================ |
| |
| To use this feature, you should first ensure your system is running on a kernel |
| that is built with ``CONFIG_DAMON_LRU_SORT=y``. |
| |
| To let sysadmins enable or disable it and tune for the given system, |
| DAMON_LRU_SORT utilizes module parameters. That is, you can put |
| ``damon_lru_sort.<parameter>=<value>`` on the kernel boot command line or write |
| proper values to ``/sys/module/damon_lru_sort/parameters/<parameter>`` files. |
| |
| Below are the description of each parameter. |
| |
| enabled |
| ------- |
| |
| Enable or disable DAMON_LRU_SORT. |
| |
| You can enable DAMON_LRU_SORT by setting the value of this parameter as ``Y``. |
| Setting it as ``N`` disables DAMON_LRU_SORT. Note that DAMON_LRU_SORT could do |
| no real monitoring and LRU-lists sorting due to the watermarks-based activation |
| condition. Refer to below descriptions for the watermarks parameter for this. |
| |
| commit_inputs |
| ------------- |
| |
| Make DAMON_LRU_SORT reads the input parameters again, except ``enabled``. |
| |
| Input parameters that updated while DAMON_LRU_SORT is running are not applied |
| by default. Once this parameter is set as ``Y``, DAMON_LRU_SORT reads values |
| of parametrs except ``enabled`` again. Once the re-reading is done, this |
| parameter is set as ``N``. If invalid parameters are found while the |
| re-reading, DAMON_LRU_SORT will be disabled. |
| |
| hot_thres_access_freq |
| --------------------- |
| |
| Access frequency threshold for hot memory regions identification in permil. |
| |
| If a memory region is accessed in frequency of this or higher, DAMON_LRU_SORT |
| identifies the region as hot, and mark it as accessed on the LRU list, so that |
| it could not be reclaimed under memory pressure. 50% by default. |
| |
| cold_min_age |
| ------------ |
| |
| Time threshold for cold memory regions identification in microseconds. |
| |
| If a memory region is not accessed for this or longer time, DAMON_LRU_SORT |
| identifies the region as cold, and mark it as unaccessed on the LRU list, so |
| that it could be reclaimed first under memory pressure. 120 seconds by |
| default. |
| |
| quota_ms |
| -------- |
| |
| Limit of time for trying the LRU lists sorting in milliseconds. |
| |
| DAMON_LRU_SORT tries to use only up to this time within a time window |
| (quota_reset_interval_ms) for trying LRU lists sorting. This can be used |
| for limiting CPU consumption of DAMON_LRU_SORT. If the value is zero, the |
| limit is disabled. |
| |
| 10 ms by default. |
| |
| quota_reset_interval_ms |
| ----------------------- |
| |
| The time quota charge reset interval in milliseconds. |
| |
| The charge reset interval for the quota of time (quota_ms). That is, |
| DAMON_LRU_SORT does not try LRU-lists sorting for more than quota_ms |
| milliseconds or quota_sz bytes within quota_reset_interval_ms milliseconds. |
| |
| 1 second by default. |
| |
| wmarks_interval |
| --------------- |
| |
| The watermarks check time interval in microseconds. |
| |
| Minimal time to wait before checking the watermarks, when DAMON_LRU_SORT is |
| enabled but inactive due to its watermarks rule. 5 seconds by default. |
| |
| wmarks_high |
| ----------- |
| |
| Free memory rate (per thousand) for the high watermark. |
| |
| If free memory of the system in bytes per thousand bytes is higher than this, |
| DAMON_LRU_SORT becomes inactive, so it does nothing but periodically checks the |
| watermarks. 200 (20%) by default. |
| |
| wmarks_mid |
| ---------- |
| |
| Free memory rate (per thousand) for the middle watermark. |
| |
| If free memory of the system in bytes per thousand bytes is between this and |
| the low watermark, DAMON_LRU_SORT becomes active, so starts the monitoring and |
| the LRU-lists sorting. 150 (15%) by default. |
| |
| wmarks_low |
| ---------- |
| |
| Free memory rate (per thousand) for the low watermark. |
| |
| If free memory of the system in bytes per thousand bytes is lower than this, |
| DAMON_LRU_SORT becomes inactive, so it does nothing but periodically checks the |
| watermarks. 50 (5%) by default. |
| |
| sample_interval |
| --------------- |
| |
| Sampling interval for the monitoring in microseconds. |
| |
| The sampling interval of DAMON for the cold memory monitoring. Please refer to |
| the DAMON documentation (:doc:`usage`) for more detail. 5ms by default. |
| |
| aggr_interval |
| ------------- |
| |
| Aggregation interval for the monitoring in microseconds. |
| |
| The aggregation interval of DAMON for the cold memory monitoring. Please |
| refer to the DAMON documentation (:doc:`usage`) for more detail. 100ms by |
| default. |
| |
| min_nr_regions |
| -------------- |
| |
| Minimum number of monitoring regions. |
| |
| The minimal number of monitoring regions of DAMON for the cold memory |
| monitoring. This can be used to set lower-bound of the monitoring quality. |
| But, setting this too high could result in increased monitoring overhead. |
| Please refer to the DAMON documentation (:doc:`usage`) for more detail. 10 by |
| default. |
| |
| max_nr_regions |
| -------------- |
| |
| Maximum number of monitoring regions. |
| |
| The maximum number of monitoring regions of DAMON for the cold memory |
| monitoring. This can be used to set upper-bound of the monitoring overhead. |
| However, setting this too low could result in bad monitoring quality. Please |
| refer to the DAMON documentation (:doc:`usage`) for more detail. 1000 by |
| defaults. |
| |
| monitor_region_start |
| -------------------- |
| |
| Start of target memory region in physical address. |
| |
| The start physical address of memory region that DAMON_LRU_SORT will do work |
| against. By default, biggest System RAM is used as the region. |
| |
| monitor_region_end |
| ------------------ |
| |
| End of target memory region in physical address. |
| |
| The end physical address of memory region that DAMON_LRU_SORT will do work |
| against. By default, biggest System RAM is used as the region. |
| |
| kdamond_pid |
| ----------- |
| |
| PID of the DAMON thread. |
| |
| If DAMON_LRU_SORT is enabled, this becomes the PID of the worker thread. Else, |
| -1. |
| |
| nr_lru_sort_tried_hot_regions |
| ----------------------------- |
| |
| Number of hot memory regions that tried to be LRU-sorted. |
| |
| bytes_lru_sort_tried_hot_regions |
| -------------------------------- |
| |
| Total bytes of hot memory regions that tried to be LRU-sorted. |
| |
| nr_lru_sorted_hot_regions |
| ------------------------- |
| |
| Number of hot memory regions that successfully be LRU-sorted. |
| |
| bytes_lru_sorted_hot_regions |
| ---------------------------- |
| |
| Total bytes of hot memory regions that successfully be LRU-sorted. |
| |
| nr_hot_quota_exceeds |
| -------------------- |
| |
| Number of times that the time quota limit for hot regions have exceeded. |
| |
| nr_lru_sort_tried_cold_regions |
| ------------------------------ |
| |
| Number of cold memory regions that tried to be LRU-sorted. |
| |
| bytes_lru_sort_tried_cold_regions |
| --------------------------------- |
| |
| Total bytes of cold memory regions that tried to be LRU-sorted. |
| |
| nr_lru_sorted_cold_regions |
| -------------------------- |
| |
| Number of cold memory regions that successfully be LRU-sorted. |
| |
| bytes_lru_sorted_cold_regions |
| ----------------------------- |
| |
| Total bytes of cold memory regions that successfully be LRU-sorted. |
| |
| nr_cold_quota_exceeds |
| --------------------- |
| |
| Number of times that the time quota limit for cold regions have exceeded. |
| |
| Example |
| ======= |
| |
| Below runtime example commands make DAMON_LRU_SORT to find memory regions |
| having >=50% access frequency and LRU-prioritize while LRU-deprioritizing |
| memory regions that not accessed for 120 seconds. The prioritization and |
| deprioritization is limited to be done using only up to 1% CPU time to avoid |
| DAMON_LRU_SORT consuming too much CPU time for the (de)prioritization. It also |
| asks DAMON_LRU_SORT to do nothing if the system's free memory rate is more than |
| 50%, but start the real works if it becomes lower than 40%. If DAMON_RECLAIM |
| doesn't make progress and therefore the free memory rate becomes lower than |
| 20%, it asks DAMON_LRU_SORT to do nothing again, so that we can fall back to |
| the LRU-list based page granularity reclamation. :: |
| |
| # cd /sys/module/damon_lru_sort/parameters |
| # echo 500 > hot_thres_access_freq |
| # echo 120000000 > cold_min_age |
| # echo 10 > quota_ms |
| # echo 1000 > quota_reset_interval_ms |
| # echo 500 > wmarks_high |
| # echo 400 > wmarks_mid |
| # echo 200 > wmarks_low |
| # echo Y > enabled |