查看源代码 系统限制

Erlang 语言规范对进程数量、原子长度等没有限制。然而,出于性能和内存节省的原因,在 Erlang 语言和执行环境的实际实现中总是存在限制。

  • 进程 - 默认情况下,同时存在的 Erlang 进程的最大数量为 1,048,576。此限制可以在启动时配置。有关更多信息,请参阅 ERTS 中 erl(1) 手册页中的 +P 命令行标志。

  • 运行时系统实例上的唯一本地进程标识符 - 在 64 位系统上,最多可以创建 2⁶⁰ - 1 个唯一进程标识符,而在 32 位系统上,最多可以创建 2²⁸ - 1 个。

  • 已知节点 - 如果节点 X 上存在来自 Y 的任何进程 ID、端口、引用或函数(Erlang 数据类型),或者如果 X 和 Y 已连接,则远程节点 Y 必须为节点 X 所知。一个节点同时/曾经已知的远程节点的最大数量受限于可用于节点名称的最大原子数量。除节点名称原子之外,所有关于远程节点的数据都会被垃圾回收。

  • 已连接节点 - 同时连接的节点的最大数量受限于同时已知的远程节点的最大数量、可用的最大(Erlang)端口数量或可用的最大套接字数量

  • 原子中的字符 - 255.

  • 原子 - 默认情况下,原子的最大数量为 1,048,576。可以使用 +t 选项提高或降低此限制。

  • 元组中的元素 - 元组中的最大元素数量为 16,777,215(24 位无符号整数)。

  • 二进制大小 - 在 Erlang 的 32 位运行时系统中,可以使用位语法构造或匹配的最大二进制大小为 536,870,911 字节。在 64 位运行时系统中,最大大小为 2,305,843,009,213,693,951 字节。如果超过此限制,位语法构造将失败并出现 system_limit 异常,而任何尝试匹配过大二进制的操作都将失败。从 Erlang/OTP 27 开始,所有其他创建二进制文件的操作(例如 list_to_binary/1)也强制执行相同的限制。

  • Erlang 节点分配的总数据量 - Erlang 运行时系统可以使用完整的 32 位(或 64 位)地址空间,但操作系统通常会限制单个进程使用的地址空间小于此值。

  • 节点名称的长度 - Erlang 节点名称的形式为 host@shortnamehost@longname。节点名称在系统中用作原子,因此节点名称的最大大小也为 255。

  • 打开的端口 - 默认情况下,同时打开的 Erlang 端口的最大数量通常为 16,384。此限制可以在启动时配置。有关更多信息,请参阅 ERTS 中 erl(1) 手册页中的 +Q 命令行标志。

  • 运行时系统实例上的唯一本地端口标识符 - 在 64 位系统上,最多可以创建 2⁶⁰ - 1 个唯一端口标识符,而在 32 位系统上,最多可以创建 2²⁸ - 1 个。

  • 打开的文件和套接字 - 同时打开的文件和套接字的最大数量取决于可用的最大 Erlang 端口数量,以及操作系统特定的设置和限制。

  • 函数或 fun 的参数数量 - 255.

  • 运行时系统实例上的唯一引用 - 每个调度器线程都有自己的一组引用,而所有其他线程都有一组共享引用。每组引用包含 2⁶⁴ - 1 个唯一引用。也就是说,运行时系统实例上可以产生的唯一引用的总数为 (NumSchedulers + 1) × (2⁶⁴ - 1)。如果调度器线程每纳秒创建一个新引用,则最早也要在 584 年后才会被重用。也就是说,在可预见的未来,它们是足够唯一的。

  • 运行时系统实例上的唯一整数 - 有两种类型的唯一整数由 erlang:unique_integer/1 BIF 创建

    • 使用 monotonic 修饰符创建的唯一整数包含一组 2⁶⁴ - 1 个唯一整数。
    • 不使用 monotonic 修饰符创建的唯一整数包含每个调度器线程的一组 2⁶⁴ - 1 个唯一整数和一组由其他线程共享的 2⁶⁴ - 1 个唯一整数。也就是说,不使用 monotonic 修饰符的唯一整数的总数为 (NumSchedulers + 1) × (2⁶⁴ - 1)

    如果每纳秒创建一个唯一整数,则唯一整数最早将在 584 年后被重用。也就是说,在可预见的未来,它们是足够唯一的。

  • 定时器分辨率 - 在大多数系统上,为毫秒级分辨率。有关更多信息,请参阅 Erlang 中的时间和时间校正 ERTS 用户指南的定时器部分。