尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Fluent Bit 内置 jemalloc 5.3.0 构建与安装完全指南:configure 选项、Make 目标与 CMake 集成详解

Fluent Bit 内置 jemalloc 5.3.0 构建与安装完全指南:configure 选项、Make 目标与 CMake 集成详解 Fluent Bit 内置 jemalloc 5.3.0 构建与安装完全指南configure 选项、Make 目标与 CMake 集成详解【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit本篇以 Fluent Bit 仓库中随附的 jemalloc 5.3.0 官方安装文档 INSTALL.md 为主体系统讲解从打包发行版到开发者源码的完整构建安装流程、configure的全部高级选项、影响构建的环境变量与缓存覆盖技巧以及分模块编译/安装目标并结合 Fluent Bit 的 CMakeLists.txt 展示该项目如何把这套构建系统整合进自己的 CMake 工程帮助读者既能独立构建 jemalloc也能理解 Fluent Bit 静态链接 jemalloc 的底层机制。一、打包发行版的快速构建与安装在 jemalloc 源码树根目录下构建并安装一个打包好的发行版packaged release只需要三步./configure make make install如果是从非打包的开发者源码unpacked developer sources构建最简可行的命令序列是./autogen.sh make make install对应仓库中这两个入口脚本均实际存在autogen.sh 与 configure。要卸载已安装的构建产物同样通过 make 完成make uninstall原文档附带的两条前置依赖提示必须已安装autoconf重新生成configure时需要默认目标仅在系统存在xsltproc时才会构建文档缺少该依赖时构建过程只会告警而不会中断。二、高级配置configure 支持的完整选项configure脚本支持大量选项用于控制功能开关、安装位置等。以下选项清单完整继承自 INSTALL.md并保留各选项的官方说明原文声明该清单not a definitive list非穷尽列表。2.1 基础与安装位置--help打印完整的选项列表definitive list。--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-rpathcolon-separated-rpath内嵌一个或多个库搜索路径使 libjemalloc 能找到它链接的库。仅在 ELF 系系统上有效。2.2 版本号控制--with-version(major.minor.bugfix-nrev-ggid|VERSION)VERSION 文件是配置成功的硬性前提其生成遵循以下三步策略若指定了--with-versionmajor.minor.bugfix-nrev-ggid形式则用该值生成 VERSION若两种形式都未指定且源码目录位于 git 仓库内则尝试通过模式匹配 release tag 的git describe调用生成 VERSION若 VERSION 仍缺失则生成一个占位版本号0.0.0-0-g0000000000000000000000000000000000000000。注意--with-versionVERSION直接采用给定值会绕过步骤 (1) 和 (2)。这一特性简化了把 jemalloc 发行版嵌入另一个项目的 git 仓库时的版本配置工作——Fluent Bit 将 jemalloc-5.3.0 完整内嵌在 lib/jemalloc-5.3.0/ 目录下正是这种嵌入式集成场景。2.3 符号命名与 API 前缀--with-manglingmap按照map逗号分隔的name:mangled对列表重命名公开符号。例如配合链接器ld的--wrap机制替代性地覆盖 libc 的 malloc 实现--with-manglingmalloc:__wrap_malloc,free:__wrap_free[...]注意mangling 发生在--with-jemalloc-prefix指定的前缀应用之前且被 mangle 过的符号在应用前缀时会被忽略。--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_前缀。共享库依靠符号可见性机制避免导出这些符号静态库则存在命名冲突的真实风险。默认prefix为空即符号前缀为je_。2.4 运行时行为--with-malloc-confmalloc_conf把malloc_conf作为运行时选项字符串内嵌其处理优先级高于malloc_conf全局变量、/etc/malloc.conf符号链接以及MALLOC_CONF环境变量。例如把默认 decay 时间改为 30 秒--with-malloc-confdecay_ms:30000--enable-debug启用断言与校验代码。会带来可观的性能开销但在应用开发阶段非常有用。--disable-stats关闭统计收集功能用法详见opt.stats_print选项文档。--disable-fill禁用内存 junk/zero 填充支持详见opt.junk与opt.zero选项文档。--enable-xmalloc支持内存不足时立即终止的可选行为等价于常见xmalloc包装函数的语义详见opt.xmalloc选项文档。--disable-cache-oblivious默认禁用 cache-oblivious 的大块分配对齐针对无对齐约束的大分配请求。禁用后所有大分配会因实现细节而退化为页对齐可能严重损害 CPU 缓存利用率但 cache-oblivious 布局的代价是每个大分配多占一页——极端情况下 16 KiB 尺寸类的物理内存占用会升至 20 KiB。2.5 堆栈回溯与堆剖析prof--enable-prof启用堆剖析heap profiling与泄漏检测详见opt.prof选项文档。启用后存在多种回溯backtracing实现configure 脚本会按以下顺序选择第一个探测到可正常工作的实现libunwind需额外加--enable-prof-libunwindlibgcc除非显式--disable-prof-libgccgcc intrinsics除非显式--disable-prof-gcc。--enable-prof-libunwind使用 libunwind 库做堆栈回溯。--disable-prof-libgcc禁用 libgcc 的回溯功能。--disable-prof-gcc禁用 gcc intrinsics 的回溯功能。--with-static-libunwindlibunwind.a静态链接指定的 libunwind.a而不是动态链接-lunwind。2.6 平台与可移植性相关--disable-zone-allocator在 Darwin 上禁用 zone allocator意味着在 OSX/iOS 上 jemalloc 不会被挂接为默认分配器。--enable-utrace启用基于 utrace(2) 的分配跟踪。该特性可移植性有限FreeBSD 有Linux 与 OS X 没有。--disable-syscall禁用syscall(2)改用{open,read,write,close}(2)。针对对syscall(2)施加安全限制的系统。--enable-lazy-lock启用包装pthread_create()的代码用于检测应用从单线程切换到多线程的时刻从而在单线程模式下避免 mutex 加锁/解锁。实践中除非禁用 thread-specific caching该特性对性能影响通常很小。--disable-libdl禁用 libdl即dlsym(3)这是 lazy-lock 选项所必需的可用于构建静态二进制。2.7 页面尺寸与对齐交叉编译关键项--with-lg-pagelg-page指定分配器页大小的以 2 为底的对数值且不得小于系统页大小。默认情况下 configure 会自动探测宿主页大小并令分配器页大小等于系统页大小只有当系统页大小在配置时与运行时可能不一致如交叉编译才需要显式指定。--with-lg-hugepagelg-hugepage指定系统大页huge page大小的以 2 为底的对数值交叉编译或在未显式支持大页的系统上覆盖默认值时很有用。--with-lg-quantumlg-quantum指定最小分配对齐度的以 2 为底的对数值。jemalloc 必须知道满足 C 标准基线对齐要求的最小对齐引自 C11 草案 2011-04-12 版本若分配成功返回的指针应当适当对齐使其可被赋给任意基本对齐要求类型的对象指针并用于访问该对象或此类对象在已分配空间中的数组。该设置是体系结构相关的。jemalloc 内置了主流现代架构的已知安全值但 glibc 存在一个坑多数现代架构要求 16 字节对齐即lg-quantum4而 glibc 开发者出于性能考虑选择不满足该要求。与 glibc 不同jemalloc 默认遵循 C 标准注意对小于 quantum 的尺寸类jemalloc 实际上钻了空子但由于 Linux 系统已经规避了该分配器不合规的影响实践中让 jemalloc 的最小对齐跟随 glibc 通常是安全的。配置时若指定--with-lg-quantum3jemalloc 会提供额外几个不做 16 字节对齐的尺寸类24、40、56。这一选项正是 Fluent Bit 默认采用的设置见第八节。--with-lg-vaddrlg-vaddr指定虚拟地址位的有效位数。configure 会在已知如何探测的平台上自动探测否则选取默认值交叉编译时此选项有用。2.8 其他--disable-cxx禁用 C 集成即不生成new/delete操作符实现。--with-xslrootpath指定构建文档时查找 DocBook XSL 样式表的路径。--disable-initial-exec-tls在支持显式设置的平台上禁用 jemalloc 内部 thread-local storage 的 initial-exec TLS 模型。这允许在程序启动后再动态加载 jemalloc例如通过 dlopen但此时进程内将同时存在两个 malloc 实现指针若在一个实现中分配、另一个实现中释放几乎必然导致难以理解的运行时崩溃。三、影响 configure 行为的环境变量与配置缓存覆盖3.1 环境变量清单以下环境变量非穷尽列表会影响 configure 的行为变量作用CFLAGS?/CXXFLAGS?传给 C/C 编译器的标志。configure 脚本设置的标志会被前置因此显式设置的标志一般优先生效。注意-Werror之类的标志可能以不希望的方式影响 configure 的探测测试。EXTRA_CFLAGS?/EXTRA_CXXFLAGS?追加到 CFLAGS/CXXFLAGS 末尾但不会在配置阶段的编译器调用中传递。这样即可在让 configure 自行决定合适的其他标志的前提下加入-Werror之类标志。CPPFLAGS?传给 C 预处理器。注意 configure 查找头文件时不会把 CFLAGS 传给cpp因此需要帮 configure 定位头文件时必须用 CPPFLAGS。LD_LIBRARY_PATH?ld用这个冒号分隔列表查找库。LDFLAGS?链接时传递的标志。PATH?configure 通过它查找各类程序。3.2 用配置缓存覆盖探测结果某些情况下探测结果与真实目标环境不符需要人工纠正。官方给出的典型例子Linux 4.5 内核为madvise(2)新增了MADV_FREE标志若在支持 MADV_FREE 的宿主机上构建、部署到不支持的目标机会出问题。解决办法是借助 cache 文件覆盖 configure.ac 中定义的相关配置变量例如echo je_cv_madv_freeno config.cache ./configure -C这一技巧对交叉编译、容器内构建宿主机部署等场景尤其实用。四、高级编译分模块构建与安装目标只构建 jemalloc 的一部分可使用以下 make 目标build_lib_shared build_lib_static build_lib build_doc_html build_doc_man build_doc只安装 jemalloc 的一部分可使用以下 make 目标install_bin install_include install_lib_shared install_lib_static install_lib_pc install_lib install_doc_html install_doc_man install_doc按不同深度清理构建产物可使用clean distclean relclean注意区分build_*与install_*的语义差异前者只在本地产物中生成后者才写入--prefix指定的安装树。五、高级安装make 时直接覆盖安装变量调用make时可通过定义 make 变量含但不限于来定制安装INCLUDEDIR?头文件的安装前缀LIBDIR?库文件的安装前缀MANDIR?man 页面的安装前缀;DESTDIR?会前置拼接到 INCLUDEDIR、LIBDIR、DATADIR、MANDIR 之前。适用于安装到与--prefix不同的路径典型场景是打包进 chroot/暂存目录CC?指定用于调用的 C 编译器CFLAGS?传给编译器的标志CPPFLAGS?传给 C 预处理器的标志LDFLAGS?链接时传递的标志PATH?配置与构建阶段查找程序的搜索路径。六、开发者模式autogen.sh 与独立对象目录如果对 jemalloc 做非平凡non-trivial的修改应使用 autogen.sh 而不是直接跑configure。它会重新生成configure、启用配置依赖规则并启用自动生成源文件的再生产能力。构建系统支持对象目录与源码树分离VPATH build官方示例是创建一个obj目录并在其中执行配置与构建autoconf mkdir obj cd obj ../configure --enable-autogen make七、文档生成HTML 与 roff 两种格式手册页会同时以 html 和 roff 两种格式生成任何浏览器都可以查看 html 版手册roff 手册页在安装之前可以先格式化预览nroff -man -t doc/jemalloc.3对应的源文档位于 doc/ 目录与第二节中缺 xsltproc 只告警不中断、--with-xslroot选项的说明相互呼应。八、实战参照Fluent Bit 如何驱动这套构建系统Fluent Bit 把 jemalloc 作为可选的内存分配器集成进主工程其构建逻辑位于根目录 CMakeLists.txt 的 Memory Allocator 段恰好演示了上文多个文档选项在真实项目中的落地方式系统库优先选项当开启FLB_PREFER_SYSTEM_LIB_JEMALLOC时CMake 通过 pkg-config 探测系统库jemalloc5.0.0若找到JEMALLOC_FOUND则直接使用系统版本跳过本地构建。源码级内嵌构建找不到系统库时用 CMake 的ExternalProject_Add直接驱动本文档描述的 autoconf 流程源码目录即 lib/jemalloc-5.3.0核心命令对应关系为CONFIGURE_COMMAND执行${CMAKE_CURRENT_SOURCE_DIR}/lib/jemalloc-5.3.0/configure附加${FLB_JEMALLOC_OPTIONS_LIST}与--prefixINSTALL_DIR—— 对应第二节--prefix选项未显式指定FLB_JEMALLOC_OPTIONS时默认值为--with-lg-quantum3—— 正是第二节 2.7 中讲解的允许 24/40/56 字节等非 16 字节对齐尺寸类、跟随 glibc 对齐习惯的选项编译标志固定为CFLAGS-stdgnu99 -Wall -pipe -g3 -O3 -funroll-loops对应第三节环境变量机制INSTALL_COMMAND只执行make install_lib_static install_include—— 即第四节列出的分模块安装目标只安装静态库与头文件不安装共享库、man 页和文档。符号重命名该分支同时定义了JEMALLOC_MANGLE宏与第二节--with-mangling/--with-jemalloc-prefix所述机制配套让 jemalloc 在 Fluent Bit 进程内以改名的符号替换 libc 的 malloc/free而不与系统分配器符号冲突。产物消费静态库产物路径为${CMAKE_CURRENT_BINARY_DIR}/lib/libjemalloc_pic.a被声明为导入的静态库目标libjemalloc此外在 wasm 插件构建中见 src/wasm/CMakeLists.txtlibjemalloc同样作为依赖被链接。从源码结构看Fluent Bit 对 jemalloc 的使用策略是Linux 上可选开启、默认静态链接、最小化安装仅静态库头文件、符号重命名以接管 malloc这套做法恰好覆盖了本文档中--with-lg-quantum、--prefix、分模块安装目标与 mangling 四个知识点的组合应用。九、构建流程自检清单综合原文档与 Fluent Bit 集成实践一次完整的 jemalloc 构建可按下列清单核验确认已安装autoconf若需 HTML 文档确认有xsltproc缺失只告警不失败打包发行版用./configure make make install开发者修改源码改用./autogen.sh重新生成交叉编译场景重点核对--with-lg-page、--with-lg-hugepage、--with-lg-vaddr、--with-lg-quantum四个对数参数必要时用 config.cache ./configure -C覆盖探测结果需要与系统分配器共存或多份并存时用--with-jemalloc-prefix/--with-mangling做符号隔离打包/嵌入式集成如 Fluent Bit建议复用--prefixmake install_lib_static install_include的组合并以make uninstall或make clean/distclean/relclean管理产物需要剖析/泄漏检测时启用--enable-prof并按 libunwind → libgcc → gcc intrinsics 的顺序确认回溯后端可用。【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表