使用MALLOC_MMAP_THRESHOLD_和MALLOC_MMAP_MAX_减少内存碎片

时间:2016-02-26 20:14:33

标签: python malloc mmap

我一直在尝试使用MALLOC_MMAP_THRESHOLD_和MALLOC_MMAP_MAX_ env变量来影响长时间运行的Python 2进程中的内存管理。 见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%。

2 个答案:

答案 0 :(得分:3)

现在正在进行这项调整很长一段时间,没有问题。 因此,在某些情况下,我认为在长时间运行的Python进程中提高内存使用率是可行的选择。

答案 1 :(得分:1)

我也在使用:

MALLOC_MMAP_THRESHOLD_=8192

MALLOC_ARENA_MAX=4

到目前为止,效果很好!