RFC-0181:无锁可舍弃 VMO

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_NEEDZX_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_NEEDZX_VMO_OP_DONT_NEED 支持的 VMO 类型的声明。
  • zx_vmar_map - 更新了针对无锁可丢弃 VMO 的 ZX_VM_ALLOW_FAULTS 要求。

缺点、替代方案和未知情况

原始可丢弃 RFC 介绍了一种使用原子操作进行优化的方法,该方法可以提供大部分所需的性能提升。这种方法有两个缺点:

  1. 内核和用户空间之间的原子 API 是未开垦的领域,并且是一个需要深入探索的复杂领域,因此在原始提案中未实现此 API。
  2. 即使锁定页面很高效,我们仍然不需要这样做,这实际上违背了我们希望这些 VMO 能够随时完全舍弃的内存需求。

在先技术和参考文档