10 个版本
0.6.0+5.3.0-1-ge13ca993e8… | 2024年7月14日 |
---|---|
0.5.4+5.3.0-patched | 2023年7月27日 |
0.5.3+5.3.0-patched | 2023年2月6日 |
0.5.2+5.3.0-patched | 2022年9月29日 |
0.4.0+5.2.1 | 2020年7月21日 |
#38 在 内存管理
1,040,853 每月下载量
用于 227 个 Crates (15 个直接使用)
2MB
51K SLoC
包含 (自动工具混淆代码,420KB) configure/configure,(模糊 autoconf 代码,84KB) jemalloc/configure.ac
jemalloc-sys - Rust 对 C 库 jemalloc
的绑定
注意:Rust 分配器 API 在
tikv-jemallocator
Crates 中实现了jemalloc
。
文档
jemalloc
是一个通用内存分配器,其文档可在以下位置找到
API 文档
当前 jemalloc 版本: 5.2.1.
平台支持
请参阅 tikv-jemallocator
Crates 的平台支持。
特性
大多数特性对应于 jemalloc
特性 - 参考 jemalloc/INSTALL.md
。
Cargo 特性
此 Crates 提供以下 cargo 特性标志
-
profiling
(通过--enable-prof
配置jemalloc
):启用堆分析功能和泄漏检测功能。有关使用详情,请参阅 jemalloc 的 "opt.prof" 选项文档。启用时,有几种回溯方法,配置脚本将选择以下列表中首先似乎可以正常工作的一种libunwind
(需要 --enable-prof-libunwind)libgcc
(除非禁用 --disable-prof-libgcc)gcc intrinsics
(除非禁用 --disable-prof-gcc)
-
stats
(使用jemalloc
的--enable-stats
配置):启用统计收集功能。有关使用详情,请参阅jemalloc
的 "opt.stats_print
" 选项文档。 -
debug
(使用jemalloc
的--enable-debug
配置):启用断言和验证代码。这会显著影响性能,但在应用程序开发期间非常有用。 -
background_threads_runtime_support
(默认启用):当在jemalloc
支持的一些 POSIX 目标上构建jemalloc-sys
时启用后台线程运行时支持。默认情况下,在运行时禁用后台线程。此选项允许在运行时动态启用它们。 -
background_threads
(默认禁用):在运行时默认启用后台线程。当设置为 true 时,将在需要时创建后台线程(后台线程的数量不会超过 CPU 或活动区域的数量)。线程定期运行,并异步处理清理。关闭时,后台线程将同步终止。请注意,在fork(2)
函数后,子进程的状态将禁用,而不管父进程的状态如何。有关相关统计信息,请参阅stats.background_thread
。可以使用opt.background_thread
来设置默认选项。后台线程仅在选定的基于 pthread 的平台上可用。 -
unprefixed_malloc_on_supported_platforms
:当禁用时,使用--with-jemalloc-prefix=_rjem_
配置jemalloc
。启用此选项会导致像malloc
这样的符号在没有任何前缀的情况下发出,覆盖了由 libc 定义的符号。这通常会导致同一程序中链接的 C 和 C++ 代码也使用jemalloc
。在某些平台上,由于去前缀会导致段错误,因此始终使用前缀。 -
disable_initial_exec_tls
(默认禁用):当启用时,jemalloc 使用--disable-initial-exec-tls
选项进行构建。它禁用了 jemalloc 内部线程局部存储的初始-exec TLS 模型(在支持显式设置的平台上)。这可以允许 jemalloc 在程序启动后动态加载(例如使用 dlopen)。如果您遇到错误yourlib.so: cannot allocate memory in static TLS block
,您可能希望启用此选项。 -
disable_cache_oblivious
(默认禁用):当启用时,jemalloc 使用--disable-cache-oblivious
选项进行构建。在这种情况下,所有大分配都将作为实现原语进行页面对齐。这可能会严重损害 CPU 缓存利用率。然而,缓存无关布局的成本是每个大分配额外一个页面,这可能对某些应用程序来说不可行。
环境变量
jemalloc
的选项值通过环境变量传递,使用以下模式 JEMALLOC_SYS_{KEY}=VALUE
,其中 KEY
名称对应于 ./configure
选项的 jemalloc
,单词首字母大写,连字符 -
被下划线 _
替换(见 jemalloc/INSTALL.md
)
-
JEMALLOC_SYS_WITH_MALLOC_CONF=<malloc_conf>
:将<malloc_conf>
作为运行时选项字符串嵌入,在malloc_conf
全局变量、/etc/malloc.conf
符号链接和MALLOC_CONF
环境变量之前处理(注意:此变量可能以_RJEM_MALLOC_CONF
为前缀)。例如,要将脏页的默认衰减时间更改为 30 秒JEMALLOC_SYS_WITH_MALLOC_CONF=dirty_decay_ms:30000
-
JEMALLOC_SYS_WITH_LG_PAGE=<lg-page>
:指定分配器页面大小的 2 的对数,这必须至少与系统页面大小一样大。默认情况下,配置脚本确定主机的页面大小,并将分配器页面大小设置为与系统页面大小相同,因此不需要指定此选项,除非系统页面大小可能在配置和执行之间更改,例如交叉编译。 -
JEMALLOC_SYS_WITH_LG_HUGEPAGE=<lg-hugepage>
:指定系统大页面大小的 2 的对数。此选项在交叉编译或覆盖不支持大页面的系统的默认值时很有用。 -
JEMALLOC_SYS_WITH_LG_QUANTUM=<lg-quantum>
:指定最小分配对齐的 2 的对数。jemalloc 需要知道满足以下 C 标准要求的最低对齐(摘自 2011 年 4 月 12 日 C11 标准草案)如果分配成功,返回的指针适当地对齐,以便可以将其分配给任何基本对齐要求的对象类型的指针,然后用于访问分配空间中的此类对象或此类对象的数组 [...]
此设置与体系结构相关,尽管jemalloc为最常用的现代体系结构提供了已知的安全值,但与GNU libc (glibc)相关的一个问题可能会影响您的选择。在大多数现代体系结构上,这要求16字节对齐(即4字节),但glibc的开发者出于性能原因选择不满足这一要求。有关旧讨论,请参阅https://sourceware.org/bugzilla/show_bug.cgi?id=206。与glibc不同,jemalloc默认遵循C标准(注意:jemalloc在小于量子的大小类上技术上会作弊),但Linux系统已经绕过了这种分配器不兼容的问题,因此在实践中让jemalloc的最小对齐遵循glibc的引导通常是安全的。如果在配置期间指定了
JEMALLOC_SYS_WITH_LG_QUANTUM=3
,jemalloc将提供不是16字节对齐的额外大小类(24、40和56)。 -
JEMALLOC_SYS_WITH_LG_VADDR=<lg-vaddr>
:指定有效虚拟地址位数。默认情况下,配置脚本会尝试检测已知如何检测虚拟地址大小的平台,并在其他情况下选择默认值。此选项在交叉编译时可能很有用。
许可证
本项目许可为以下之一:
- Apache许可证第2版,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则您提交给tikv-jemalloc-sys
的任何贡献,根据Apache-2.0许可证定义,应双许可如上所述,不附加任何额外条款或条件。