RFC-0181:无锁可丢弃 VMO | |
---|---|
状态 | 已接受 |
区域 |
|
说明 | 允许对处于解锁状态的可丢弃 VMO 进行读写。 |
问题 |
|
Gerrit 更改 | |
作者 | |
审核人 | |
提交日期(年-月-日) | 2022-05-18 |
审核日期(年-月-日) | 2022-08-03 |
摘要
无锁可丢弃的 VMO 是可丢弃的 VMO 的子类型,允许对其进行访问,即使未锁定也是如此。VMO 可能仍会随时被舍弃,因此用户必须能够容忍突然完全丢失数据。为了提高该应用场景中的使用率,我们扩展了 VMO 提示操作,使其也涵盖可丢弃的 VMO。
设计初衷
跟踪是一项希望尽可能降低性能开销并生成大量数据的任务。由于锁定和解锁的开销,当前可丢弃的 VMO 不适合此用途。目前,使用常规匿名 VMO 存在一个缺点,即由于生成的数据突发,跟踪可能会导致系统发生 OOM。
跟踪引擎能够容忍任意数据丢失。也就是说,除了跟踪数据丢失之外,跟踪 VMO 可以任意取消提交,即使在读取或写入过程中也不会造成问题。此外,与整个系统发生 OOM 相比,丢失一些轨迹数据更为可取。
允许在解锁状态下使用可丢弃的 VMO 可解决所有这些问题,因为:
- 通过跟踪被丢弃的 VMO 内容,可避免系统 OOM。
- 写入轨迹 VMO 不会产生额外的开销。
- 跟踪功能已经可以容忍数据丢失,并会将 VMO 舍弃视为数据丢失。
虽然跟踪系统可以容忍数据丢失,但最好仅在需要时丢弃跟踪数据,以免发生 OOM。没有任何机制可以控制内核何时对可丢弃的 VMO 执行回收,或者内核如何平衡丢弃 VMO 与其他形式的回收。因此,为了提高轨迹生成的可靠性,同时又不影响 OOM 防范,我们希望找到一种方法,让内核仅在需要时从这些内存中回收。
利益相关方
教员:
待定
Reviewers:
待定
咨询了:
待定
社交:
eieio@ 和 rashaeqbal@
设计
创建标志
无锁可丢弃的 VMO 是常规可丢弃的 VMO 的子类型,应通过将选项 ZX_VMO_DISCARDABLE_LOCKLESS
传递给 zx_vmo_create
(而非常规 ZX_VMO_DISCARDABLE
选项)来创建。创建的可丢弃 VMO 仍会在解锁状态下启动,唯一的区别在于,在解锁状态下,对 VMO 执行读写操作将会成功,而不是生成错误。
控制回收
VMO 范围操作 ZX_VMO_OP_DONT_NEED
和 ZX_VMO_OP_ALWAYS_NEED
的 API 定义将扩展为涵盖可丢弃的 VMO,而不仅仅是页面器支持的 VMO。
锁定行为
虽然无锁可丢弃对象无需锁定即可使用,但仍允许通过 ZX_VMO_OP_LOCK
和相关操作对其进行锁定。锁定行为与常规可丢弃 VMO 完全相同,并且在锁定期间,内容无法丢弃。
实现
ZX_VMO_DISCARDABLE_LOCKLESS
的系统调用标志需要通过 VMO 创建传递下来,并成为内部 VMO 中的标志。
当两个相关的代码路径检查可丢弃状态并在解锁时生成错误时,现有的可丢弃 VMO 实现会明确导致故障。只需扩展这些检查,即可在是 LOCKLESS 变体时不生成故障。
内部可舍弃列表中可舍弃的 VMO 的移动也需要稍作更改。由于无锁 VMO 可能始终有要丢弃的页面,而不仅仅是自上次丢弃以来被锁定的页面,因此这些页面在被丢弃后需要保留在可丢弃列表中。
对于回收更改,系统会忽略 ZX_VMO_OP_ALWAYS_NEED
的范围,并始终将其提升为完整 VMO。系统会创建单独的可丢弃列表,并将提示的 VMO 放置在该列表中。当系统处于 ALMOST_OOM 压力下时,系统会逐出此列表。ZX_VMO_OP_DONT_NEED
将
- 如果 VMO 处于解锁状态,则立即舍弃 VMO
- 将 VMO 移至常规舍弃列表(如果尚未移至)。
无锁可丢弃的 VMO 在映射时不需要 ZX_VM_ALLOW_FAULTS 标志。
这一切都可以作为一个小型 CL 提交到 fuchsia.git,而无需任何其他依赖项。
性能
由于只会在已经是慢速路径场景的情况下添加一次布尔值检查,因此 VMO 操作预计不会受到性能影响。
安全注意事项
无
隐私注意事项
无
测试
测试将添加到 Zircon 核心测试套件中。
文档
需要更新相关的系统调用文档:
zx_vmo_create
- 文档ZX_VMO_DISCARDABLE_LOCKLESS
。zx_vmo_op_range
- 更新了有关ZX_VMO_OP_ALWAYS_NEED
和ZX_VMO_OP_DONT_NEED
支持的 VMO 类型的声明。zx_vmar_map
- 更新了针对无锁可丢弃 VMO 的ZX_VM_ALLOW_FAULTS
要求。
缺点、替代方案和未知情况
原始可丢弃 RFC 介绍了一种使用原子操作进行优化的方法,该方法可以提供大部分所需的性能提升。这种方法有两个缺点:
- 内核和用户空间之间的原子 API 是未开垦的领域,并且是一个需要深入探索的复杂领域,因此在原始提案中未实现此 API。
- 即使锁定页面很高效,我们仍然不需要这样做,这实际上违背了我们希望这些 VMO 能够随时完全舍弃的内存需求。
在先技术和参考文档
无