十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

placeholderkv 内置 jemalloc 构建与安装完全指南:configure 选项、编译安装与源码集成解析

placeholderkv 内置 jemalloc 构建与安装完全指南:configure 选项、编译安装与源码集成解析 placeholderkv 内置 jemalloc 构建与安装完全指南configure 选项、编译安装与源码集成解析【免费下载链接】placeholderkvA flexible distributed key-value database that is optimized for caching and other realtime workloads.项目地址: https://gitcode.com/GitHub_Trending/pl/placeholderkv导读本文以仓库内 deps/jemalloc/INSTALL.md 为骨架系统讲解 jemalloc 5.3.0版本见 deps/jemalloc/VERSION的完整构建、安装、配置与开发流程并结合本仓库源码剖析它在 placeholderkv 中的实际集成方式——包括je_符号前缀、--with-lg-quantum3等关键参数为何如此设置以及 src/zmalloc.c 如何将malloc/free映射到je_malloc/je_free。读完本文你将掌握从零构建 jemalloc、按需裁剪配置项、用 make 目标局部编译安装以及理解 placeholderkv 默认内存分配器工作原理的完整能力。快速开始两种构建路径打包发布版本三行命令在 jemalloc 源码树根目录即本仓库的 deps/jemalloc 目录下打包发布的源码构建非常简单./configure make make install开发者未打包源码autogen 先行如果是从 Git 仓库等未打包的开发者源码构建仓库中缺少自动生成的configure文件最简命令序列为./autogen.sh make make install卸载安装产物make uninstall两个关键注意事项运行autogen.sh或重新生成configure时需要安装autoconf文档man page / html只在xsltproc可用时由默认构建目标生成依赖缺失时构建只会告警warn而不会中断。configure 高级配置完整选项详解configure脚本支持大量选项用于控制启用哪些功能、安装到何处等。以下为 INSTALL.md 列出的全部核心选项非穷尽列表可通过./configure --help查看权威全集。通用与安装路径选项作用--help打印完整的选项清单--prefixinstall-root-dir设置安装根目录。例如./configure --prefix/usr/local会把文件安装到/usr/local/include、/usr/local/lib、/usr/local/man--with-install-suffixsuffix给所有安装文件名追加后缀使多个 jemalloc 版本可共存于同一安装目录。例如libjemalloc.so.0变为libjemallocsuffix.so.0版本与符号控制--with-version(major.minor.bugfix-nrev-ggid|VERSION)控制 VERSION 文件的生成。VERSION 文件是配置成功的必要条件生成顺序为① 显式指定--with-version版本串时按给定值生成② 未指定且源码位于 Git 仓库内时尝试用git describe匹配发布标签生成③ 都失败则生成占位版本0.0.0-0-g0000...。注意--with-versionVERSION会绕过前两步方便把 jemalloc 发布版嵌入其他项目的 Git 仓库。--with-manglingmap按逗号分隔的name:mangled对列表改写公开符号。例如用ld --wrap覆盖 libc 的 malloc 实现时./configure --with-manglingmalloc:__wrap_malloc,free:__wrap_free[...]注意 mangling 发生在--with-jemalloc-prefix应用之前且被 mangled 的符号在应用前缀时会被忽略。--with-jemalloc-prefixprefix给所有公开 API 加前缀。例如prefix为prefix_时malloc() -- prefix_malloc() malloc_conf -- prefix_malloc_conf /etc/malloc.conf -- /etc/prefix_malloc.conf MALLOC_CONF -- PREFIX_MALLOC_CONF这使得 jemalloc 可与系统分配器、甚至多个 jemalloc 副本共存。默认前缀为空字符串OS X 上为je_OS X 上 jemalloc 覆盖默认 malloc zone但不实际替换malloc/calloc等符号。--without-export不导出公开 API。适合构建静态库或 OS X 上使用 zone allocator 时避免导出公开 API。--with-private-namespaceprefix给库私有 API 加prefixje_前缀。共享库靠符号可见性机制天然不导出私有符号但静态库存在命名冲突风险此时需要该选项。默认前缀为空即私有符号前缀为je_。运行时配置--with-malloc-confmalloc_conf把malloc_conf内嵌为运行时选项字符串其优先级高于全局变量malloc_conf、/etc/malloc.conf符号链接和MALLOC_CONF环境变量。例如把默认 decay 时间改为 30 秒./configure --with-malloc-confdecay_ms:30000功能开关调试 / 统计 / 性能选项作用--enable-debug启用断言与校验代码性能代价显著但应用开发期非常有用--disable-stats禁用统计收集功能配合opt.stats_print选项使用--enable-prof启用堆分析与泄漏检测配合opt.prof选项。开启后按以下顺序选择第一个可用的回溯方案libunwind需--enable-prof-libunwind→ libgcc除非--disable-prof-libgcc→ gcc intrinsics除非--disable-prof-gcc--enable-prof-libunwind使用 libunwind 库做栈回溯--disable-prof-libgcc禁用 libgcc 的回溯功能--disable-prof-gcc禁用 gcc intrinsics 回溯--with-static-libunwindlibunwind.a静态链接指定libunwind.a而非-lunwind动态链接--disable-fill禁用内存 junk/zero 填充配合opt.junk、opt.zero选项--disable-zone-allocator禁用 Darwin 上的 zone allocator即 jemalloc 不再作为 OS X/iOS 的默认分配器被挂钩--enable-utrace启用基于 utrace(2) 的分配追踪可移植性差FreeBSD 有Linux 和 OS X 没有--enable-xmalloc启用 OOM 时立即终止的支持类似常见的 xmalloc 包装函数配合opt.xmalloc选项--enable-lazy-lock包装pthread_create()检测应用从单线程切换为多线程单线程阶段可避免 mutex 加解锁。除非禁用线程本地缓存否则通常对性能影响甚微--disable-cache-oblivious默认禁用无约束大分配的 cache-oblivious 对齐。若禁用所有大分配都页对齐会严重损害 CPU 缓存利用率但 cache-oblivious 布局每个大分配多耗一页极端情况下 16 KiB 大小类物理内存占用升至 20 KiB--disable-syscall禁用syscall(2)改用{open,read,write,close}(2)。用于对syscall(2)有安全限制的系统--disable-cxx禁用 C 集成即不生成new/delete运算符实现--disable-initial-exec-tls禁用 jemalloc 内部线程本地存储的 initial-exec TLS 模型在支持显式设置的平台允许程序启动后用 dlopen 动态加载 jemalloc。注意此时同一进程存在两套 malloc 实现指针混用几乎必然导致诡异的运行时崩溃--disable-libdl禁用 libdl 的使用即 lazy lock 选项所需的dlsym(3)可支持构建静态二进制平台 / 架构参数--with-lg-pagelg-page分配器页大小的以 2 为底的对数必须不小于系统页大小。默认 configure 探测宿主机页大小并使分配器页大小等于系统页大小当系统页大小在配置与运行期间可能变化如交叉编译时才需显式指定。--with-lg-hugepagelg-hugepage系统巨页大小的以 2 为底的对数。交叉编译或覆盖不支持巨页系统的默认值时有用。--with-lg-quantumlg-quantum最小分配对齐的以 2 为底的对数。jemalloc 需要满足 C11 标准成功分配返回的指针满足任何基本对齐要求类型的约束。大多数现代架构要求 16 字节对齐--with-lg-quantum4但 glibc 出于性能原因未遵循该要求。jemalloc 默认遵循 C 标准小于 quantum 的大小类除外由于 Linux 生态已习惯 glibc 的做法实践中让 jemalloc 跟随 glibc 也是安全的。指定--with-lg-quantum3时jemalloc 会额外提供非 16 字节对齐的大小类24、40、56。本仓库正是采用了这一配置见下文源码集成章节。--with-lg-vaddrlg-vaddr有效虚拟地址位数。默认在已知平台自动探测否则取默认值。交叉编译时可能有用。--with-xslrootpath构建文档时指定 DocBook XSL 样式表位置。影响 configure 行为的环境变量以下环境变量非穷尽列表会改变 configure 行为变量说明CFLAGS?/CXXFLAGS?传给 C/C 编译器的标志。configure 脚本设置的标志会前置因此显式设置的标志通常优先。慎用-Werror可能意外破坏 configure 测试EXTRA_CFLAGS?/EXTRA_CXXFLAGS?追加到 CFLAGS/CXXFLAGS 的标志但配置阶段不传给编译器。可在让 configure 自主决定合适标志的同时追加-Werror等CPPFLAGS?传给 C 预处理器的标志。configure 查找头文件时不经过 CFLAGS因此需用 CPPFLAGS 帮助 configure 找到头文件LD_LIBRARY_PATH?ld查找库的冒号分隔列表LDFLAGS?链接时传递的标志PATH?configure 查找程序使用的路径配置结果与现实的偏差修复某些情况下需要绕过与实际情况不符的配置结果。例如 Linux 4.5 为madvise(2)新增了 MADV_FREE 标志若在支持 MADV_FREE 的宿主机上构建、部署到不支持的目标机就会出问题。可用缓存文件覆盖 configure.ac 中定义的配置变量echo je_cv_madv_freeno config.cache ./configure -C高级编译按需构建目标只构建 jemalloc 的部分产物使用以下 make 目标build_lib_shared # 仅共享库 build_lib_static # 仅静态库 build_lib # 共享库 静态库 build_doc_html # 仅 HTML 文档 build_doc_man # 仅 man 文档 build_doc # HTML man 文档清理目标make clean # 清理编译产物 make distclean # 连同 configure 结果一并清理 make relclean # 更彻底的清理高级安装make 变量覆盖调用 make 时可定义如下变量非穷尽列表变量作用INCLUDEDIR?头文件的安装前缀LIBDIR?库文件的安装前缀MANDIR?man 页的安装前缀DESTDIR?前置到 INCLUDEDIR、LIBDIR、DATADIR、MANDIR 之前用于安装到与--prefix不同的路径如打包场景CC?指定 C 编译器CFLAGS?传给编译器的标志CPPFLAGS?传给 C 预处理器的标志LDFLAGS?链接时传递的标志PATH?配置与构建期间查找程序的路径部分安装目标install_bin # 仅二进制 install_include # 仅头文件 install_lib_shared # 仅共享库 install_lib_static # 仅静态库 install_lib_pc # 仅 pkg-config 文件jemalloc.pc install_lib # 全部库 install_doc_html / install_doc_man / install_doc开发模式autogen 与独立对象目录要对 jemalloc 做非平凡修改请用autogen.sh而非configure它会重新生成configure、启用配置依赖规则并允许重新生成自动生成的源文件。构建系统支持与源码树分离的对象目录。例如autoconf mkdir obj cd obj ../configure --enable-autogen make文档构建与查看man 页同时生成 html 与 roff 两种格式任意浏览器均可查看 html 版roff 版可在安装前用以下命令排版nroff -man -t doc/jemalloc.3源码级佐证placeholderkv 如何集成 jemallocINSTALL.md 讲的是如何构建 jemalloc而本仓库恰好是这些配置的活教材——placeholderkv 在构建时以默认内存分配器身份引入 jemalloc其集成方式与上文各选项一一对应。1. 构建集成configure 参数全落在文档对应选项上deps/jemalloc/CMakeLists.txt 通过sh -c调用configure构建 jemalloc${JEMALLOC_SRC_DIR}/configure --disable-cxx \ --with-version5.3.0-0-g0 --with-lg-quantum3 --disable-cache-oblivious --with-jemalloc-prefixje_ \ --enable-static --disable-shared --prefix${JEMALLOC_INSTALL_DIR}可以看到 INSTALL.md 中的选项在此被实际使用--disable-cxx禁用 Cnew/delete集成本项目是纯 C 服务端--with-version5.3.0-0-g0与本仓库 deps/jemalloc/VERSION 内容一致属于 INSTALL.md 中--with-version第一种形式显式指定版本串--with-lg-quantum3即文档中提到的跟随 glibc 的非 16 字节对齐大小类提供 24、40、56 等更细粒度的小类减少内部碎片--with-jemalloc-prefixje_全部公开 API 统一加je_前缀与系统分配器共存而不冲突--enable-static --disable-shared只产出静态库libjemalloc.a对应构建目标build_lib_static、安装目标install_lib。构建成功后该 CMake 文件把libjemalloc.a作为IMPORTED静态目标导入供整个服务器链接。2. 默认分配器判定UNIX 平台默认 jemalloccmake/Modules/ValkeySetup.cmake 中BUILD_MALLOC未显式指定时Apple 平台默认libc其余 UNIX 平台默认jemalloc同时支持libc、tcmalloc、tcmalloc_minimal作为备选。当选择 jemalloc 时会为服务器源码追加-DUSE_JEMALLOC编译宏。3. 符号映射malloc → je_mallocsrc/zmalloc.c 在USE_JEMALLOC宏下完成符号替换#elif defined(USE_JEMALLOC) #define malloc(size) je_malloc(size) #define calloc(count, size) je_calloc(count, size) #define realloc(ptr, size) je_realloc(ptr, size) #define free(ptr) je_free(ptr) #endif这正是--with-jemalloc-prefixje_在运行时端的对应物。得益于该前缀zlibc_free()src/zmalloc.c仍可调用原始 libcfree释放backtrace_symbols()等 libc 分配的指针两套分配器在同一进程内互不干扰——与 INSTALL.md 中--with-jemalloc-prefix的设计意图完全吻合。4. 能力利用jemalloc 特有 APIsrc/zmalloc.hzmalloc_size(p)直接映射到je_malloc_usable_size(p)利用 jemalloc 能廉价取得真实分配大小HAVE_MALLOC_SIZE的特性无需在指针前写前缀头即可精确统计内存占用这也是 src/zmalloc.c 中PREFIX_SIZE在支持HAVE_MALLOC_SIZE时取 0 的原因src/allocator_defrag.c直接调用je_mallocx(size, MALLOCX_TCACHE_NONE)分配用于碎片整理的临时缓冲绕开线程本地缓存src/object.c调用je_malloc_stats_print()把 jemalloc 的分配统计输出为字符串供INFO/MEMORY相关命令呈现内部堆状态。可见placeholderkv 不仅用了 jemalloc还深度消费了它的统计、可用大小查询、扩展分配等能力而这些能力的开关与行为都可以回到 INSTALL.md 讲解的 configure 选项--disable-stats、--with-malloc-conf、--enable-prof等和运行时MALLOC_CONF中按需调整。结语从三行命令的快速构建到 30 余个 configure 选项与 9 类环境变量、多级 make 目标与安装变量再到autogen.sh开发模式与分离对象目录INSTALL.md 覆盖了 jemalloc 从能用到按需裁剪的全部路径。而在 placeholderkv 仓库中--with-lg-quantum3、--with-jemalloc-prefixje_、--enable-static --disable-shared等参数被原样落地见 deps/jemalloc/CMakeLists.txtje_前缀与 src/zmalloc.c 的符号映射、je_malloc_usable_size、je_malloc_stats_print的调用形成了完整的证据链。理解这份构建文档也就同时理解了 placeholderkv 内存子系统的基础设施。【免费下载链接】placeholderkvA flexible distributed key-value database that is optimized for caching and other realtime workloads.项目地址: https://gitcode.com/GitHub_Trending/pl/placeholderkv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表