本文主要是介绍用LD_PRELOAD加载jemalloc,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在使用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是否被成功加载。可以用 lsof
或 pmap
$ 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
这篇关于用LD_PRELOAD加载jemalloc的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!