RFC-0132:FIDL 表大小限制

RFC-0132:FIDL 表大小限制
状态已接受
区域
  • FIDL
说明

此 RFC 将 FIDL 表的条目数限制为最多 64 个。

Gerrit 更改
作者
审核人
提交日期(年-月-日)2021-09-20
审核日期(年-月-日)2021-10-04

摘要

此 RFC 将 FIDL 表的成员数限制为最多 64 个。

另请参见:

设计初衷

发送 FIDL 表(构建、编码和解码)的用户模式性能开销取决于表正文中的最大集序数。这种行为对用户来说并不明显或直观,如果滥用,可能会产生负面性能影响。此 RFC 提出了一项限制,以防止近期出现严重行为,作为权宜解决方案,促使 FIDL 作者重新考虑其设计,并鼓励 FIDL 团队在 FIDL 作者开始遇到限制时提供更好的长期答案。

利益相关方

哪些人对此 RFC 的接受与否有利益相关?

协调员:pascallouis@google.com

审核者:pascallouis@google.com、yifeit@google.com、mkember@google.com

咨询了以下人员:ianloic@google.com、azaslavsky@google.com、abarth@google.com

社交:不适用

设计

表最多只能包含 64 个序数。具体而言:

  • 如果序数值高于 64,FIDL 编译器必须发出错误。
  • 当收到高于 64 的序数时,绑定不得出错。 它们可以忽略大于 64 的序数。

此外,如果第 64 个序数未预留,则必须包含另一个表,以确保消息能够继续扩展。具体而言,如果第 64 个序数不是预留的,并且被分配了非表类型,FIDL 编译器必须发出错误。

实现

这需要更改 FIDL 编译器以及每个 FIDL 绑定。

性能

本部分中的所有测量结果均以纳秒为单位,是在搭载 2.60GHz Intel Core i5-7300U CPU 的 NUC 上记录的。

以下是 LLCPP 测量的一方向通信所需的用户模式总时间(构建 + 编码 + 解码):

单向通信的用户模式总时长

仅设置最后一个字段和设置所有字段的情况都非常接近线性,其斜率分别为 14.7 ns/field 和 63.7 ns/field。这意味着,未设置或未使用的字段的开销约为 14.7 纳秒,而已设置的字段的开销约为 63.7 纳秒。

当最大序数为 64 时,最后一个字段设置时间为 3234.1 ns,所有字段设置时间为 6294.2 ns。

请注意,这些时间可能会随着绑定实现的变化而发生变化。

下表显示了 Fuchsia 系统中 FIDL 表定义中的最大非预留序数的当前分布:

表定义中的最大非预留序数的分布

表格定义中的最高序数为 56,其次为 26。包含 56 个字段的表中有许多字段被不必要地标记为已预留,可以重构为更紧凑的表。这意味着,在未来一段时间内,当前表通常不会达到 64 个序数的限制。

分配更小

某些绑定(例如 LLCPP)会计算消息所需的最大缓冲区大小,并使用此信息来调整分配大小。如果表不再是无限大小,在某些情况下,可以缩减分配的大小,这可能会提高性能。

工效学设计

此 RFC 会使 FIDL 的使用变得更加困难,因为现在必须考虑限制。

向后兼容性

此 RFC 会破坏与条目数超过 64 的表的向后兼容性。

安全注意事项

这不会产生任何安全影响。

隐私注意事项

这不会对隐私造成影响。

测试

GIDL 测试将验证线格格式是否保持不变,以及大于 64 个条目的表的解码是否仍能正常运行。单元测试将检查编译器级更改。

文档

需要更新 FIDL 语言文档,以指明此限制。

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

为什么上限是 64 个?

64 这个上限是任意设定的,但之所以选择这个上限,有以下几点原因:

  • 这比绝大多数用例所需的大小要大。虽然会出现离群值,但可以使用其他结构来表示数据。如果将此限制改为 32,则会更接近目前常用的表大小。

  • 如果上限大于 64,那么在某些情况下,用户可能会对性能下降感到意外。如果发现更高的限制更常用,我们仍有可能通过另一个 RFC 再次提高限制。

  • 64 是 64 位整数中的位数。这样一来,绑定就可以使用位标志来标记存在或不存在。同样,位掩码可用于查找序数,如已遭拒 RFC RFC-0016 中所述。

大型表的替代方案

您可以使用多种替代结构来替代大型表。联合体矢量就是其中一种选项,它与表一样可扩展,但对联合体字段的数量没有限制。它还具有一种表示法,可能更适用于使用场景中字段的使用较为稀疏的情况。

稀疏表布局

之前被拒的 RFC 探讨了一种可实现更简洁表示的表格替代布局: RFC-0116:对更简洁的 FIDL 表的线格格式支持

如果表使用更稀疏的表示法,则可能不需要设置大小限制。