链接到tcmalloc与否有什么区别

时间:2018-03-27 02:35:51

标签: linker uwsgi tcmalloc

这是一个联系问题而不是uwsgi问题。但我会解释这个故事。

我正在使用uwsgi来托管我的烧瓶应用程序。在生产运行几周后,我发现我的应用程序有一些轻微的内存泄漏; uswgitop报告的RSS大小正在增加。 虽然这只是一个不大的问题,因为它只有50MiB到60MiB左右,但我想知道它为什么会增加。

经过一些工作,我发现它可能是由于libc中malloc实现的内存碎片造成的。

所以我正在考虑使用以内存碎片管理而闻名的tcmalloc或jemalloc。

然后我来自己建立uwsgi。它产生了以下链接命令。

x86_64-linux-gnu-gcc -pthread -o uwsgi -L/usr/lib -Wl,-rpath,/usr/lib .......tons of object files 
-lpthread -lm -rdynamic -ldl -lz -ltcmalloc
-L/home/alex/local/lib -lpcre -lssl -lcrypto -lxml2 -lpthread -ldl -lutil -lm -lpython2.7 -lcrypt

从命令中可以看出,它明确地链接了tcmalloc,这是一个动态链接而不是静态链接。 据我所知,tcmalloc实现了标准的posix malloc接口,这也是我们可以使用LD_PRELOAD挂钩到一个应用程序来替换它的malloc实现的原因。

我的问题是:

为什么我们需要在使用LD_PRELOAD时明确指定链接tcmalloc?

1 个答案:

答案 0 :(得分:0)

如果您只对标准API感兴趣,则没有区别。

但是tcmalloc还有更多,比如堆检查,堆分析,分配函数钩子等。使用它的自然方式是与libtcmalloc链接。