我一直在试验使用MALLOC_MMAP_THRESHOLD_和MALLOC_MMAP_MAX_ENV变量来影响长期运行的Python2进程中的内存管理。 请参见http://man7.org/linux/man-pages/man3/mallopt.3.html
我是从这个错误报告中得到这个想法的:http://bugs.python.org/issue11849
我得到的结果是令人鼓舞的:内存碎片减少了,长时间运行的进程使用的内存中可见的典型高水位线更低。
我唯一担心的是,在使用如此低级别的调整时,是否有其他副作用可能会产生反作用。有没有人有使用它们的经验?
下面是一个示例脚本,它在生成大型字典的脚本中显示这些变量如何影响RSS内存: https://gist.github.com/lbolla/8e2640133032b0a6bb9c 只需运行"alloc.sh"并比较输出。以下是我的输出:MALLOC_MMAP_THRESHOLD_=None MALLOC_MMAP_MAX_=None
N=9 RSS=120968
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=None
N=9 RSS=157008
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=None
N=9 RSS=98484
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=None
N=9 RSS=98484
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=None
N=9 RSS=98496
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=None
N=9 RSS=98528
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=0
N=9 RSS=121008
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=0
N=9 RSS=121008
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=0
N=9 RSS=121012
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=0
N=9 RSS=121000
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=0
N=9 RSS=121008
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=16777216
N=9 RSS=157004
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=16777216
N=9 RSS=98484
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=16777216
N=9 RSS=98484
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=16777216
N=9 RSS=98496
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=16777216
N=9 RSS=98528
如您所见,在本例中使用的RSS比普通Python少20%左右。
使用此调整已经投入生产很长时间了,没有任何问题。 因此,在某些情况下,我认为在长时间运行的Python进程中提高内存使用率是一个可行的选择。
这篇关于使用MALLOC_MMAP_THRESHOLD_和MALLOC_MMAP_MAX_减少内存碎片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!