2016-02-26 163 views
9

减少内存碎片我一直在试用MALLOC_MMAP_THRESHOLD_和MALLOC_MMAP_MAX_ env变量来影响长时间运行的Python 2进程中的内存管理。 见http://man7.org/linux/man-pages/man3/mallopt.3.html使用MALLOC_MMAP_THRESHOLD_和MALLOC_MMR_HOLD_和MALLOC_MMAP_MAX_

我的想法从这个错误报告: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%。

+0

解决此问题的一种方法是执行分支进程中的工作,然后退出。 – o9000

+0

@ o9000我不能那样做,因为有问题的进程是长期运行的。这是一个服务器,应该在那里很长一段时间。 – lbolla

+0

@Iolla你甚至可以在服务器的情况下做到这一点。从服务器进程分叉,运行内存分配操作,从分叉进程返回到服务器进程,终止分叉进程,并将结果返回给请求它的客户端。现在,这并不意味着你已经解决了这个问题。也许输入和输出非常大,无论如何都需要在服务器上分配大量内存。 YMMV,但你可以做到。 – marr75

回答

3

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