0

这是一个链接问题而不是 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_PRELOADhook 到一个应用程序来替换它的 malloc 实现。

我的问题是:

为什么我们需要明确指定链接到 tcmalloc 时,我们可以使用LD_PRELOAD这样做?

4

1 回答 1

0

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

但是 tcmalloc 不止这些,比如堆检查、堆分析、分配函数挂钩等。使用它的自然方式是与 libtcmalloc 链接。

于 2018-03-27T11:54:45.510 回答