2025年5月25日,周日上午
c
int32_t taosMemoryDbgInit() {
#if defined(LINUX) && !defined(_ALPINE) && !defined(TD_ASTRA)
int ret = mallopt(M_MMAP_THRESHOLD, 0);
if (0 == ret) {
return TAOS_SYSTEM_ERROR(ERRNO);
}
return 0;
#else
return TSDB_CODE_FAILED;
#endif
}
这段代码是TDengine数据库的内存调试初始化函数,主要用于在Linux环境下(非Alpine Linux和TD_ASTRA系统)通过mallopt调整内存分配策略。Alpine Linux使用musl库而非glibc,可能不支持此配置。
核心功能解析
c
mallopt(M_MMAP_THRESHOLD, 0)
作用:将mmap分配内存的阈值设为0,强制所有内存分配使用brk/sbrk而非mmap。
目的:用于追踪内存泄漏(结合Valgrind等工具时需统一分配方式)。
拓展:除了用于调试内存泄漏外,禁用mmap还能避免频繁的mmap系统调用(默认阈值128KB),减少系统调用开销,提升小内存分配的效率,但可能增加内存碎片,适合频繁分配小内存的场景。。
返回值处理
若mallopt失败,通过TAOS_SYSTEM_ERROR(ERRNO)返回系统错误码。mallopt成功则返回0。
非Linux环境直接返回TSDB_CODE_FAILED。