设计¶
执行模型和数据结构¶
包括监控请求规范和基于 DAMON 的操作方案在内的监控相关信息存储在一个名为 DAMON context
的数据结构中。DAMON 通过一个名为 kdamond
的内核线程执行每个上下文。多个 kdamond 可以并行运行,用于不同类型的监控。
要了解用户空间如何进行配置并启动/停止 DAMON,请参阅DAMON sysfs 接口文档。
整体架构¶
DAMON 子系统通过三个层次进行配置,包括:
操作集层¶
为了数据访问监控和额外的低级工作,DAMON 需要一组针对特定操作的实现,这些实现依赖于给定的目标地址空间并为其优化。例如,下面两个用于访问监控的操作是地址空间相关的。
识别地址空间的监控目标地址范围。
检查目标空间中特定地址范围的访问。
DAMON 将这些实现整合到一个名为 DAMON 操作集的层中,并定义了它与上层之间的接口。上层专门用于 DAMON 的核心逻辑,包括监控精度和开销控制机制。
因此,通过配置核心逻辑以使用适当的操作集,DAMON 可以轻松地扩展到任何地址空间和/或可用的硬件功能。如果没有可用于给定目的的操作集,可以遵循层间接口实现新的操作集。
例如,物理内存、虚拟内存、交换空间、特定进程的内存、NUMA 节点、文件和后端内存设备都将得到支持。此外,如果某些架构或设备支持特殊的优化访问检查功能,这些功能将易于配置。
DAMON 目前提供以下三个操作集。以下两个小节描述了它们的工作方式。
vaddr:监控特定进程的虚拟地址空间
fvaddr:监控固定虚拟地址范围
paddr:监控系统的物理地址空间
要了解用户空间如何通过DAMON sysfs 接口进行配置,请参阅文档中operations文件部分。
基于 VMA 的目标地址范围构建¶
vaddr
DAMON 操作集的一种机制,可自动初始化和更新监控目标地址区域,以覆盖目标进程的整个内存映射。
此机制仅适用于 vaddr
操作集。对于 fvaddr
和 paddr
操作集,用户需要手动设置监控目标地址范围。
进程的超大虚拟地址空间中只有小部分映射到物理内存并被访问。因此,跟踪未映射的地址区域是浪费的。然而,由于 DAMON 可以使用自适应区域调整机制处理一定程度的噪声,所以并不严格要求跟踪每个映射,甚至在某些情况下可能带来高开销。也就是说,监控目标内过大的未映射区域应该被移除,以免占用自适应机制的时间。
因此,此实现将复杂的映射转换为三个不同的区域,覆盖地址空间中每个映射区域。这三个区域之间的两个间隙是给定地址空间中最大的两个未映射区域。这两个最大的未映射区域在大多数情况下将是堆和最上层 mmap()ed 区域之间的间隙,以及最下层 mmap()ed 区域和栈之间的间隙。由于这些间隙在通常的地址空间中异常巨大,排除这些就足以实现合理的权衡。下面将详细展示这一点
<heap>
<BIG UNMAPPED REGION 1>
<uppermost mmap()-ed region>
(small mmap()-ed regions and munmap()-ed regions)
<lowermost mmap()-ed region>
<BIG UNMAPPED REGION 2>
<stack>
基于 PTE Accessed 位点的访问检查¶
物理和虚拟地址空间的两种实现都使用 PTE Accessed 位点进行基本访问检查。唯一的区别是根据地址找到相关 PTE Accessed 位点的方式。虚拟地址的实现会遍历目标任务的页表以查找地址,而物理地址的实现会遍历所有映射到该地址的页表。通过这种方式,实现会找到并清除下一个采样目标地址的位点,并检查在采样周期结束后该位点是否再次设置。这可能会干扰使用 Accessed 位点的其他内核子系统,即空闲页跟踪和回收逻辑。DAMON 不采取任何措施来避免干扰空闲页跟踪,因此处理这种干扰是系统管理员的责任。然而,它通过使用 PG_idle
和 PG_young
页标志解决了与回收逻辑的冲突,就像空闲页跟踪所做的那样。
核心逻辑¶
监控¶
以下四节描述了每个 DAMON 核心机制以及五个监控属性:采样间隔
、聚合间隔
、更新间隔
、最小区域数
和最大区域数
。
要了解用户空间如何通过DAMON sysfs 接口设置属性,请参阅文档的monitoring_attrs部分。
访问频率监控¶
DAMON 的输出显示在给定持续时间内,哪些页面被访问的频率是多少。访问频率的分辨率通过设置 sampling interval
和 aggregation interval
来控制。具体来说,DAMON 会在每个 sampling interval
检查每个页面的访问情况并聚合结果。换句话说,它统计每个页面的访问次数。在每个 aggregation interval
过去后,DAMON 会调用用户之前注册的回调函数,以便用户可以读取聚合结果,然后清除结果。这可以用下面的简单伪代码来描述
while monitoring_on:
for page in monitoring_target:
if accessed(page):
nr_accesses[page] += 1
if time() % aggregation_interval == 0:
for callback in user_registered_callbacks:
callback(monitoring_target, nr_accesses)
for page in monitoring_target:
nr_accesses[page] = 0
sleep(sampling interval)
随着目标工作负载大小的增长,这种机制的监控开销将任意增加。
基于区域的采样¶
为了避免开销的无限制增长,DAMON 将假定具有相同访问频率的相邻页面分组到一个区域中。只要假设(区域中的页面具有相同的访问频率)保持不变,区域中只需检查一个页面。因此,对于每个 sampling interval
,DAMON 会随机选择每个区域中的一个页面,等待一个 sampling interval
,检查该页面在此期间是否被访问,如果被访问,则增加该区域的访问频率计数器。该计数器被称为该区域的 nr_accesses
。因此,监控开销可以通过设置区域数量来控制。DAMON 允许用户为权衡设置最小和最大区域数量。
然而,如果假设不能保证,该方案就无法保持输出的质量。
自适应区域调整¶
即使最初的监控目标区域在某种程度上构建得很好,能够满足假设(同一区域中的页面具有相似的访问频率),数据访问模式也可能动态变化。这将导致监控质量下降。为了尽可能保持假设,DAMON 根据每个区域的访问频率自适应地合并和分割区域。
对于每个 aggregation interval
,它会比较相邻区域的访问频率 (nr_accesses
)。如果差异很小,并且两个区域的大小总和小于总区域大小除以 minimum number of regions
的值,DAMON 会合并这两个区域。如果合并后总区域的数量仍然高于 maximum number of regions
,它会重复合并,并增加访问频率差异阈值,直到达到区域数量上限,或者阈值变得高于可能的最大值(aggregation interval
除以 sampling interval
)。然后,在报告并清除每个区域的聚合访问频率后,如果分割后总区域的数量不会超过用户指定的区域最大数量,它会将每个区域分割成两个或三个区域。
通过这种方式,DAMON 在保持用户为其权衡设置的界限的同时,提供了其最佳的质量和最小的开销。
年龄追踪¶
通过分析监控结果,用户还可以发现一个区域当前的访问模式已保持了多长时间。这对于更好地理解访问模式很有用。例如,可以利用访问频率和最近性来实现页面放置算法。为了简化这种访问模式持续时间分析,DAMON 在每个区域中维护另一个名为 age
的计数器。对于每个 aggregation interval
,DAMON 检查区域的大小和访问频率 (nr_accesses
) 是否发生了显著变化。如果发生了变化,计数器将重置为零。否则,计数器将增加。
动态目标空间更新处理¶
监控目标地址范围可能会动态改变。例如,虚拟内存可以动态地映射和取消映射。物理内存可以热插拔。
由于在某些情况下变化可能非常频繁,DAMON 允许监控操作检查动态变化,包括内存映射变化,并仅在用户指定的每个时间间隔(更新间隔
)内将其应用于监控操作相关的数据结构,例如抽象的监控目标内存区域。
用户空间可以通过 DAMON sysfs 接口和/或追踪点获取监控结果。更多详细信息,请分别参阅DAMOS 尝试区域和追踪点监控结果的文档。
监控参数调优指南¶
简而言之,设置 aggregation interval
以捕获用于目的的有意义的访问量。访问量可以使用聚合监控结果快照中的 nr_accesses
和 age
区域进行测量。在许多情况下,间隔的默认值 100ms
被证明太短。将 sampling interval
设置为与 aggregation interval
成比例。默认情况下,建议比例为 1/20
。
聚合间隔
应设置为工作负载在间隔内能产生用于监控目的的访问量的时间间隔。如果间隔太短,只能捕获少量访问。结果是,监控结果看起来所有内容都很少被访问。对于许多目的来说,这将是无用的。然而,如果间隔太长,那么区域与区域调整机制的收敛时间可能会太长,这取决于给定目的的时间尺度。如果工作负载实际上只进行很少的访问,但用户认为用于监控目的的访问量太高,就可能发生这种情况。对于这种情况,应仔细重新考虑每个聚合间隔
内捕获的目标访问量。此外,请注意捕获的访问量不仅通过nr_accesses
表示,还通过age
表示。例如,即使监控结果中的每个区域都显示零nr_accesses
,区域仍然可以使用age
值(作为最近性信息)进行区分。
因此,聚合间隔
的最佳值取决于工作负载的访问强度。用户应根据每个聚合的监控结果快照中捕获的访问量来调整间隔。
请注意,该间隔的默认值为 100 毫秒,这在许多情况下,尤其是在大型系统上,都太短了。
采样间隔
定义了每次聚合的分辨率。如果设置得太大,监控结果将看起来每个区域都被同样地很少访问,或者同样地频繁访问。也就是说,区域变得无法根据访问模式进行区分,因此结果在许多用例中将是无用的。如果采样间隔
太小,它不会降低分辨率,但会增加监控开销。如果它足够恰当以提供足以满足给定目的的监控结果分辨率,就不应不必要地进一步降低。建议将其设置为与聚合间隔
成比例。默认情况下,比例设置为1/20
,并且仍然推荐。
基于手动调优指南,DAMON 提供了更直观的基于旋钮的间隔自动调优机制。详情请参阅该功能的设计文档。
有关基于上述指南的调优示例,请参阅以下文档。
监控间隔自动调优¶
DAMON 根据调优指南思想提供采样间隔
和聚合间隔
的自动调优。该调优机制允许用户在给定时间间隔内,通过 DAMON 设定目标观察的访问事件数量。该目标可以由用户指定为 DAMON 观察到的访问事件与在给定聚合次数(aggrs
)内测量的事件理论最大数量(access_bp
)之比。
DAMON 观察到的访问事件是根据 DAMON 区域假设以字节粒度计算的。例如,如果发现一个大小为 X
字节、Y
次访问的区域,则意味着 DAMON 观察到 X * Y
个访问事件。该区域的理论最大访问事件以相同的方式计算,但将 Y
替换为理论最大 nr_accesses
,其计算公式为 aggregation interval / sampling interval
。
该机制计算 aggrs
次聚合的访问事件比率,如果观察到的访问比率分别低于或高于目标,则以相同的比率增加或减少 采样间隔
和 聚合间隔
。间隔变化的比率取决于当前样本比率与目标比率之间的距离。
用户可以进一步设置调优机制可以设置的最小和最大 采样间隔
,使用两个参数(min_sample_us
和 max_sample_us
)。因为调优机制始终以相同的比率改变 采样间隔
和 聚合间隔
,所以每次调优更改后,最小和最大 聚合间隔
可以自动一起设置。
调优默认是关闭的,需要用户明确设置。根据经验法则和帕累托原则,建议将访问样本比率目标设置为 4%。请注意,帕累托原则(80/20 法则)已应用两次。也就是说,假设 4%(20% 的 20%)的 DAMON 观测访问事件比率(来源)可以捕获 64%(80% 乘以 80%)的实际访问事件(结果)。
要了解用户空间如何通过DAMON sysfs 接口使用此功能,请参阅文档的intervals_goal部分。
操作方案¶
数据访问监控的一个常见目的是访问感知系统效率优化。例如:
将超过两分钟未访问的内存区域分页出
或者
将大于 2 MiB 且在一分钟内显示高访问频率的内存区域使用 THP。
对于此类方案,一种直接的方法是配置文件引导优化。即,使用 DAMON 获取工作负载或系统的数据访问监控结果,通过分析监控结果找到具有特殊特征的内存区域,并对这些区域进行系统操作更改。这些更改可以通过修改或向软件(应用程序和/或内核)提供建议,或重新配置硬件来实现。离线和在线方法均可使用。
其中,在运行时向内核提供建议将是灵活有效的,因此被广泛使用。然而,实现此类方案可能会带来不必要的冗余和低效率。如果感兴趣的类型很常见,则分析可能冗余。在内核和用户空间之间交换信息(包括监控结果和操作建议)可能效率低下。
为了让用户通过卸载工作来减少这种冗余和低效率,DAMON 提供了一个名为“基于数据访问监控的操作方案”(DAMOS)的功能。它允许用户以高层次指定所需的方案。对于此类规范,DAMON 会启动监控,找到具有所需访问模式的区域,并以用户指定的每次时间间隔(称为 apply_interval
)将用户所需的操作动作应用于这些区域。
要了解用户空间如何通过DAMON sysfs 接口设置apply_interval
,请参阅文档的apply_interval_us部分。
操作行为¶
用户希望对其感兴趣的区域应用的管理操作。例如,换出页面、优先选择用于下一次回收的受害者、建议 khugepaged
合并或拆分,或者什么也不做,只收集区域的统计数据。
DAMOS 中定义了支持的操作列表,但每个操作的实现都在 DAMON 操作集层中,因为该实现通常取决于监控目标地址空间。例如,用于分页特定虚拟地址范围的代码将与用于物理地址范围的代码不同。并且监控操作实现集不强制支持列表中的所有操作。因此,特定 DAMOS 操作的可用性取决于选择哪个操作集一起使用。
支持的操作列表、它们的含义以及支持每个操作的 DAMON 操作集如下:
willneed
: 使用MADV_WILLNEED
对区域调用madvise()
。由vaddr
和fvaddr
操作集支持。
cold
: 使用MADV_COLD
对区域调用madvise()
。由vaddr
和fvaddr
操作集支持。
pageout
: 回收区域。由vaddr
,fvaddr
和paddr
操作集支持。
hugepage
: 使用MADV_HUGEPAGE
对区域调用madvise()
。由vaddr
和fvaddr
操作集支持。
nohugepage
: 使用MADV_NOHUGEPAGE
对区域调用madvise()
。由vaddr
和fvaddr
操作集支持。
lru_prio
: 在其 LRU 列表中优先考虑该区域。由paddr
操作集支持。
lru_deprio
: 在其 LRU 列表中降低该区域的优先级。由paddr
操作集支持。
migrate_hot
: 迁移区域时优先考虑更热的区域。由paddr
操作集支持。
migrate_cold
: 迁移区域时优先考虑更冷的区域。由paddr
操作集支持。
stat
: 什么也不做,只统计数据。所有操作集都支持。
将除 stat
之外的操作应用于某个区域被视为改变该区域的特性。因此,当对这些区域应用任何此类操作时,DAMOS 会重置区域的年龄。
要了解用户空间如何通过DAMON sysfs 接口设置操作,请参阅文档的action部分。
目标访问模式¶
方案感兴趣的访问模式。这些模式由 DAMON 监控结果提供的属性构建,特别是大小、访问频率和年龄。用户可以通过设置这三个属性的最小值和最大值来描述他们感兴趣的访问模式。如果一个区域的三个属性都在范围内,DAMOS 会将其归类为方案感兴趣的区域之一。
要了解用户空间如何通过DAMON sysfs 接口设置访问模式,请参阅文档的access_pattern部分。
配额¶
DAMOS 上限开销控制功能。如果目标访问模式未正确调优,DAMOS 可能会产生高开销。例如,如果发现一个具有感兴趣访问模式的巨大内存区域,将方案操作应用于该巨大区域的所有页面可能会消耗不可接受的大量系统资源。通过调优访问模式来防止此类问题可能具有挑战性,特别是当工作负载的访问模式高度动态时。
为了缓解这种情况,DAMOS 提供了一个名为“配额”的上限开销控制功能。它允许用户指定 DAMOS 用于应用操作的时间上限,和/或在用户指定的时间段内可以应用操作的最大内存区域字节数。
要了解用户空间如何通过DAMON sysfs 接口设置基本配额,请参阅文档的quotas部分。
优先级¶
在配额下做出良好决策的机制。当由于配额限制无法将操作应用于所有感兴趣的区域时,DAMOS 会对区域进行优先级排序,并仅将操作应用于优先级足够高的区域,以使其不超过配额。
每个操作的优先级机制应有所不同。例如,对于页出方案操作,很少访问(较冷)的内存区域将优先处理。相反,对于大页合并方案操作,较冷的区域将降低优先级。因此,每个操作的优先级机制都在各自的 DAMON 操作集中实现,并与操作一起。
尽管实现取决于 DAMON 操作集,但通常会使用区域的访问模式属性来计算优先级。一些用户可能希望该机制根据其特定情况进行个性化设置。例如,一些用户可能希望该机制更看重最近性(age
)而不是访问频率(nr_accesses
)。DAMOS 允许用户指定每个访问模式属性的权重,并将此信息传递给底层机制。然而,权重如何以及是否被尊重取决于底层优先级机制的实现。
要了解用户空间如何通过DAMON sysfs 接口设置优先级权重,请参阅文档的weights部分。
目标导向的反馈驱动自动调优¶
自动反馈驱动的配额调优。用户无需设置绝对配额值,而是可以指定他们感兴趣的指标,以及他们希望该指标达到的目标值。然后 DAMOS 会自动调整相应方案的激进程度(配额)。例如,如果 DAMOS 未能达到目标,DAMOS 会自动增加配额。如果 DAMOS 超额达到目标,它会减少配额。
目标可以通过四个参数指定,即 target_metric
、target_value
、current_value
和 nid
。自动调优机制试图使 target_metric
的 current_value
与 target_value
相同。
user_input
: 用户提供的值。用户可以使用他们感兴趣的任何指标作为值。用户主要工作负载的延迟或吞吐量、系统指标如空闲内存比例或内存压力停滞时间(PSI)都可以作为例子。请注意,在这种情况下,用户应自行明确设置current_value
。换句话说,用户应重复提供反馈。some_mem_psi_us
: 系统范围的some
内存压力停滞信息(以微秒为单位),从上次配额重置到下次配额重置之间测量。DAMOS 会自行进行测量,因此用户只需在初始时设置target_value
。换句话说,DAMOS 会进行自我反馈。node_mem_used_bp
: 特定 NUMA 节点的已用内存比例(以 bp 为单位,即 1/10,000)。node_mem_free_bp
: 特定 NUMA 节点的空闲内存比例(以 bp 为单位,即 1/10,000)。
nid
是仅在 node_mem_used_bp
和 node_mem_free_bp
中指向特定 NUMA 节点时可选。
要了解用户空间如何通过DAMON sysfs 接口设置调优目标指标、目标值和/或当前值,请参阅文档的配额目标部分。
水印¶
条件性 DAMOS (停用)自动化。用户可能希望 DAMOS 仅在特定情况下运行。例如,当有足够的空闲内存得到保证时,运行主动回收方案只会消耗不必要的系统资源。为了避免这种消耗,用户需要手动监控一些指标,例如空闲内存比例,并打开或关闭 DAMON/DAMOS。
DAMOS 允许用户使用三个水印来卸载此类工作。它允许用户配置他们感兴趣的指标,以及三个水印值,即高、中和低。如果指标值高于高水印或低于低水印,则方案被停用。如果指标低于中水印但高于低水印,则方案被激活。如果所有方案都被水印停用,则监控也被停用。在这种情况下,DAMON 工作线程仅定期检查水印,因此几乎不产生任何开销。
要了解用户空间如何通过DAMON sysfs 接口设置水印,请参阅文档的watermarks部分。
过滤器¶
非访问模式的目标内存区域过滤。如果用户运行自己编写的程序或拥有良好的分析工具,他们可能会比内核了解更多信息,例如未来的访问模式或对特定类型内存的特殊要求。例如,有些用户可能知道只有匿名页会影响他们程序的性能。他们也可能有一个延迟关键进程列表。
为了让用户利用这些特殊知识优化 DAMOS 方案,DAMOS 提供了一个名为 DAMOS 过滤器的功能。该功能允许用户为每个方案设置任意数量的过滤器。每个过滤器指定:
一种内存类型 (
type
),它是针对该类型内存还是除该类型之外的所有内存 (
matching
),以及它是允许 (include) 还是拒绝 (exclude) 对该内存应用方案操作 (
allow
)。
为了高效处理过滤器,某些类型的过滤器由核心层处理,而另一些则由操作集处理。在后一种情况下,过滤器的支持类型取决于 DAMON 操作集。对于核心层处理的过滤器,被过滤器排除的内存区域不计入方案尝试该区域的次数。相反,如果内存区域被操作集层处理的过滤器过滤,则计入方案尝试的次数。这种差异会影响统计数据。
当安装多个过滤器时,首先评估由核心层处理的过滤器组。之后,评估由操作层处理的过滤器组。每个组中的过滤器按安装顺序评估。如果内存的一部分与某个过滤器匹配,则忽略后续过滤器。如果内存的一部分因为未与任何过滤器匹配而通过了过滤器评估阶段,则对其应用方案操作取决于最后一个过滤器的允许类型。如果最后一个过滤器是允许的,则内存的一部分将被拒绝,反之亦然。
例如,假设按顺序安装了 1) 一个允许匿名页的过滤器和 2) 另一个拒绝年轻页的过滤器。如果一个区域中符合应用方案操作条件的页面是匿名页,那么无论它是否年轻,方案操作都将应用于该页面,因为它与第一个允许过滤器匹配。如果该页面不是匿名页但很年轻,则方案操作将不被应用,因为第二个拒绝过滤器会阻止它。如果该页面既不是匿名页也不是年轻页,则该页面将通过过滤器评估阶段,因为没有匹配的过滤器,并且操作将应用于该页面。
目前支持以下 type
过滤器。
- 核心层处理
- addr
应用于属于给定地址范围的页面。
- 目标
应用于属于给定 DAMON 监控目标的页面。
- 操作层处理,仅由
paddr
操作集支持。 - 匿名
应用于包含未存储在文件中的数据的页面。
- 活动
应用于活动页面。
- 内存控制组
应用于属于给定 cgroup 的页面。
- 年轻
应用于上次方案访问检查后被访问过的页面。
- 大页大小
应用于在给定大小范围内管理的页面。
- 未映射
应用于未映射的页面。
- 操作层处理,仅由
要了解用户空间如何通过DAMON sysfs 接口设置过滤器,请参阅文档的filters部分。
统计信息¶
DAMOS 行为的统计数据,旨在帮助监控、调优和调试 DAMOS。
从方案执行开始,DAMOS 为每个方案记录以下统计信息。
nr_tried
: 方案尝试应用的区域总数。sz_trtied
: 方案尝试应用的区域总大小。sz_ops_filter_passed
: 通过操作集层处理的 DAMOS 过滤器的总字节数。nr_applied
: 方案应用的区域总数。sz_applied
: 方案应用的区域总大小。qt_exceeds
: 方案配额超出的总次数。
“方案尝试应用于某个区域”意味着 DAMOS 核心逻辑确定该区域符合应用方案操作的条件。访问模式、配额、水印以及核心逻辑处理的过滤器都可能影响这一点。核心逻辑只会要求底层的操作集对该区域应用操作,因此操作是否真正应用尚不清楚。这就是为什么它被称为“尝试”。
“方案应用于区域”是指操作集已将操作应用于该区域的至少一部分。操作集处理的过滤器,以及操作和该区域页面的类型都可能影响这一点。例如,如果过滤器设置为排除匿名页,而该区域只有匿名页,或者如果操作是pageout
而该区域的所有页都不可回收,则将操作应用于该区域将失败。
要了解用户空间如何通过DAMON sysfs 接口读取统计信息,请参阅文档的 :ref:`stats <sysfs_stats>`部分。
区域遍历¶
DAMOS 功能允许用户访问刚刚应用 DAMOS 操作的每个区域。利用此功能,DAMON API 允许用户访问区域的完整属性,包括访问监控结果和通过 DAMOS 过滤器的区域内部内存量。DAMON sysfs 接口也允许用户通过特殊文件读取数据。
应用程序编程接口¶
适用于内核空间数据访问感知应用程序的编程接口。DAMON 是一个框架,它本身不做任何事情。相反,它只帮助其他内核组件(如子系统和模块)使用 DAMON 的核心功能构建其数据访问感知应用程序。为此,DAMON 通过其应用程序编程接口,即 include/linux/damon.h
,将其所有功能暴露给其他内核组件。有关接口的详细信息,请参阅 API 文档。
模块¶
由于 DAMON 的核心是一个内核组件框架,它不提供任何直接的用户空间接口。这些接口应由每个 DAMON API 用户内核组件实现。DAMON 子系统本身实现了此类 DAMON API 用户模块,这些模块应用于通用 DAMON 控制和特殊用途的数据访问感知系统操作,并为用户空间提供稳定的应用程序二进制接口 (ABI)。用户空间可以使用这些接口构建其高效的数据访问感知应用程序。
通用用户界面模块¶
DAMON 模块,为运行时通用 DAMON 用途提供用户空间 ABI。
与其他许多 ABI 一样,这些模块在“sysfs”等伪文件系统上创建文件,允许用户通过向文件写入和读取来向 DAMON 指定请求并获取答案。作为对此类 I/O 的响应,DAMON 用户界面模块通过 DAMON API 控制 DAMON 并检索用户请求的结果,然后将结果返回给用户空间。
这些 ABI 设计用于用户空间应用程序开发,而非人类手动操作。建议人类用户使用此类用户空间工具。一个用 Python 编写的用户空间工具可在 Github (https://github.com/damonitor/damo)、Pypi (https://pypistats.org/packages/damo) 和 Fedora (https://packages.fedoraproject.org/pkgs/python-damo/damo/) 上获取。
目前,此类型有一个模块可用,即“DAMON sysfs 接口”。请参阅 ABI 文档以获取接口的详细信息。
专用访问感知内核模块¶
DAMON 模块,为特定用途的 DAMON 使用提供用户空间 ABI。
DAMON 用户界面模块用于在运行时完全控制所有 DAMON 功能。对于每个专用的系统范围数据访问感知系统操作,例如主动回收或 LRU 列表平衡,可以简化接口,移除不必要的专用旋钮,并扩展到启动时甚至编译时控制。DAMON 控制参数的默认值也需要针对该用途进行优化。
为了支持此类情况,还有更多 DAMON API 用户内核模块提供更简单和优化的用户空间接口。目前,提供了两个用于主动回收和 LRU 列表操作的模块。更多详情,请阅读它们的使用文档(基于 DAMON 的回收和基于 DAMON 的 LRU 列表排序)。