Ошибка памяти в моем рабочем экземпляре Django celery

#django #redis #celery #celerybeat

#django #redis #сельдерей #celerybeat

Вопрос:

Я использую django celery с redis (брокером). Я заметил следующую ошибку в одном из моих рабочих экземпляров.

 [2020-12-27 02:26:15,920: INFO/MainProcess] missed heartbeat from worker@ip-xxx-xx-xx-
xxx.ec2.internal
[2020-12-27 02:26:40,937: INFO/MainProcess] missed heartbeat from worker@ip-xxx-xx-xx-xxx.ec2.internal
[2020-12-27 02:27:00,943: INFO/MainProcess] missed heartbeat from worker@ip-xxx-xx-xx-xxx.ec2.internal
[2020-12-27 02:27:15,955: INFO/MainProcess] missed heartbeat from worker@ip-xxx-xx-xx-xxx.ec2.internal
[2020-12-27 02:27:45,971: INFO/MainProcess] missed heartbeat from worker@ip-xxx-xx-xx-xxx.ec2.internal
[2020-12-27 02:28:02,118: INFO/MainProcess] missed heartbeat from worker@ip-xxx-xx-xx-xxx.ec2.internal
[2020-12-27 02:28:36,496: CRITICAL/MainProcess] Unrecoverable error: MemoryError()
Traceback (most recent call last):
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/celery/worker/worker.py", line 205, in start
    self.blueprint.start(self)
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/celery/bootsteps.py", line 369, in start
    return self.obj.start()
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/celery/worker/consumer/consumer.py", line 318, in start
    blueprint.start(self)
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/celery/worker/consumer/consumer.py", line 596, in start
    c.loop(*c.loop_args())
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/celery/worker/loops.py", line 83, in asynloop
    next(loop)
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/kombu/asynchronous/hub.py", line 364, in create_loop
    cb(*cbargs)
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/kombu/transport/redis.py", line 1074, in on_readable
    self.cycle.on_readable(fileno)
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/kombu/transport/redis.py", line 359, in on_readable
    chan.handlers[type]()
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/kombu/transport/redis.py", line 694, in _receive
    ret.append(self._receive_one(c))
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/kombu/transport/redis.py", line 700, in _receive_one
    response = c.parse_response()
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/redis/client.py", line 3036, in parse_response
    return self._execute(connection, connection.read_response)
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/redis/client.py", line 3013, in _execute
    return command(*args)
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/redis/connection.py", line 637, in read_response
    response = self._parser.read_response()
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/redis/connection.py", line 330, in read_response
    response = [self.read_response() for i in xrange(length)]
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/redis/connection.py", line 330, in <listcomp>
    response = [self.read_response() for i in xrange(length)]
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/redis/connection.py", line 324, in read_response
    response = self._buffer.read(length)
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/redis/connection.py", line 205, in read
    self._read_from_socket(length - self.length)
  File "/home/ec2-user/.virtualenvs/xxxxx/lib/python3.7/site-packages/redis/connection.py", line 186, in _read_from_socket
    buf.write(data)
MemoryError
[2020-12-27 06:44:31,570: INFO/MainProcess] Connected to redis://xxxxxxxxxx.cache.amazonaws.com:6379//
[2020-12-27 06:44:31,585: INFO/MainProcess] mingle: searching for neighbors
[2020-12-27 06:44:32,611: INFO/MainProcess] mingle: sync with 1 nodes
 

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

Примечание: тип экземпляра моего рабочего (на aws) — t2.small

Ответ №1:

Имеет смысл (небольшой экземпляр), но я больше беспокоюсь о сбоях проверки работоспособности (пропущенные удары сердца).

вот несколько идей:

  • Попробуйте профилировать свою задачу celery, чтобы понять, сколько памяти она потребляет. Это больше, чем 2 ГБ для этого типа экземпляра?
  • Какой уровень параллелизма вы определили для своего рабочего? вы пытались уменьшить это число? если c==2 и каждая задача потребляет 2 ГБ (например), это может объяснить вашу проблему.
  • Используйте показатели CloudWatch (в консоли AWS), чтобы увидеть загрузку процессора и памяти, чтобы узнать, есть ли корреляция между временем ошибки и некоторыми всплесками на графиках.
  • Если она воспроизводима, вы можете попробовать htop при наличии этой ошибки — чтобы убедиться, что это ограничение ресурсов (mem / CPU).
  • Соберите эти показатели самостоятельно — это всегда может помочь вам в таких случаях.

Удачи!

Комментарии:

1. @WaqasAli есть ли какой-либо прогресс?

2. параллелизм явно не задан (используется значение по умолчанию), однако мы установили —max-tasks-per-child=1, и, похоже, теперь все стало лучше. Это нормально, или у вас есть какие-либо предложения по этому значению?

3. Вы предлагаете какой-нибудь инструмент для профилирования задач сельдерея? или мы должны использовать профилировщик Python?

4. в зависимости от типа вашего экземпляра параллелизм по умолчанию должен быть 1 (1 ядро). Для сбора метрик есть github.com/prometheus/node_exporter и многие другие решения для сбора этих данных и просмотра их позже через Grafana или что-то еще