2

我正在以 4 种不同的方式编译 Redis 3.0.6:

  1. 杰马洛克
  2. libc malloc
  3. asan + jemalloc ( -fsanitize=address -fno-omit-frame-pointer)
  4. asan + libc malloc

然后我redis-bench在所有这些二进制文件下运行标准。我不明白的是,场景3的性能非常接近场景1

有人可以向我解释这怎么可能?我在 asan 手册上没有找到任何不支持 jemalloc 或相关内容的内容。

4

1 回答 1

1

您没有提供确切的复制案例,但我的猜测是您

  • 使用 GCC
  • 使用 LD_PRELOAD 链接到 jemalloc

在这种情况下,jemalloc 的分配器将覆盖 ASan 的拦截器,并且不会检查堆分配(这将解释您的运行速度不会减慢)。相反,您应该将可执行文件与 jemalloc 静态链接:

LDFLAGS += -ljemalloc

我认为理想情况下,当 ASan 未能拦截堆分配器时,它应该报告一个有用的警告,因此您可能想在他们的 github 上提交一个错误。

于 2016-10-24T09:19:27.150 回答