У нас есть ~ 300 процессов celeryd, работающих под 64-битной Ubuntu 10.4, в режиме ожидания каждый процесс занимает ~ 19 МБ RES, ~ 174 МБ VIRT, таким образом - около 6 ГБ ОЗУ в режиме ожидания для всех процессов. В активном состоянии - процесс занимает до 100 мб RES и ~ 300 мб VIRT
Каждый процесс использует minidom (файлы xml имеют размер <500 КБ, простая структура) и urllib.
Вопросы - как уменьшить потребление оперативной памяти - по крайней мере, для простаивающих работников, возможно, могут помочь некоторые варианты сельдерея или питона? Как определить, какая часть занимает больше всего памяти?
Взгляните на создание подкласса AutoScaler
класс и установление min_concurrency
переменная в __init__
. Значение min_concurrency по умолчанию, равное 0, препятствует уменьшению масштаба AutoScaler по умолчанию.
Я не тестировал этот класс (мои тестовые узлы Celery отключены), но должно работать что-то вроде следующего:
from celery.worker.autoscale import Autoscaler
class MinIdleAutoscaler(Autoscaler):
def __init__(self,pool, max_concurrency, min_concurrency=10, keepalive=30, logger=None):
Autoscaler.__init__(self,pool,max_concurrency,min_concurrency,keepalive,logger)
Затем вы можете указать Celery использовать этот класс, установив CELERYD_AUTOSCALER
в вашей конфигурации Celery.