用LD_PRELOAD加载jemalloc

21 篇文章 1 订阅
16 篇文章 2 订阅

在使用CentOS 7.6,用LD_PRELOAD方法测试了一下jemalloc 和 glibc自带的malloc的性能,发现的确更好。

为何没有测试 tcmalloc?因为从网上查了一下,tcmalloc 和 jemalloc的对比 (原文) :

  • 作为基础库的ptmalloc是最为稳定的内存管理器,无论在什么环境下都能适应,但是分配效率相对较低。
  • tcmalloc针对多核情况有所优化,性能有所提高,但是内存占用稍高,大内存分配容易出现CPU飙升。
  • jemalloc的内存占用更高,但是在多核多线程下的表现也最为优异。

测试使用的方法如下:

$ LD_PRELOAD=./libjemalloc.so.2 ./my_app

在上线使用时,因为我们的程序是用pyhton脚本启动。之前的启动方式为:

pipe = subprocess.Popen(["./my_app", path], stdin=subprocess.PIPE, stdout=output, shell=False)

现在需要在子进程的环境变量中添加 LD_PRELOAD , 因此修改为:

env_dict = os.environ.copy()
env_dict['LD_PRELOAD'] = './libjemalloc.so.2'
pipe = subprocess.Popen(["./my_app", path], stdin=subprocess.PIPE, stdout=output, shell=False, env=env_dict)

在脚本运行后,我们需要查看一下jemalloc是否被成功加载。可以用 lsofpmap

$ lsof <pid>
$ pmap <pid>

下面是查看我的程序加载jemalloc后的情况:

$ ps -ef | grep my_app
$ pmap 10095
...
00007f6c0b4c5000     92K r-x-- libpthread-2.17.so
00007f6c0b4dc000   2044K ----- libpthread-2.17.so
00007f6c0b6db000      4K r---- libpthread-2.17.so
00007f6c0b6dc000      4K rw--- libpthread-2.17.so
00007f6c0b6dd000     16K rw---   [ anon ]
00007f6c0b6e1000    660K r-x-- libzmq.so
00007f6c0b786000   2048K ----- libzmq.so
00007f6c0b986000     24K r---- libzmq.so
00007f6c0b98c000      8K rw--- libzmq.so
00007f6c0b98e000   1680K r-x-- libEI6.so
00007f6c0bb32000   2044K ----- libEI6.so
00007f6c0bd31000     12K r---- libEI6.so
00007f6c0bd34000     24K rw--- libEI6.so
00007f6c0bd3a000    468K r-x-- libjemalloc.so.2
00007f6c0bdaf000   2048K ----- libjemalloc.so.2
00007f6c0bfaf000     20K r---- libjemalloc.so.2
00007f6c0bfb4000      4K rw--- libjemalloc.so.2
00007f6c0bfb5000   2124K rw---   [ anon ]
00007f6c0c1c8000    136K r-x-- ld-2.17.so
...

好,jemalloc已经成功加载。

延伸阅读:
在运行前,可以使用 ldd <program_name> 命令来查看程序所依赖的动态库。
可以使用 ldd -r <program name> 可以像Windows下的 depends.exe 一样查看是否有未定义的符号。

延伸阅读2:
如果要在编译时连接jemalloc,除了指定链接库的目录和名称之外,还需要为gcc 指定如下编译参数:
-fno-builtin-malloc
-fno-builtin-calloc
-fno-builtin-realloc
-fno-builtin-free

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值