mi-malloc 1.8/2.1
 
正在加载...
正在搜索...
无匹配项
环境变量选项

您可以通过编程方式(使用 mi_option_set)或通过环境变量设置更多选项

  • MIMALLOC_SHOW_STATS=1: 程序终止时显示统计信息。
  • MIMALLOC_VERBOSE=1: 显示详细消息。
  • MIMALLOC_SHOW_ERRORS=1: 显示错误和警告消息。

高级选项

  • MIMALLOC_ARENA_EAGER_COMMIT=2: 开启 mimalloc 分配段和页的大型竞技场(通常为 1GiB)的急切提交。将其设置为 2(默认值)以仅在过度承诺系统(例如 Linux)上启用此功能。将其设置为 1 可在其他系统(如 Windows 或 macOS)上显式启用此功能,这可能会提高性能(因为整个竞技场一次性提交)。请注意,急切提交只会增加提交量,但不会增加实际的峰值驻留集 (rss),因此通常可以启用此功能。
  • MIMALLOC_PURGE_DELAY=N: mimalloc 清除未使用 OS 页的延迟,单位为毫秒(默认为 10)。这会向操作系统发出信号,表明底层物理内存可以重复使用,这可以减少内存碎片,尤其是在长时间运行的(服务器)程序中。将 N 设置为 0 会在页面变为未使用时立即清除,这可以改善内存使用,但也会降低性能。将 N 设置为更高的值(例如 100)可以提高性能(有时会大幅提高),但代价是有时可能会使用更多内存。将其设置为 -1 会完全禁用清除。
  • MIMALLOC_PURGE_DECOMMITS=1: 默认情况下,“清除”内存意味着未使用的内存将被解除提交(Windows 上为 MEM_DECOMMITmmap 系统上为 MADV_DONTNEED(立即减少 rss))。将其设置为 0 以便在清除时“重置”未使用的内存(Windows 上为 MEM_RESETmmap 系统上通常为 MADV_FREE(不会立即减少 rss))。Mimalloc 通常不会“释放”OS 内存,而只会“清除”OS 内存,换句话说,它会尝试保留虚拟地址范围并在这些范围内解除提交(以使底层物理内存可用于其他进程)。

针对大型工作负载和服务的进一步选项

  • MIMALLOC_USE_NUMA_NODES=N: 假定最多有 N 个 NUMA 节点。如果未设置,则在运行时检测实际的 NUMA 节点。将 N 设置为 1 可能会避免某些虚拟环境中的问题。此外,将其设置为低于实际 NUMA 节点数量的值是可以的,只会导致线程可能跨实际 NUMA 节点分配更多内存(但无论如何这都可能发生,因为 NUMA 本地分配始终是尽力而为,但不能保证)。
  • MIMALLOC_ALLOW_LARGE_OS_PAGES=1: 如果可用,使用大型 OS 页(2 或 4MiB);对于某些工作负载,这可以显著提高性能。当此选项禁用时,它还会禁用进程的透明巨页 (THP)(在 Linux 和 Android 上)。使用 MIMALLOC_VERBOSE 检查是否启用了大型 OS 页——通常需要明确授予大型 OS 页的权限(如在 WindowsLinux 上)。但是,有时 OS 保留大型 OS 页的连续物理内存非常慢,因此在内存可能碎片化的系统上请谨慎使用(因此,我们通常建议尽可能使用 MIMALLOC_RESERVE_HUGE_OS_PAGES)。
  • MIMALLOC_RESERVE_HUGE_OS_PAGES=N: 其中 N 是 1GiB 巨型 OS 页的数量。这会在启动时保留巨页,有时这可以大大提高大型工作负载的(延迟)性能。通常,最好不要将 MIMALLOC_ALLOW_LARGE_OS_PAGES=1 与此设置结合使用。就像大型 OS 页一样,请谨慎使用,因为当内存碎片化时,保留连续物理内存可能需要很长时间(但保留巨页仅在启动时进行一次)。请注意,我们通常需要明确授予巨型 OS 页的权限(如在 WindowsLinux 上)。对于巨型 OS 页,设置 MIMALLOC_EAGER_COMMIT_DELAY=NN 默认为 1)可能是有益的,以延迟线程的初始 N 个段(4MiB)不在巨型 OS 页中分配;这可以防止生命周期短且分配很少的线程占用巨型 OS 页区域中的空间(因为巨型 OS 页固定在物理内存中,无法清除)。巨页通常均匀地分配给 NUMA 节点。我们可以使用 MIMALLOC_RESERVE_HUGE_OS_PAGES_AT=N,其中 N 是 numa 节点(从 0 开始),以便将所有巨页分配到特定的 numa 节点。

当使用 fork 并结合大型或巨型 OS 页时,请谨慎:在 fork 时,OS 对原始进程中的所有页面(包括巨型 OS 页)使用写时复制。当该区域中的任何内存被写入时,OS 将复制整个 1GiB 巨页(或 2MiB 大页),这可能导致内存使用量大幅增长。