Сельдерей - минимизировать потребление памяти - PullRequest
9 голосов
/ 03 декабря 2010

У нас есть ~ 300 процессов celeryd, работающих под 64-битной Ubuntu 10.4, в режиме ожидания каждый процесс занимает ~ 19 МБ RES, ~ 174 МБ VIRT, таким образом - это около 6 ГБ ОЗУ в режиме ожидания для всех процессов. В активном состоянии - процесс занимает до 100 МБ RES и ~ 300 МБ VIRT

Каждый процесс использует minidom (xml-файлы <500 КБ, простая структура) и urllib. </p>

Вопросы - как мы можем уменьшить потребление ОЗУ - по крайней мере, для незанятых работников, возможно, могут помочь некоторые варианты сельдерея или питона? Как определить, какая часть занимает большую часть памяти?

UPD: это агенты по поиску рейсов, один сотрудник на одно агентство / дату. У нас 10 агентств, один пользовательский поиск == 9 дат, таким образом, у нас есть 10 * 9 агентов на один пользовательский поиск.

Можно ли запускать процессы celeryd по требованию, чтобы избежать простоя (что-то вроде MaxSpareServers на apache)?

UPD2: Жизненный цикл агента: отправка HTTP-запроса, ожидание ответа ~ 10-20 секунд, анализ xml (занимает менее 0,02 с), сохранение результата в MySQL

Ответы [ 4 ]

5 голосов
/ 03 декабря 2010

Читать это:

http://docs.celeryproject.org/en/latest/userguide/workers.html#concurrency

Похоже, у вас есть один рабочий на сельдерея. Это кажется неправильным. Вы должны иметь десятки рабочих на одного сельдерея. Продолжайте увеличивать количество рабочих (и уменьшать количество сельдерея), пока ваша система не будет очень загруженной и очень медленной.

2 голосов
/ 03 декабря 2010

S. Лотт прав. Основной экземпляр потребляет сообщения и передает их процессам рабочего пула. Вероятно, нет смысла запускать 300 процессов пула на одной машине! Попробуйте 4 или 5 умножить на количество ядер процессора. Вы можете получить что-то, запустив больше, чем на celeryd с несколькими процессами, которые есть у некоторых, но вам придется экспериментировать с вашим приложением.

См. http://celeryq.org/docs/userguide/workers.html#concurrency

В следующем выпуске 2.2 мы работаем над поддержкой пула Eventlet, это может быть хорошей альтернативой для задач, связанных с вводом-выводом, что позволит вам запускать более 1000 потоков с минимальными накладными расходами памяти, но это все еще экспериментально и ошибки исправляются для финального релиза.

См. http://groups.google.com/group/celery-users/browse_thread/thread/94fbeccd790e6c04

В следующем выпуске 2.2 также есть поддержка автомасштабирования, которая добавляет / удаляет процесс по требованию. Смотрите список изменений: http://ask.github.com/celery/changelog.html#version-2-2-0 (этот список изменений еще не полностью написан)

1 голос
/ 20 сентября 2013

Использовать автоматическое масштабирование.Это позволяет увеличивать или уменьшать количество рабочих в каждом экземпляре сельдерея по мере необходимости.http://docs.celeryproject.org/en/latest/userguide/workers.html#autoscaling

1 голос
/ 04 декабря 2010

Естественное количество работников близко к числу ядер, которые у вас есть. Рабочие работают там, чтобы задачи, интенсивно использующие процессор, могли эффективно использовать все ядро. Брокер существует для того, чтобы запросы, у которых нет работника под рукой, были помещены в очередь. Количество очередей может быть большим, но это не значит, что вам также нужно большое количество брокеров. Одного брокера должно быть достаточно, или вы можете разделить очереди по одному брокеру на машину, если позже окажется, что быстрое взаимодействие между рабочими и очередями полезно.

Ваша проблема, похоже, не связана с этим. Я предполагаю, что ваши агентства не предоставляют API очереди сообщений, и вы должны хранить множество запросов. Если это так, вам нужно несколько (акцентирует внимание на немного) четных процессов, например, на основе twisted или node.js.

...