这是一个联系问题而不是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?
答案 0 :(得分:0)
如果您只对标准API感兴趣,则没有区别。
但是tcmalloc还有更多,比如堆检查,堆分析,分配函数钩子等。使用它的自然方式是与libtcmalloc链接。