2016-02-26 2 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_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 используется около 20% меньше, чем ванильным Python для этого примера.

+0

Один из способов обойти это - выполнить работу в раздвоенном процессе, который затем выходит. – o9000

+0

@ o9000 Я не могу этого сделать, потому что этот процесс длится долго. Это сервер, который должен быть там в течение долгого времени. – lbolla

+0

@ Иболла вы можете сделать это даже в случае сервера. Вилка из процесса сервера, операция выделения памяти памяти, возврат из процесса разветвленного процесса в сервер, завершение разветвленного процесса, возврат результата клиенту, который его запросил. Теперь это не всегда означает, что вы решили проблему. Возможно, вход и выход настолько велики, что в любом случае потребуются огромные выделения памяти на сервере. YMMV, но вы можете это сделать. – marr75

ответ

3

Будучи в производстве с этой настройкой в ​​течение длительного времени, без проблем. Итак, я думаю, что это эффективный вариант для улучшения использования памяти в длительных процессах Python, в некоторых случаях.

Смежные вопросы