Como reduzir o consumo de memória?

2

Estou usando o aipo 2.5.1 com django em uma instância micro ec2 com 613mb de memória e, como tal, tenho que manter o consumo de memória baixo.

Atualmente estou usando apenas para o agendador "celery beat" como uma interface web para o cron, embora eu espere usá-lo para mais no futuro. Eu notei que é o maior consumidor de memória na minha micro máquina, embora eu tenha configurado o número de trabalhadores para um. Eu não tenho muitas outras opções definidas em settings.py:

import djcelery
djcelery.setup_loader()
BROKER_BACKEND = 'djkombu.transport.DatabaseTransport'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_RESULT_BACKEND = 'database'

BROKER_POOL_LIMIT = 2
CELERYD_CONCURRENCY = 1
CELERY_DISABLE_RATE_LIMITS = True
CELERYD_MAX_TASKS_PER_CHILD = 20
CELERYD_SOFT_TASK_TIME_LIMIT = 5 * 60
CELERYD_TASK_TIME_LIMIT = 6 * 60

Veja os detalhes no topo:

 PID USER  NI CPU%  VIRT   SHR  RES  MEM% Command 
1065 wuser 10  0.0  283M  4548  85m  14.3 python manage_prod.py celeryd --beat
1025 wuser 10  1.0  577M  6368  67m  11.2 python manage_prod.py celeryd --beat
1071 wuser 10  0.0  578M  2384  62m  10.6 python manage_prod.py celeryd --beat

Isso é cerca de 214mb de memória (e não muito compartilhada) para executar um cron job ocasionalmente. Eu fiz alguma coisa errada, ou isso pode ser reduzido em cerca de dez vezes de alguma forma? ;)

Atualizar : aqui está minha configuração inicial:

description "Celery Daemon"

start on (net-device-up and local-filesystems)
stop on runlevel [016]
nice 10
respawn
respawn limit 5 10
chdir /home/wuser/wuser/
env CELERYD_OPTS=--concurrency=1

exec sudo -u wuser -H /usr/bin/python manage_prod.py celeryd --beat --concurrency=1 --loglevel info --logfile /var/tmp/celeryd.log

Atualização 2 :

Noto que há um processo raiz, um processo filho do usuário e dois netos dele. Então, acho que não é uma questão de inicialização duplicada.

root  34580  1556 sudo -u wuser -H /usr/bin/python manage_prod.py celeryd 
wuser  577M 67548 └─ python manage_prod.py celeryd --beat --concurrency=1 
wuser  578M 63784    ├─  python manage_prod.py celeryd --beat --concurrency=1
wuser  271M 76260    └─  python manage_prod.py celeryd --beat --concurrency=1
    
por Gringo Suave 07.04.2012 / 00:18

2 respostas

4

Você pode garantir que o aipo esteja incluindo apenas o mínimo do seu código (já vi o aipo configurado para importar aplicativos da Web inteiros ... não é bonito). No entanto, no final do dia, você está olhando para um pedaço muito grande de Python, que vai absorver muita memória por sua natureza.

Se você quiser uma ferramenta de agendamento de tarefas com pouca memória, sugiro um cron verdadeiro e honesto.

    
por 07.04.2012 / 01:45
0

Um colega compartilhou um truque alguns anos depois de fazer essa pergunta.

Basicamente, você considera a tarefa do aplicativo em um script separado e faz com que o aipo o execute por meio de um subprocesso. Dessa forma, ele pode recuperar toda a memória do aplicativo regularmente, como o cron faria.

Desculpe, mas não mencionei até agora, o site me lembrou que a pergunta existe. ; -)

    
por 28.11.2017 / 19:24