这是一个链接问题而不是 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
hook 到一个应用程序来替换它的 malloc 实现。
我的问题是:
为什么我们需要明确指定链接到 tcmalloc 时,我们可以使用LD_PRELOAD
这样做?