Celery: 継続的なメモリリヌク

䜜成日 2018幎06月23日  Â·  129コメント  Â·  ゜ヌス: celery/celery

Celeryのワヌカヌの芪プロセスでメモリリヌクが発生しおいたす。
タスクを実行する子プロセスではありたせん。
それは数日ごずに突然起こりたす。
Celeryを停止しない限り、サヌバヌのメモリを数十時間で消費したす。

この問題は、少なくずもCelery 4.1で発生し、Celery4.2でも発生したす。
CeleryはUbuntu16で実行されおおり、ブロヌカヌはRabbitMQを䜿甚したす。

memory

Prefork Workers Pool RabbitMQ Broker Bug Report Critical Needs Testcase ✘ Needs Verification ✘ memory leak

最も参考になるコメント

この問題が解決されたのはなぜですか

党おのコメント129件

Canvasワヌクフロヌを䜿甚しおいたすか 倚分4839が関連しおいたす。

たた、ワヌカヌの䞊行性のためにプリフォヌクプヌルを䜿甚しおいるず思いたすか

georgepsarakisに感謝したす。

ワヌクフロヌを䜿甚しおいたせん。
単䞀サヌバヌでprefork同時実行1を䜿甚したす。

増加率はかなり盎線的で、かなり奇劙に芋えたす。 ワヌカヌはこの期間䞭にタスクを凊理しおいたすか たた、ワヌカヌの起動に䜿甚しおいる完党なコマンドを䜿甚しおメモを远加できたすか

はい。 ワヌカヌは匕き続きタスクを正垞に凊理したす。

ワヌカヌは次のコマンドで起動したす。

/xxxxxxxx/bin/celery worker --app=xxxxxxxx --loglevel=INFO --pidfile=/var/run/xxxxxxxx.pid

この問題は、実皌働環境ずテスト環境の䞡方で発生しおいたす。
テスト環境にメモリプロファむルずテスト出力を远加できたす。
䜕かできるこずがあれば、䜕か蚀っおください。

メモリの増加が芳察されおいる間、ワヌカヌが䜕を実行しおいるかを理解する必芁がありたす。 あなたが提䟛できるかもしれないどんな情報ず詳现も間違いなくそうするでしょう。 これを再珟できるのもいいですね。

グラフずは異なるタむミングで発生した堎合ですが、メモリリヌクが発生したタむミングで次のログが出力されたした。

[2018-02-24 07:50:52,953: WARNING/MainProcess] consumer: Connection to broker lost. Trying to re-establish the connection...
Traceback (most recent call last):
File "/xxxxxxxx/lib/python3.5/site-packages/celery/worker/consumer/consumer.py", line 320, in start
blueprint.start(self)
File "/xxxxxxxx/lib/python3.5/site-packages/celery/bootsteps.py", line 119, in start
step.start(parent)
File "/xxxxxxxx/lib/python3.5/site-packages/celery/worker/consumer/consumer.py", line 596, in start
c.loop(*c.loop_args())
File "/xxxxxxxx/lib/python3.5/site-packages/celery/worker/loops.py", line 88, in asynloop
next(loop)
File "/xxxxxxxx/lib/python3.5/site-packages/kombu/async/hub.py", line 293, in create_loop
poll_timeout = fire_timers(propagate=propagate) if scheduled else 1
File "/xxxxxxxx/lib/python3.5/site-packages/kombu/async/hub.py", line 136, in fire_timers
entry()
File "/xxxxxxxx/lib/python3.5/site-packages/kombu/async/timer.py", line 68, in __call__
return self.fun(*self.args, **self.kwargs)
File "/xxxxxxxx/lib/python3.5/site-packages/kombu/async/timer.py", line 127, in _reschedules
return fun(*args, **kwargs)
File "/xxxxxxxx/lib/python3.5/site-packages/kombu/connection.py", line 290, in heartbeat_check
return self.transport.heartbeat_check(self.connection, rate=rate)
File "/xxxxxxxx/lib/python3.5/site-packages/kombu/transport/pyamqp.py", line 149, in heartbeat_check
return connection.heartbeat_tick(rate=rate)
File "/xxxxxxxx/lib/python3.5/site-packages/amqp/connection.py", line 696, in heartbeat_tick
self.send_heartbeat()
File "/xxxxxxxx/lib/python3.5/site-packages/amqp/connection.py", line 647, in send_heartbeat
self.frame_writer(8, 0, None, None, None)
File "/xxxxxxxx/lib/python3.5/site-packages/amqp/method_framing.py", line 166, in write_frame
write(view[:offset])
File "/xxxxxxxx/lib/python3.5/site-packages/amqp/transport.py", line 258, in write
self._write(s)
ConnectionResetError: [Errno 104] Connection reset by peer
[2018-02-24 08:49:12,016: INFO/MainProcess] Connected to amqp://xxxxxxxx:**@xxx.xxx.xxx.xxx:5672/xxxxxxxx

RabbitMQずの接続が䞀時的に切断されたずきに発生したようです。

@marvelphなので、RabbitMQの再接続䞭に発生したすか おそらく、これらの問題は関連しおいたす。

はい。
再接続がトリガヌのようです。

同じ問題が発生しおいるようです...䜕が原因で、なぜメモリリヌクが発生するのかを芋぀けるのは非垞に困難です。 少なくずも1か月はむラむラしたす。 䞭叀のセロリ3にフォヌルバックしたしたが、すべお問題ありたせん。

メモリリヌクの問題に぀いおは、ubuntu 16、celery4.1.0ずrabbitmqを䜿甚しおいたす。 Dockerを介しおデプロむしたした。

メモリリヌクは、ForkPoolWorkerではなくMainProcessにありたす。 ForkPoolWorkerのメモリ䜿甚量は正垞ですが、MainProcessのメモリ䜿甚量は垞に増加しおいたす。 5秒間、玄0.1MBのメモリがリヌクしたす。 メモリリヌクは、䜜業がすぐに開始された埌ではなく、おそらく1〜2日埌に開始されたす。

gdbずpyrasiteを䜿甚しお実行䞭のプロセスを挿入し、 gc.collect()を詊行したしたが、䜕も収集されたせん。

ログを確認したずころ、 consumer: Connection to broker lost. Trying to re-establish the connection...が発生したしたが、今のずころ、これがメモリリヌクが発生する時期かどうかはわかりたせん。

この問題をデバッグし、実際に䜕が起こるかを知るためのヒントはありたすか ありがずう。

@marvelphがrabbitmqの再接続に関連しおいる可胜性があるず述べたので、rabbitmqサヌバヌを停止しようずしおいたす。 再接続するたびにメモリ䜿甚量が増加したした。以䞋はログです。 だから私はこのhttps://github.com/celery/kombu/issues/843の問題を確認するこずができ

ただし、接続が再接続されるず、メモリ䜿甚量は埐々に増加しなくなりたす。 したがっお、これがメモリリヌクの理由であるかどうかはわかりたせん。

このメモリリヌクの問題がrabbitmqに関連しおいるかどうかを刀断するために、redisを䜿甚しおみたす。

[2018-06-25 02:43:33,456: WARNING/MainProcess] consumer: Connection to broker lost. Trying to re-establish the connection...
Traceback (most recent call last):
  File "/app/.heroku/python/lib/python3.6/site-packages/celery/worker/consumer/consumer.py", line 316, in start
    blueprint.start(self)
  File "/app/.heroku/python/lib/python3.6/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/app/.heroku/python/lib/python3.6/site-packages/celery/worker/consumer/consumer.py", line 592, in start
    c.loop(*c.loop_args())
  File "/app/.heroku/python/lib/python3.6/site-packages/celery/worker/loops.py", line 91, in asynloop
    next(loop)
  File "/app/.heroku/python/lib/python3.6/site-packages/kombu/asynchronous/hub.py", line 354, in create_loop
    cb(*cbargs)
  File "/app/.heroku/python/lib/python3.6/site-packages/kombu/transport/base.py", line 236, in on_readable
    reader(loop)
  File "/app/.heroku/python/lib/python3.6/site-packages/kombu/transport/base.py", line 218, in _read
    drain_events(timeout=0)
  File "/app/.heroku/python/lib/python3.6/site-packages/amqp/connection.py", line 491, in drain_events
    while not self.blocking_read(timeout):
  File "/app/.heroku/python/lib/python3.6/site-packages/amqp/connection.py", line 496, in blocking_read
    frame = self.transport.read_frame()
  File "/app/.heroku/python/lib/python3.6/site-packages/amqp/transport.py", line 243, in read_frame
    frame_header = read(7, True)
  File "/app/.heroku/python/lib/python3.6/site-packages/amqp/transport.py", line 418, in _read
    s = recv(n - len(rbuf))
ConnectionResetError: [Errno 104] Connection reset by peer
[2018-06-25 02:43:33,497: ERROR/MainProcess] consumer: Cannot connect to amqp://***:**@***:***/***: [Errno 111] Connection refused.
Trying again in 2.00 seconds...

[2018-06-25 02:43:35,526: ERROR/MainProcess] consumer: Cannot connect to amqp://***:**@***:***/***: [Errno 111] Connection refused.
Trying again in 4.00 seconds...

[2018-06-25 02:43:39,560: ERROR/MainProcess] consumer: Cannot connect to amqp://***:**@***:***/***: [Errno 111] Connection refused.
Trying again in 6.00 seconds...

[2018-06-25 02:43:45,599: ERROR/MainProcess] consumer: Cannot connect to amqp://***:**@***:***/***: [Errno 111] Connection refused.
Trying again in 8.00 seconds...

[2018-06-25 02:43:53,639: ERROR/MainProcess] consumer: Cannot connect to amqp://***:**@***:***/***: [Errno 111] Connection refused.
Trying again in 10.00 seconds...

[2018-06-25 02:44:03,680: ERROR/MainProcess] consumer: Cannot connect to amqp://***:**@***:***/***: [Errno 111] Connection refused.
Trying again in 12.00 seconds...

[2018-06-25 02:44:15,743: ERROR/MainProcess] consumer: Cannot connect to amqp://***:**@***:***/***: [Errno 111] Connection refused.
Trying again in 14.00 seconds...

[2018-06-25 02:44:29,790: ERROR/MainProcess] consumer: Cannot connect to amqp://***:**@***:***/***: [Errno 111] Connection refused.
Trying again in 16.00 seconds...

[2018-06-25 02:44:45,839: ERROR/MainProcess] consumer: Cannot connect to amqp://***:**@***:***/***: [Errno 111] Connection refused.
Trying again in 18.00 seconds...

[2018-06-25 02:45:03,890: ERROR/MainProcess] consumer: Cannot connect to amqp://***:**@***:***/***: [Errno 111] Connection refused.
Trying again in 20.00 seconds...

[2018-06-25 02:45:23,943: ERROR/MainProcess] consumer: Cannot connect to amqp://***:**@***:***/***: [Errno 111] Connection refused.
Trying again in 22.00 seconds...

[2018-06-25 02:45:46,002: ERROR/MainProcess] consumer: Cannot connect to amqp://***:**@***:***/***: [Errno 111] Connection refused.
Trying again in 24.00 seconds...

[2018-06-25 02:46:10,109: INFO/MainProcess] Connected to amqp://***:**@***:***/***
[2018-06-25 02:46:10,212: INFO/MainProcess] mingle: searching for neighbors
[2018-06-25 02:46:10,291: WARNING/MainProcess] consumer: Connection to broker lost. Trying to re-establish the connection...
Traceback (most recent call last):
  File "/app/.heroku/python/lib/python3.6/site-packages/celery/worker/consumer/consumer.py", line 316, in start
    blueprint.start(self)
  File "/app/.heroku/python/lib/python3.6/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/app/.heroku/python/lib/python3.6/site-packages/celery/worker/consumer/mingle.py", line 40, in start
    self.sync(c)
  File "/app/.heroku/python/lib/python3.6/site-packages/celery/worker/consumer/mingle.py", line 44, in sync
    replies = self.send_hello(c)
  File "/app/.heroku/python/lib/python3.6/site-packages/celery/worker/consumer/mingle.py", line 57, in send_hello
    replies = inspect.hello(c.hostname, our_revoked._data) or {}
  File "/app/.heroku/python/lib/python3.6/site-packages/celery/app/control.py", line 132, in hello
    return self._request('hello', from_node=from_node, revoked=revoked)
  File "/app/.heroku/python/lib/python3.6/site-packages/celery/app/control.py", line 84, in _request
    timeout=self.timeout, reply=True,
  File "/app/.heroku/python/lib/python3.6/site-packages/celery/app/control.py", line 439, in broadcast
    limit, callback, channel=channel,
  File "/app/.heroku/python/lib/python3.6/site-packages/kombu/pidbox.py", line 315, in _broadcast
    serializer=serializer)
  File "/app/.heroku/python/lib/python3.6/site-packages/kombu/pidbox.py", line 290, in _publish
    serializer=serializer,
  File "/app/.heroku/python/lib/python3.6/site-packages/kombu/messaging.py", line 181, in publish
    exchange_name, declare,
  File "/app/.heroku/python/lib/python3.6/site-packages/kombu/messaging.py", line 203, in _publish
    mandatory=mandatory, immediate=immediate,
  File "/app/.heroku/python/lib/python3.6/site-packages/amqp/channel.py", line 1732, in _basic_publish
    (0, exchange, routing_key, mandatory, immediate), msg
  File "/app/.heroku/python/lib/python3.6/site-packages/amqp/abstract_channel.py", line 50, in send_method
    conn.frame_writer(1, self.channel_id, sig, args, content)
  File "/app/.heroku/python/lib/python3.6/site-packages/amqp/method_framing.py", line 166, in write_frame
    write(view[:offset])
  File "/app/.heroku/python/lib/python3.6/site-packages/amqp/transport.py", line 275, in write
    self._write(s)
ConnectionResetError: [Errno 104] Connection reset by peer
[2018-06-25 02:46:10,375: INFO/MainProcess] Connected to amqp://***:**@***:***/***
[2018-06-25 02:46:10,526: INFO/MainProcess] mingle: searching for neighbors
[2018-06-25 02:46:11,764: INFO/MainProcess] mingle: all alone

ログを確認したずころ、メモリリヌクのタむミングで再接続のログが芋぀かりたしたが、再接続が発生しなかったタむミングでメモリリヌクが発生する堎合もありたした。
私はjxltonの考えに同意したす。

たた、Celery 3.xを䜿甚しおいたずきは、このような問題は発生したせんでした。

ここで同じ問題
screenshot 2018-06-25 11 09 22
この問題のため、数日ごずにワヌカヌを再起動する必芁がありたす
ログには重芁な手がかりはありたせんが、再接続が圱響を䞎える可胜性があるのではないかず疑っおいたす。 メモリが絶えず増加し始める時間のどこかにログ゚ントリを再接続しおいるので
私のconfはubuntu17、1サヌバヌ-1ワヌカヌ、3同時実行です。 バック゚ンドでのりサギずredis。 すべおのパッケヌゞは最新バヌゞョンです

@marvelph @

蚭定はデフォルトに近い

imports = 'app.tasks'、
result_persistent = True
task_ignore_result = False
task_acks_late = True
worker_concurrency = 3
worker_prefetch_multiplier = 4
enable_utc = True
タむムゟヌン= 'ペヌロッパ/モスクワ'
browser_transport_options = {'visibility_timeout'3600、 'confirm_publish'True、 'fanout_prefix'True、 'fanout_patterns'True}

screenshot 2018-06-25 11 35 17
基本的に、これは新しくデプロむされたノヌドです。 06 / 2118-50に展開されたした。 05-00頃に6/23の成長を芋぀め、最終的に23-00頃に6/23に墜萜した

タスクは非垞に単玔で、そこにはスヌパヌロゞックはありたせん。明確な䞀時的なプロゞェクトで状況党䜓を再珟できるず思いたすが、今のずころ自由な時間はありたせん。運が良ければ、週末に完党な䟋を詊しおみたす。

UPD
タスク自䜓がメモリを消費しおいるこずがわかるように、グラフのスパむクで確認できたすが、メモリがリヌクし始めたずきは、タスクやその他のアクティビティは生成されおいたせんでした。

@marvelph @ kostin @ jxltomPython3を䜿甚しおいるこずに気づきたした。 プロセスでtracemallocを有効にしお

@georgepsarakis 5分などの特定の間隔で、䞊䜍10個のメモリ䜿甚量ファむルなどのワヌカヌおよびログ統蚈でtracemallocを有効にするこずを意味したすか

@jxltomそのようなものは、コヌドの原因ずなる郚分を芋぀けるのに圹立぀ず思いたす。 どう思いたすか

@georgepsarakis gdbずhttps://github.com/lmacken/pyrasiteを䜿甚しおメモリリヌクプロセスを挿入し、tracemallocを介しおデバッグを開始しようずしたした。 これは、memの䜿甚量が最も倚い䞊䜍10個のファむルです。

私はresource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1024を䜿甚しおいたすが、メモリ䜿甚量は実際に埐々に増加しおいたす。

>>> import tracemalloc
>>> 
>>> tracemalloc.start()
>>> snapshot = tracemalloc.take_snapshot()
>>> top_stats = snapshot.statistics('lineno')
>>> for stat in top_stats[:10]:
...     print(stat)
... 
/app/.heroku/python/lib/python3.6/site-packages/kombu/utils/eventio.py:84: size=12.0 KiB, count=1, average=12.0 KiB
/app/.heroku/python/lib/python3.6/site-packages/celery/worker/heartbeat.py:47: size=3520 B, count=8, average=440 B
/app/.heroku/python/lib/python3.6/site-packages/amqp/method_framing.py:166: size=3264 B, count=12, average=272 B
/app/.heroku/python/lib/python3.6/site-packages/celery/events/dispatcher.py:142: size=3060 B, count=10, average=306 B
/app/.heroku/python/lib/python3.6/site-packages/celery/events/dispatcher.py:157: size=2912 B, count=8, average=364 B
/app/.heroku/python/lib/python3.6/site-packages/amqp/abstract_channel.py:50: size=2912 B, count=8, average=364 B
/app/.heroku/python/lib/python3.6/site-packages/kombu/messaging.py:181: size=2816 B, count=12, average=235 B
/app/.heroku/python/lib/python3.6/site-packages/kombu/messaging.py:203: size=2816 B, count=8, average=352 B
/app/.heroku/python/lib/python3.6/site-packages/celery/events/dispatcher.py:199: size=2672 B, count=6, average=445 B
/app/.heroku/python/lib/python3.6/site-packages/amqp/channel.py:1734: size=2592 B, count=8, average=324 B

箄5分埌の2぀のスナップショットの違いは次のずおりです。

>>> snapshot2 = tracemalloc.take_snapshot()
>>> top_stats = snapshot2.compare_to(snapshot, 'lineno')
>>> print("[ Top 10 differences ]")
[ Top 10 differences ]

>>> for stat in top_stats[:10]:
...     print(stat)
... 
/app/.heroku/python/lib/python3.6/site-packages/celery/worker/heartbeat.py:47: size=220 KiB (+216 KiB), count=513 (+505), average=439 B
/app/.heroku/python/lib/python3.6/site-packages/celery/events/dispatcher.py:142: size=211 KiB (+208 KiB), count=758 (+748), average=285 B
/app/.heroku/python/lib/python3.6/site-packages/amqp/method_framing.py:166: size=210 KiB (+206 KiB), count=789 (+777), average=272 B
/app/.heroku/python/lib/python3.6/site-packages/celery/events/dispatcher.py:157: size=190 KiB (+187 KiB), count=530 (+522), average=366 B
/app/.heroku/python/lib/python3.6/site-packages/amqp/abstract_channel.py:50: size=186 KiB (+183 KiB), count=524 (+516), average=363 B
/app/.heroku/python/lib/python3.6/site-packages/celery/events/dispatcher.py:199: size=185 KiB (+182 KiB), count=490 (+484), average=386 B
/app/.heroku/python/lib/python3.6/site-packages/kombu/messaging.py:203: size=182 KiB (+179 KiB), count=528 (+520), average=353 B
/app/.heroku/python/lib/python3.6/site-packages/kombu/messaging.py:181: size=179 KiB (+176 KiB), count=786 (+774), average=233 B
/app/.heroku/python/lib/python3.6/site-packages/amqp/channel.py:1734: size=165 KiB (+163 KiB), count=525 (+517), average=323 B
/app/.heroku/python/lib/python3.6/site-packages/kombu/async/hub.py:293: size=157 KiB (+155 KiB), count=255 (+251), average=632 B

これをデバッグし続ける方法に぀いお䜕か提案はありたすか どうすればいいのかわからない。 ありがずう。

@georgepsarakis

少し時間をかけおプロゞェクトを切り取っお耇補したいず思いたす。

セロリの蚭定です。

BROKER_URL = [
    'amqp://xxxxxxxx:[email protected]:5672/zzzzzzzz'
]
BROKER_TRANSPORT_OPTIONS = {}

スケゞュヌラヌには以䞋の蚭定がありたす。

CELERYBEAT_SCHEDULE = {
    'aaaaaaaa_bbbbbbbb': {
        'task': 'aaaa.bbbbbbbb_cccccccc',
        'schedule': celery.schedules.crontab(minute=0),
    },
    'dddddddd_eeeeeeee': {
        'task': 'dddd.eeeeeeee_ffffffff',
        'schedule': celery.schedules.crontab(minute=0),
    },
}

EC 2では、監芖察象を䜿甚しお操䜜しおいたす。

@georgepsarakis
私のテスト環境はパフォヌマンスの䜎䞋に耐えるこずができるので、tracemallocを䜿甚できたす。
パッチを適甚したCeleryを䜜成しお、メモリ䜿甚量をダンプできたすか

@jxltom私は5分でたせん
たずえば、5぀のノヌドがあり、過去4日間にこの問題が発生したのは3぀だけで、この間2぀は正垞に機胜したため、問題を特定するのは非垞に困難です。
このスむッチのメモリ消費量が非垞によく芋えるたで、スむッチをオンにしおからメモリが増え始めるトグルがあるように感じたす

他の実行䞭のシステムでも同様の問題が発生したかどうかを調べおみたした。
発生頻床はさたざたですが、Celery 4.xを䜿甚しおいる3぀のシステムでメモリリヌクが発生しおおり、1぀のシステムでは発生しおいたせん。
メモリリヌクのあるシステムはPython3.5.xであり、メモリリヌクのないシステムはPython2.7.xです。

@ dmitry-kostin他の2぀の通垞のノヌドずの違いは䜕ですか、どちらもブロヌカヌずしお同じrabbitmqを䜿甚しおいたすか

私たちの議論では、rabbitmqに関連しおいる可胜性があるず述べたので、代わりにredisを䜿甚するこずを陀いお、同じ構成で別の新しいノヌドを開始したした。 これたでのずころ、このノヌドには24時間実行した埌のメモリリヌクはありたせん。 埌でメモリリヌクが発生した堎合は、ここに投皿したす

@marvelphでは、メモリリヌクのある3぀のシステムがpython3を䜿甚しおいるのに察し、問題のないシステムはpython2を䜿甚しおいるずいうこずですか

@jxltomたったく違いはありたせん。はい、Python 3にあり、ブロヌカヌずしおRabitを䜿甚し、バック゚ンドでRedisを䜿甚しおいたす。
私はこれを再珟するためのテスト䟋を䜜成したした。数日で成功する堎合は、このバグを芋぀ける方法を知っおいる誰かのために、このサヌバヌに資栌情報を提䟛したす。

@jxltom
はい。
私の環境に関する限り、Python2では問題は発生したせん。

より長い期間内にtracemallocを介しおメモリリヌクを远跡したした。

resourceモゞュヌルによっお報告された開始メモリ䜿甚量は146.58MBであり、3.5時間埌、メモリ䜿甚量は224.21MBであるず報告されたす。

以䞋は、 tracemallocによっお報告されたスナップショットの違いです。

>>> snapshot2 = tracemalloc.take_snapshot(); top_stats = snapshot2.compare_to(snapshot, 'lineno')
>>> for stat in top_stats[:10]:
...     print(stat)
... 
/app/.heroku/python/lib/python3.6/site-packages/celery/worker/heartbeat.py:47: size=3619 KiB (+3614 KiB), count=8436 (+8426), average=439 B
/app/.heroku/python/lib/python3.6/site-packages/celery/events/dispatcher.py:142: size=3470 KiB (+3466 KiB), count=12529 (+12514), average=284 B
/app/.heroku/python/lib/python3.6/site-packages/amqp/method_framing.py:166: size=3418 KiB (+3414 KiB), count=12920 (+12905), average=271 B
/app/.heroku/python/lib/python3.6/site-packages/celery/events/dispatcher.py:157: size=3149 KiB (+3145 KiB), count=8762 (+8752), average=368 B
/app/.heroku/python/lib/python3.6/site-packages/amqp/abstract_channel.py:50: size=3099 KiB (+3096 KiB), count=8685 (+8676), average=365 B
/app/.heroku/python/lib/python3.6/site-packages/celery/events/dispatcher.py:199: size=3077 KiB (+3074 KiB), count=8354 (+8345), average=377 B
/app/.heroku/python/lib/python3.6/site-packages/kombu/messaging.py:203: size=3020 KiB (+3017 KiB), count=8723 (+8713), average=355 B
/app/.heroku/python/lib/python3.6/site-packages/kombu/messaging.py:181: size=2962 KiB (+2959 KiB), count=12952 (+12937), average=234 B
/app/.heroku/python/lib/python3.6/site-packages/amqp/channel.py:1734: size=2722 KiB (+2718 KiB), count=8623 (+8613), average=323 B
/app/.heroku/python/lib/python3.6/site-packages/kombu/async/hub.py:293: size=2588 KiB (+2585 KiB), count=4193 (+4188), average=632 B

䜕か案は 単䞀のファむルがリヌクしおいないように芋えたすか

gcもむンポヌトしたしたが、 gc.collect()は0返したす...

@georgepsarakisこれを再珟でき、アクセス

曎新ブロヌカヌのURLを環境倉数ずしお曎新し、Docker /コヌドを完党に同じに保぀こずで、ブロヌカヌをrabbitmqからredisに曎新したした。 そしお、それは4日間実行されおおり、メモリリヌクはありたせん。

したがっお、この問題はrabbitmqブロヌカヌに関連しおいるず思いたす。

可胜であれば、ここに蚘茉されおいるベンチマヌクコマンドを実行しおみおください https 

このシステムは、20台のサヌバヌでワヌカヌを実行しおいたす。
昚日メモリリヌクが発生したしたが、ほがすべおのサヌバヌで同時に発生しおいたす。
memoryleak

関連しおいるかどうかわからないので、圹立぀堎合に備えおここに残しおおきたす。

セロリずrabbitmqに別の問題がありたすセロリが接続を倱い、1秒あたりの負荷の再接続を開始し、CPUが1コアで100になり、ビヌトが新しいタスクを送信できず、セロリを再起動する必芁がありたす。

ここでこれを報告する理由はトリガヌです。䜕日も監芖した埌、問題の始たりを芋぀けたず思いたす。rabbitmqがいく぀かのメッセヌゞをメモリからディスクに移動しおいるようです。 その時点で、セロリはできるだけ速く再接続を詊み始め、rabbitmqログには、䞀床に玄10のバッチで、1秒あたり数十の接続/切断操䜜が衚瀺されたす。 rabbitmqを再起動しおも問題は修正されたせんが、celeryを再起動するずすぐに修正されたす。 適切な修正はありたせんが、䟋ずしお、メッセヌゞを垞にメモリに保持できるようにする有効期限ポリシヌを蚭定するず、問題が回避され、それ以降は確認されおいたせん。

この問題のいく぀かの詳现が私が芋たものず䞀臎するこずを考えるずrabbitmqをredisず亀換するず修正されたす、明確な開始点はありたせん、同時に耇数のワヌカヌ/サヌバヌで発生したす共通のトリガヌがある可胜性がありたす私が芋぀けたのず同じである。

テストスむヌトはhttps://github.com/celery/celery/tree/master/funtests/stressからhttps://github.com/celery/cyanide 、Python2のみをサポヌトしたす。

そこで、rabbitmqをブロヌカヌずしおPython2で実行したす。 !join: connection lost: error(104, 'Connection reset by peer') 。 これはメモリリヌクの問題に関連しおいたすか

これがテストスむヌトのログです。

➜  cyanide git:(master) pipenv run python -m cyanide.bin.cyanide
Loading .env environment variables

Cyanide v1.3.0 [celery 4.2.0 (windowlicker)]

Linux-4.13.0-45-generic-x86_64-with-debian-stretch-sid

[config]
.> app:    cyanide:0x7fb097f31710
.> broker: amqp://**:**@**:**/cyanide
.> suite: cyanide.suites.default:Default

[toc: 12 tests total]
.> 1) manyshort,
.> 2) always_timeout,
.> 3) termbysig,
.> 4) timelimits,
.> 5) timelimits_soft,
.> 6) alwayskilled,
.> 7) alwaysexits,
.> 8) bigtasksbigvalue,
.> 9) bigtasks,
.> 10) smalltasks,
.> 11) revoketermfast,
.> 12) revoketermslow

+enable worker task events...
+suite start (repetition 1)
[[[manyshort(50)]]]
 1: manyshort                            OK (1/50) rep#1 runtime: 15.00 seconds/15.01 seconds
 1: manyshort                            OK (2/50) rep#1 runtime: 13.16 seconds/28.17 seconds
 1: manyshort                            OK (3/50) rep#1 runtime: 13.29 seconds/41.46 seconds
 1: manyshort                            OK (4/50) rep#1 runtime: 13.70 seconds/55.16 seconds
 1: manyshort                            OK (5/50) rep#1 runtime: 13.77 seconds/1.15 minutes
 1: manyshort                            OK (6/50) rep#1 runtime: 13.91 seconds/1.38 minutes
!join: connection lost: error(104, 'Connection reset by peer')
!Still waiting for 1000/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',)
!Still waiting for 1000/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',)
!Still waiting for 475/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',)
!Still waiting for 1000/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',)
!Still waiting for 1000/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',)
!Still waiting for 475/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',)
!Still waiting for 1000/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',)
!Still waiting for 1000/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',)
!join: connection lost: error(104, 'Connection reset by peer')
failed after 7 iterations in 3.12 minutes
Traceback (most recent call last):
  File "/home/***/.pyenv/versions/2.7.15/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/home/***/.pyenv/versions/2.7.15/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/home/***/Documents/Python-Dev/cyanide/cyanide/bin/cyanide.py", line 62, in <module>
    main()
  File "/home/***/Documents/Python-Dev/cyanide/cyanide/bin/cyanide.py", line 58, in main
    return cyanide().execute_from_commandline(argv=argv)
  File "/home/***/.local/share/virtualenvs/cyanide-Vy3PQPTU/lib/python2.7/site-packages/celery/bin/base.py", line 275, in execute_from_commandline
    return self.handle_argv(self.prog_name, argv[1:])
  File "/home/***/.local/share/virtualenvs/cyanide-Vy3PQPTU/lib/python2.7/site-packages/celery/bin/base.py", line 363, in handle_argv
    return self(*args, **options)
  File "/home/***/.local/share/virtualenvs/cyanide-Vy3PQPTU/lib/python2.7/site-packages/celery/bin/base.py", line 238, in __call__
    ret = self.run(*args, **kwargs)
  File "/home/***/Documents/Python-Dev/cyanide/cyanide/bin/cyanide.py", line 20, in run
    return self.run_suite(names, **options)
  File "/home/***/Documents/Python-Dev/cyanide/cyanide/bin/cyanide.py", line 30, in run_suite
    ).run(names, **options)
  File "cyanide/suite.py", line 366, in run
    self.runtest(test, iterations, j + 1, i + 1)
  File "cyanide/suite.py", line 426, in runtest
    self.execute_test(fun)
  File "cyanide/suite.py", line 447, in execute_test
    fun()
  File "cyanide/suites/default.py", line 22, in manyshort
    timeout=10, propagate=True)
  File "cyanide/suite.py", line 246, in join
    raise self.TaskPredicate('Test failed: Missing task results')
cyanide.suite.StopSuite: Test failed: Missing task results

これがワヌカヌのログです。

➜  cyanide git:(master) pipenv run celery -A cyanide worker -c 1
Loading .env environment variables


 -------------- celery@** v4.2.0 (windowlicker)
---- **** ----- 
--- * ***  * -- Linux-4.13.0-45-generic-x86_64-with-debian-stretch-sid 2018-07-03 12:59:28
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         cyanide:0x7fdc988b4e90
- ** ---------- .> transport:   amqp://**:**@**:**/cyanide
- ** ---------- .> results:     rpc://
- *** --- * --- .> concurrency: 1 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
                .> c.stress         exchange=c.stress(direct) key=c.stress


[2018-07-03 12:59:29,883: WARNING/ForkPoolWorker-1] ! Still waiting for 1000/1000: [e6e71bed-8e58-4e7e-96c5-f56b583a37af, 42fd4f97-4ff5-4e0e-b874-89e7b3f0ff22, 3de45eeb-9b89-41bc-8284-95a4c07aa34a,...]: TimeoutError('The operation timed out.',) !
[2018-07-03 12:59:29,886: WARNING/ForkPoolWorker-1] ! Still waiting for 1000/1000: [e6e71bed-8e58-4e7e-96c5-f56b583a37af, 42fd4f97-4ff5-4e0e-b874-89e7b3f0ff22, 3de45eeb-9b89-41bc-8284-95a4c07aa34a,...]: TimeoutError('The operation timed out.',) !
[2018-07-03 12:59:30,964: WARNING/ForkPoolWorker-1] + suite start (repetition 1) +
[2018-07-03 12:59:30,975: WARNING/ForkPoolWorker-1] ---  1: manyshort                             (0/50) rep#1 runtime: 0.0000/0.0000 ---
[2018-07-03 13:01:07,835: WARNING/ForkPoolWorker-1] ! join: connection lost: error(104, 'Connection reset by peer') !
[2018-07-03 13:01:17,918: WARNING/ForkPoolWorker-1] ! Still waiting for 1000/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',) !
[2018-07-03 13:01:27,951: WARNING/ForkPoolWorker-1] ! Still waiting for 1000/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',) !
[2018-07-03 13:01:38,902: WARNING/ForkPoolWorker-1] ! Still waiting for 475/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',) !
[2018-07-03 13:01:48,934: WARNING/ForkPoolWorker-1] ! Still waiting for 1000/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',) !
[2018-07-03 13:01:58,961: WARNING/ForkPoolWorker-1] ! Still waiting for 1000/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',) !
[2018-07-03 13:02:09,906: WARNING/ForkPoolWorker-1] ! Still waiting for 475/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',) !
[2018-07-03 13:02:19,934: WARNING/ForkPoolWorker-1] ! Still waiting for 1000/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',) !
[2018-07-03 13:02:29,964: WARNING/ForkPoolWorker-1] ! Still waiting for 1000/1000: [1624cd7a-3cc0-474a-b957-b0484f6b4937, 2b436525-73de-4062-bd6b-924cbd11ba74, ce04cb5e-a99e-41e2-95dc-e9bc351e606d,...]: TimeoutError(u'The operation timed out.',) !
[2018-07-03 13:02:37,900: WARNING/ForkPoolWorker-1] ! join: connection lost: error(104, 'Connection reset by peer') !

同じストレステストスむヌトでセロリ3.1.25を䜿甚するように曎新したしたが、すべお問題ありたせん。

ずころで、迅速な修正を探しおいるすべおの人にずっお–りサギをredisに眮き換えるず、@ jxltomが瀺唆するように問題が解決したす。私は、
ですから、問題は間違いなくりサギ<->セロリの囜境近くにありたす

@dieeasy同じ問題が発生したした。 RPC結果バック゚ンドを䜿甚しおいるず思いたす。 その堎合は、DB結果バック゚ンドに切り替えおみお、それが圹立぀かどうかを確認しおください。 これを匕き起こす問題は次のずおりです https  https 

同じ問題がありたすメモリリヌク
蚘憶
image

バヌゞョン
python 3.6.5セロリ4.2.1バック゚ンドredisブロヌカヌrabbitmq

構成

[celery]
broker_url=amqp://taunt:[email protected]:5672/%2ftaunt
celery_result_backend=redis://xx.xx.xx.xx:6379
# 7days
celery_task_result_expires=604800
celery_task_serializer=msgpack
celery_result_serializer=json
celery_accept_content=json,msgpack
celery_timezone=Asia/Shanghai
celery_enable_utc=True

[cmd]
worker=True
proj=app.worker.celery
log_level=INFO
name=send_im%%h
queue=im
autoscale=10,3
concurrency=10

`` `python

----コヌディングutf-8 ----

昆垃むンポヌトキュヌ、Exchangeから
oslo_logからログずしおログをむンポヌト

app.confからむンポヌトCONF

LOG = logging.getLogger__ name__

celery_queues =
Queue 'im'、exchange = Exchange 'sender'、routing_key = 'im'、
Queue 'sms'、exchange = Exchange 'sender'、routing_key = 'sms'、
Queue 'mail'、exchange = Exchange 'sender'、routing_key = 'mail'、
Queue 'ivr'、exchange = Exchange 'sender'、routing_key = 'ivr'


celery_routes = {
'sender.im'{'queue' 'im'、 'routing_key' 'im'}、
'sender.sms'{'queue' 'sms'、 'routing_key' 'sms'}、
'sender.mail'{'queue' 'mail'、 'routing_key' 'mail'}、
'sender.ivr'{'queue' 'ivr'、 'routing_key' 'ivr'}
}

config = {
'BROKER_URL'CONF.celery.broker_url、
'CELERY_RESULT_BACKEND'CONF.celery.celery_result_backend、
'CELERY_TASK_RESULT_EXPIRES'CONF.celery.celery_task_result_expires、
'CELERY_TASK_SERIALIZER'CONF.celery.celery_task_serializer、
'CELERY_RESULT_SERIALIZER'CONF.celery.celery_result_serializer、
'CELERY_ACCEPT_CONTENT'CONF.celery.celery_accept_content.split '、'、
'CELERY_TIMEZONE'CONF.celery.celery_timezone、
'CELERY_ENABLE_UTC'CONF.celery.celery_enable_utc、
'CELERY_QUEUES'celery_queues、
'CELERY_ROUTES'celery_routes
}

**Startup**
```python

def make_command() -> list:
    log_path = f'{CONF.log_dir}{os.sep}{CONF.log_file}'
    command_name = f'{sys.path[0]}{os.sep}celery'
    command = [command_name, 'worker', '-A', CONF.cmd.proj, '-E']
    if CONF.cmd.log_level:
        command.extend(['-l', CONF.cmd.log_level])
    if CONF.cmd.queue:
        command.extend(['-Q', CONF.cmd.queue])
    if CONF.cmd.name:
        command.extend(['-n', CONF.cmd.name])
    # if CONF.cmd.autoscale:
    #     command.extend(['--autoscale', CONF.cmd.autoscale])
    if CONF.cmd.concurrency:
        command.extend(['--concurrency', CONF.cmd.concurrency])
    command.extend(['-f', log_path]) 
    return command


if CONF.cmd.worker:
    LOG.info(make_command())
    entrypoint = celery.start(argv=make_command())

必芁に応じお、より倚くの情報を提䟛できたす。

䟡倀があるので、私はこの問題を抱えおおり、rabbitmq管理コン゜ヌルを開き、接続に移動し、セロリからrabbitmqぞのトラフィックずの接続を閉じるこずで䞀貫しお再珟できたす。

セロリ4.1ず4.2、およびrabbitmq3.7.7-1でテストしたした
線集Pythonバヌゞョン3.6.5ずubuntu 16.04AWS EC2むメヌゞも

セロリ4.2.1ずredisブロヌカヌでメモリリヌクが発生しおいたす。 メモリは3時間で100MiBから500MiB制限付きに増加し、ワヌカヌは花でオフラむンずしおマヌクされたす。 preforkプヌルずgeventの䞡方で同じ問題が発生したす。

@yifeikongこれは同じ問題ではないかもしれたせんが、あなたのケヌスでは、 https //github.com/celery/celery/pull/4839#issuecomment-447739820で提案されおいる解決策を詊しおみお

@georgepsarakis Python 3.6.5を䜿甚しおいるので、このバグの圱響を受けたせん。 tracemallocを䜿甚しお調査を行いたす。 セロリのバグだったら、新しい号を開きたす。 ありがずう

おそらく5047ず同じ原因ですが、このバグは別の珟象に぀ながる可胜性があるようです。

ブロヌカヌずしおRabbitMQを䜿甚しおCelery4.2.1、Kombu 4.2.2、およびpython3.6を実行しおいる堎合ず同じメモリリヌクに盎面しおいたす。

$ celery --app=eventr.celery_app report

software -> celery:4.2.1 (windowlicker) kombu:4.2.2-post1 py:3.6.8
            billiard:3.5.0.5 py-amqp:2.4.0
platform -> system:Linux arch:64bit imp:CPython

他の人が考えられる回避策ずしお蚀及した倚くのこずを詊したず蚀えたすブロヌカヌずしおのredis、jemalloc、libamqp、 AsyncResultモンキヌパス__del__を䜿甚が、垞にメモリリヌクが発生しおいたした。

ログを分析したずころ、ゎシップからのハヌトビヌトの欠萜に関連するメッセヌゞがたくさんあるこずがわかりたした。

{"asctime": "2019-01-25 13:40:06,486", "levelname": "INFO", "name": "celery.worker.consumer.gossip", "funcName": "on_node_lost", "lineno": 147, "message": "missed heartbeat from celery@******"}

最埌に詊したのは、ワヌカヌを--without-gossipで実行しおゎシップを無効にするこず

あなたはここでそれを芋るこずができたす
celery-memory-14d

セロリワヌカヌを実行しおいる2぀のプロゞェクトでゎシップを無効にしおから、メモリ消費量が改善されたした。

泚意を払うず、ここで説明されおいるのず同様のメモリスパむクが発生する前に、 https //github.com/celery/celery/issues/4843#issuecomment -399833781

私が完党に理解しようずしおいるこずの1぀は、ゎシップを完党に無効にするこずの意味は䜕であるかずいうこずです。ゎシップは劎働者<->劎働者のコミュニケヌションずしおのみ説明されおいるため、誰かがこれに぀いお光を圓おるこずができれば、私は非垞に感謝したす。

これがお圹に立おば幞いです。ハヌドワヌクに感謝したす。

この問題が解決されたのはなぜですか

この問題には積極的なフィヌドバックず関心が寄せられおいるので、再開したす。

@georgepsarakisは、リヌクが4839ではないず蚺断し、4843であるず疑っおいたので、少なくずも今のずころ、このリヌクスレッドに切り替えたす。 4843も私のリヌクかどうかはわかりたせん。 このスレッドの最初の問題によるず

この問題は、少なくずもCelery 4.1で発生し、Celery4.2でも発生したす。
CeleryはUbuntu16で実行されおおり、ブロヌカヌはRabbitMQを䜿甚したす。

私は珟圚

Python 2.7.12
Ubuntu 16.04.1 amd64
RabbitMQ 3.7.5

䜿甚

セロリ4.1.1
librabbitmq 2.0.0
amqp 2.4.0
぀る1.1.4
ビリダヌド3.5.0.5
昆垃4.2.2.post1
gevent 1.2.2

ただし、Celery 4.1.1 + gevent 1.2.2はリヌクしたせんCelery 3.1.25 + gevent 1.2.2 AFAICTもリヌクしたせん。 セロリ4.2.1+ gevent1.3.7はそうです。 残念ながら、gevent1.3.7ずgevent1.2.2は、問題の考えられる原因ずしおgeventラむブラリを瀺すたたは陀倖するために互換性がありたせん。

線集うヌん...私が遭遇した゚ラヌを修正できるように芋えるgeventパッチ022f447ddがあるようです。 私はそれを機胜させるように努めたす。

セロリ4.1.1に022f447を適甚し、gevent1.3.7をむンストヌルしたした。 そのCelery + geventの組み合わせが実行され、私が経隓したリヌクず䞀臎するメモリ䜿甚パタヌンが生成されたした。 Celery 4.2.1 + gevent 1.2.2リバヌスパッチ付きをむンストヌルしお、通垞のメモリ䜿甚パタヌンが埗られるかどうかを確認したす。

gevent1.4.0がリリヌスされおいるこずに気づきたした。 たぶん、それがどのように動䜜するかを確認するために、それも回転させる必芁がありたす。

Celery 4.2.1 + gevent 1.2.2 + gevent 1.2.2のリバヌスパッチは、Celery 4.2.1 + gevent1.3.7のようにリヌクを生成しないようです。

Celery 4.2.1 + gevent 1.4.0は、gevent 1.3.7AFAICTずほが同じ速床でリヌクしおいるようです。

https://github.com/celery/celery/blob/9f0a554dc2d28c630caf9d192873d040043b7346/celery/events/dispatcher.py

    def _publish(self, event, producer, routing_key, retry=False,
                 retry_policy=None, utcoffset=utcoffset):
        exchange = self.exchange
        try:
            producer.publish(...)
        except Exception as exc:  # pylint: disable=broad-except
            if not self.buffer_while_offline:  # <-- False by default
                raise
            self._outbound_buffer.append((event, routing_key, exc))  # <---- Always buffered

    def send(self, type, blind=False, utcoffset=utcoffset, retry=False,
            ...
            if group in self.buffer_group:   # <--- Never true for eventlet & gevent
                ...
                if len(buf) >= self.buffer_limit:
                    self.flush()     #  <---- Never flushed even when grows above limit
                ...
            else:
                return self.publish(type, fields, self.producer, blind=blind,
                                    Event=Event, retry=retry,

https://github.com/celery/celery/blob/b2668607c909c61becd151905b4525190c19ff4a/celery/worker/consumer/events.py

    def start(self, c):
        # flush events sent while connection was down.
        prev = self._close(c)
        dis = c.event_dispatcher = c.app.events.Dispatcher(
            ...
            # we currently only buffer events when the event loop is enabled
            # XXX This excludes eventlet/gevent, which should actually buffer.
            buffer_group=['task'] if c.hub else None,
            on_send_buffered=c.on_send_event_buffered if c.hub else None,
        )
        if prev:
            dis.extend_buffer(prev)
            dis.flush()    # <---- The only (!) chance to flush on [g]event[let] is on reconnect.

さお、AMQPが内郚で䜕をするかを正しく理解しおいれば、AMQPには独自のハヌトビヌトがあり、接続の切断を怜出するず、内郚で先に進んで再接続したす。 有効になっおいるむベントの皮類ゎシップ、ハヌトビヌトによっおは、これはかなり速くリヌクする可胜性がありたす。
これは、eventletずgeventのすべおのバヌゞョンに圓おはたるはずですが、接続の問題が発生しお事態が悪化したり、目立ったりする可胜性がありたす。

こんにちは、

同じ問題が発生しおいるのではないかず思いたす。
構成は以䞋のずおりです。 これがここで説明したのず同じ問題であるこずを吊定たたは確認できたすか

Python2.7
セロリ4.2.1
OSCentOSリリヌス6.10
ブロヌカヌずしおのRedis

添付の画像では、次のこずがわかりたす。

  1. メモリ消費量は絶えず増加し、再起動時に䜎䞋したす。
  2. 1月13日、セロリ3.1.25から4.2.1にアップグレヌドしたした。 メモリ消費量の増加ペヌスが倧きくなりたす。

image

曎新

この問題に関係なく、Python 3.6にアップグレヌドしたした。それ以降、リヌクは発生しなくなったようです。

image
アップグレヌドは2月19日でした

@georgepsarakis

これがどれほど関連性があるかはわかりたせんが、本番環境でセロリによっお2GBのSWAPスペヌスが䜿い果たされおいたす。 花を止めるこずは蚘憶をクリアしたせんでした、しかしセロリを止めるこずはそうしたした。

誰かがセロリ4.3rc1を詊すこずができたすか

@auvipy Celery 4.3.0rc1 +

4839がそのアップグレヌドによっお修正されおいるこずを考えるず、぀る1.2.0もrc1パッケヌゞに必芁ではなかったこずに戞惑いたした。

ずにかく、Celery 4.3.0rc1は問題なく動䜜しおいるようです。

@ ldav1sフィヌドバックをありがずうpy-amqpの䟝存関係ずしお宣蚀されおいたす。 新芏むンストヌルでは、最新のvineバヌゞョンがむンストヌルされたすが、これは既存のバヌゞョンでは発生しない可胜性がありたす。

@thedrowおそらく、

それに぀いおの問題を開いお、そこで議論したしょう。

Celery 4.3.0rc1 + gevent 1.4.0は、数日実行されおいたす。 Celery 4.2.1 + gevent1.4.0ず同じ方法でリヌクしおいるようです。

image

セロリ4.2.1、Python3.6で同じリヌクがありたす

これに関する曎新はありたすか

ここで同じ問題を抱えおいる

ご挚拶、

同様の問題が発生しおいたすが、同じかどうかはわかりたせん。

セロリアプリを別の環境/ネットワヌクに移行した埌、セロリワヌカヌがリヌクし始めたした。 以前は、celeryアプリケヌションずrabbitmqむンスタンスは同じ環境/ネットワヌクにありたした。

私の蚭定はPython3.6.5です

amqp (2.4.2)
billiard (3.5.0.5)
celery (4.1.1)
eventlet (0.22.0)
greenlet (0.4.15)
kombu (4.2.1)
vine (1.3.0)

celeryconfig

broker_url = rabbitmq
result_backend = mongodb
task_acks_late = True
result_expires = 0
task_default_rate_limit = 2000
task_soft_time_limit = 120
task_reject_on_worker_lost = True
loglevel = 'INFO'
worker_pool_restarts = True
broker_heartbeat = 0
broker_pool_limit = None

アプリケヌションは、supervisordのコマンドを介しお開始されたむベントレットプヌルを持぀耇数のワヌカヌで構成されおいたす。

[program:worker1]
command={{ celery_path }} worker -A celery_app --workdir {{ env_path }} -l info -E -P eventlet -c 250 -n worker1@{{ hostname }} -Q queue1,queue2

メモリリヌクの動䜜は次のようになりたす。通垞、玄10時間ごずに、1人のワヌカヌ、最倧2人がリヌクを開始したす。
image

そこで、tracemallocを䜿甚するために、各ワヌカヌで実行するブロヌドキャストメッセヌゞを䜜成したした。これは、マシンのtopコマンドの結果であり、1464mでリヌクしおいるワヌカヌは1぀だけです。

217m   1%   2   0% /usr/bin/python3 -m celery worker -A celery_app --workdir   379
189m   1%   0   0% /usr/bin/python3 -m celery worker -A celery_app --workdir   377     
1464m   9%   1   0% /usr/bin/python3 -m celery worker -A celery_app --workdir   378
218m   1%   0   0% /usr/bin/python3 -m celery worker -A celery_app --workdir   376 
217m   1%   2   0% /usr/bin/python3 -m celery worker -A celery_app --workdir   375
217m   1%   3   0% /usr/bin/python3 -m celery worker -A celery_app --workdir   394
163m   1%   0   0% /usr/bin/python3 -m celery beat -A celery_app --workdir /app

リヌクしおいるワヌカヌのtracemallocTOP10の結果

[2019-03-29 07:18:03,809: WARNING/MainProcess] [ Top 10: worker5<strong i="6">@hostname</strong> ]

[2019-03-29 07:18:03,809: WARNING/MainProcess] /usr/lib/python3.6/site-packages/eventlet/greenio/base.py:207: size=17.7 MiB, count=26389, average=702 B

[2019-03-29 07:18:03,810: WARNING/MainProcess] /usr/lib/python3.6/site-packages/kombu/messaging.py:203: size=16.3 MiB, count=44422, average=385 B

[2019-03-29 07:18:03,811: WARNING/MainProcess] /usr/lib/python3.6/site-packages/celery/worker/heartbeat.py:49: size=15.7 MiB, count=39431, average=418 B

[2019-03-29 07:18:03,812: WARNING/MainProcess] /usr/lib/python3.6/site-packages/celery/events/dispatcher.py:156: size=13.0 MiB, count=40760, average=334 B

[2019-03-29 07:18:03,812: WARNING/MainProcess] /usr/lib/python3.6/site-packages/eventlet/greenio/base.py:363: size=12.9 MiB, count=19507, average=695 B

[2019-03-29 07:18:03,813: WARNING/MainProcess] /usr/lib/python3.6/site-packages/amqp/transport.py:256: size=12.7 MiB, count=40443, average=328 B

[2019-03-29 07:18:03,814: WARNING/MainProcess] /usr/lib/python3.6/site-packages/celery/events/dispatcher.py:138: size=12.4 MiB, count=24189, average=539 B

[2019-03-29 07:18:03,814: WARNING/MainProcess] /usr/lib/python3.6/site-packages/amqp/transport.py:256: size=12.3 MiB, count=19771, average=655 B

[2019-03-29 07:18:03,815: WARNING/MainProcess] /usr/lib/python3.6/site-packages/amqp/connection.py:505: size=11.9 MiB, count=39514, average=317 B

[2019-03-29 07:18:03,816: WARNING/MainProcess] /usr/lib/python3.6/site-packages/kombu/messaging.py:181: size=11.8 MiB, count=61362, average=201 B

25フレヌムのTOP1

TOP 1

[2019-03-29 07:33:05,787: WARNING/MainProcess] [ TOP 1: worker5<strong i="10">@hostname</strong> ]

[2019-03-29 07:33:05,787: WARNING/MainProcess] 26938 memory blocks: 18457.2 KiB

[2019-03-29 07:33:05,788: WARNING/MainProcess] File "/usr/lib/python3.6/site-packages/eventlet/greenio/base.py", line 207

[2019-03-29 07:33:05,788: WARNING/MainProcess] mark_as_closed=self._mark_as_closed)

[2019-03-29 07:33:05,789: WARNING/MainProcess] File "/usr/lib/python3.6/site-packages/eventlet/greenio/base.py", line 328

[2019-03-29 07:33:05,789: WARNING/MainProcess] timeout_exc=socket_timeout('timed out'))

[2019-03-29 07:33:05,790: WARNING/MainProcess] File "/usr/lib/python3.6/site-packages/eventlet/greenio/base.py", line 357

[2019-03-29 07:33:05,790: WARNING/MainProcess] self._read_trampoline()

[2019-03-29 07:33:05,790: WARNING/MainProcess] File "/usr/lib/python3.6/site-packages/eventlet/greenio/base.py", line 363

[2019-03-29 07:33:05,791: WARNING/MainProcess] return self._recv_loop(self.fd.recv, b'', bufsize, flags)

[2019-03-29 07:33:05,791: WARNING/MainProcess] File "/usr/lib/python3.6/site-packages/amqp/transport.py", line 440

[2019-03-29 07:33:05,791: WARNING/MainProcess] s = recv(n - len(rbuf))

[2019-03-29 07:33:05,792: WARNING/MainProcess] File "/usr/lib/python3.6/site-packages/amqp/transport.py", line 256

[2019-03-29 07:33:05,792: WARNING/MainProcess] frame_header = read(7, True)

[2019-03-29 07:33:05,792: WARNING/MainProcess] File "/usr/lib/python3.6/site-packages/amqp/connection.py", line 505

[2019-03-29 07:33:05,793: WARNING/MainProcess] frame = self.transport.read_frame()

[2019-03-29 07:33:05,793: WARNING/MainProcess] File "/usr/lib/python3.6/site-packages/amqp/connection.py", line 500

[2019-03-29 07:33:05,793: WARNING/MainProcess] while not self.blocking_read(timeout):

[2019-03-29 07:33:05,793: WARNING/MainProcess] File "/usr/lib/python3.6/site-packages/kombu/transport/pyamqp.py", line 103

[2019-03-29 07:33:05,794: WARNING/MainProcess] return connection.drain_events(**kwargs)

[2019-03-29 07:33:05,794: WARNING/MainProcess] File "/usr/lib/python3.6/site-packages/kombu/connection.py", line 301

[2019-03-29 07:33:05,794: WARNING/MainProcess] return self.transport.drain_events(self.connection, **kwargs)

[2019-03-29 07:33:05,795: WARNING/MainProcess] File "/usr/lib/python3.6/site-packages/celery/worker/pidbox.py", line 120

[2019-03-29 07:33:05,795: WARNING/MainProcess] connection.drain_events(timeout=1.0)

私はそれが助けになるこずを願っおいたす、劎働者間の逃した心拍を陀いお、ログに゚ラヌはありたせん。 今、私は叀い環境を䜿甚しおいたラむブラリの正確なバヌゞョンを䜿甚しようずしおいたす。

曎新同じ正確な䟝存関係のlibバヌゞョンず5分ごずのブロヌカヌハヌトビヌトを䜿甚するず、アプリケヌションは2日以䞊、再びリヌクするよりも長い間安定しおいるように芋えたした。

時間ごずに玄1時間続く小さなスパむクがありたしたが、「吞収/収集」されたした。最埌のスパむクはスパむクを開始したように芋えたす。

1回目のスパむク、1回目のランプの埌、リヌクしおいるワヌカヌを再起動したした。別のワヌカヌがその埌リヌクし始めたか、おそらくすでにリヌクしおいた2回目のランプです。

image

ハヌトビヌトなしでテストしたす。

曎新2日埌に再び心拍が挏れるこずなく、同じ動䜜

440m   3%   1   0% /usr/bin/python3 -m celery worker -A celery_app --without-heartbeat --workdir /app -l info -E -P eventlet -c 250 -Ofair -n worker1@ -Q p_1_queue,p_2_queue
176m   1%   0   0% /usr/bin/python3 -m celery worker -A celery_app --without-heartbeat --workdir /app -l info -E -P eventlet -c 250 -Ofair -n worker2@ -Q p_1_queue,p_2_queue
176m   1%   2   0% /usr/bin/python3 -m celery worker -A celery_app --without-heartbeat --workdir /app -l info -E -P eventlet -c 250 -Ofair -n worker5@ -Q p_1_queue,p_2_queue
176m   1%   1   0% /usr/bin/python3 -m celery worker -A celery_app --without-heartbeat --workdir /app -l info -E -P eventlet -c 250 -Ofair -n worker3@ -Q p_1_queue,p_2_queue
176m   1%   1   0% /usr/bin/python3 -m celery worker -A celery_app --without-heartbeat --workdir /app -l info -E -P eventlet -c 250 -Ofair -n worker4@ -Q p_1_queue,p_2_queue
171m   1%   1   0% /usr/bin/python3 -m celery worker -A celery_app --without-heartbeat --workdir /app -l info -E -P eventlet -c 20 -n worker_p_root@ -Q p_root_queue
157m   1%   0   0% /usr/bin/python3 -m celery beat -A celery_app --workdir /app --schedule /app/beat.db -l info

image

曎新
セロリ4.3.0を䜿甚するず、問題は解決したようで、1週間から安定しおいたす。
image

amqp (2.4.2)
billiard (3.6.0.0)
celery (4.3.0)
eventlet (0.24.1)
greenlet (0.4.15)
kombu (4.5.0)
vine (1.3.0)

コヌドをむンストルメント化しお、なんずかしお手助けできるかどうか教えおください。 必芁に応じお、リンクず䟋を提䟛しおください。

ありがずうございたした

たた、メモリリヌクが発生しおいたす。 原因を突き止めたようです。
https://github.com/celery/celery/blob/master/celery/events/dispatcher.py#L75
このバッファは、りサギずの接続の問題の埌に倧きくなり始めるこずがわかりたす。 最終的にむベントをクリアできない理由がわかりたせん。時間の経過ずずもに成長し続け、RAMをたすたす消費したす。 ここでbuffer_while_offline=False枡すず、 https//github.com/celery/celery/blob/master/celery/worker/consumer/events.py#L43でリヌクが修正されたようです。 誰かがこれが関連しおいるかどうかを確認できたすか

@ yevhen-mどうもありがずうございたした それは私たちがメモリリヌクを解決するのに圹立ちたした

回避策があるのは良いこずですが、適切な修正を芋぀けるこずができたすか

このメモリリヌクの問題を継続的に远跡する

image

celery-pod-screencshot-lastweek

私は本番環境でセロリを䜿甚しおおり、Dockerを介しお展開しおいたす。
スクリヌンショットのように、同じ問題が発生しおいたす。
本番構成を以䞋に瀺したす。

Dockerの芪むメヌゞpython3.6.8-バスタヌ
セロリバヌゞョン4.2.0
コマンドオプション

  • 䞊行性4
  • プリフェッチ乗数8
  • result_backendはありたせん
  • acks_lateおよびreject_on_worker_lost

セロリのバヌゞョンを4.3.0にアップグレヌドするず、メモリリヌクの問題が解決するかどうか疑問に思いたす。

ありがずうございたした

セロリ4.4.0は最新の安定版です

チヌム、この問題に関する曎新はありたすか これはセロリ4.4.0で察凊され、修正されたしたか

チヌム、この問題に関する曎新はありたすか これはセロリ4.4.0で察凊され、修正されたしたか

残念だけど違う。 珟圚、察凊されおいたす。

チヌム、この問題に関する曎新はありたすか これはセロリ4.4.0で察凊され、修正されたしたか

4.4.1で利甚可胜になりたす

4.4.1で利甚可胜になりたす

珟圚のバヌゞョン4.4.1で修正されおいたすか

@auvipyこの問題は、

BROKER_POOL_LIMIT = None
CELERY_ACKS_LATE = False
CELERY_TRACK_STARTED = True
CELERYD_MAX_TASKS_PER_CHILD = 1
CELERYD_PREFETCH_MULTIPLIER = 1
BROKER_TRANSPORT_OPTIONS = {
    'fanout_prefix': True,
    'fanout_patterns': True,
    'visibility_timeout': 43200,
    'health_check_interval': 180,
    'socket_keepalive': True,
    'retry_on_timeout': True,
}

セロリワヌカヌは-O fair --without-heartbeat --without-gossip -c 1 -lフラグで開始されたす。 たた、 -n -Qフラグず

image

〜長時間実行されおいるタスクでは、倚くのハヌトビヌトの欠萜が芋られたす。 したがっお、リンクされた問題で報告された問題は匕き続き発生したす。〜

ハヌトビヌトが無効の堎合も同じです。

@jsynowiecこの問題に盎面したずき、私https://github.com/celery/celery/issues/4843#issuecomment -459789086

セロリ4.4.2ずredisでブロヌカヌずしお同じ問題が発生しおいたす。 セロリは48時間の間に、最終的にメモリが䞍足するたで最倧60GBのRAMを消費したす。
ここで名前を挙げた゜リュヌションはどれも、この動䜜に圱響を䞎えたせんでした。

セロリ4.4.2ずredisでブロヌカヌずしお同じ問題が発生しおいたす。 セロリは48時間の間に、最終的にメモリが䞍足するたで最倧60GBのRAMを消費したす。
ここで名前を挙げた゜リュヌションはどれも、この動䜜に圱響を䞎えたせんでした。

最新のパッチバヌゞョンを詊したしたか
OPず同じ条件はありたすか

v4.4.6でもメモリリヌクが発生したす。以前のコメントに蚘茉されお

image

+1、最小限の䜜業でさえ、メモリ䜿甚量が24時間にわたっお埐々に増加するこずに気づきたす。 この問題は再開されるべきだず思いたす。

あなたはあなたのメモリリヌクの原因をプロファむリングしお芋぀けるこずができたすか

v4.4.6でもメモリリヌクが発生したす。以前のコメントに蚘茉されお

image

これは別の問題であるか、修正が正しくなかったようです。
これでOPの問題が解決したので、おそらく別の問題ですよね

[2020-07-31 10:51:53,176: WARNING/MainProcess] /usr/local/lib/python3.8/site-packages/redis/client.py:90: size=19.2 KiB (+19.2 KiB), count=180 (+180), average=109 B
[2020-07-31 10:53:53,271: WARNING/MainProcess] /usr/local/lib/python3.8/site-packages/redis/client.py:90: size=230 KiB (+211 KiB), count=2160 (+1980), average=109 B
[2020-07-31 10:54:53,364: WARNING/MainProcess] /usr/local/lib/python3.8/site-packages/redis/client.py:90: size=250 KiB (+19.2 KiB), count=2340 (+180), average=109 B

...。

[2020-07-31 12:24:10,633: WARNING/MainProcess] /usr/local/lib/python3.8/site-packages/redis/client.py:90: size=49.9 MiB (+76.8 KiB), count=478620 (+720), average=109 B
[2020-07-31 12:25:14,528: WARNING/MainProcess] /usr/local/lib/python3.8/site-packages/redis/client.py:90: size=49.9 MiB (+19.2 KiB), count=478800 (+180), average=109 B
[2020-07-31 12:27:22,346: WARNING/MainProcess] /usr/local/lib/python3.8/site-packages/redis/client.py:90: size=49.9 MiB (+57.6 KiB), count=479340 (+540), average=109 B
[2020-07-31 12:28:26,265: WARNING/MainProcess] /usr/local/lib/python3.8/site-packages/redis/client.py:90: size=50.2 MiB (+269 KiB), count=481860 (+2520), average=109 B

CELERY_RESULT_BACKEND = False CELERY_IGNORE_RESULT = True CELERY_MAX_TASKS_PER_CHILD = 1 CELERY_WORKER_PREFETCH_MULTIPLIER = 1 CELERY_TASK_RESULT_EXPIRES = 10 CELERY_BROKER_POOL_LIMIT = 70 CELERY_REDIS_MAX_CONNECTIONS = 100
app.conf.broker_transport_options = {'visibility_timeout': 43200}

celery -A proj worker --concurrency=70 --prefetch-multiplier=1 -Ofair --pool=gevent -n --without-gossip --without-mingle

Redisクラむアントがメモリリヌクしおいたすか 私はセロリv4.4.6をgevent、redisをブロヌカヌずしお䜿甚しおおり、結果のバック゚ンドはありたせん。

倚分それも問題です。 倚分それはgeventにありたすか
CC @jamadden @andymccurdy
この問題を解決し、メモリがリヌクしおいないこずを確認するのを手䌝っおいただけたせんか。

倚分それはgeventにありたすか

geventは䜿甚しおいたせん。 ワヌカヌは、concurrency = 1およびpreforkで開始されたす。

こんにちは皆さん、この問題が解決された理由はわかりたせん。この問題は2幎間発生しおおり、毎回最新バヌゞョンのCeleryに曎新されおいたすが、倧きなサヌバヌ64〜128 GBのRAMでは垞にRAMが䞍足しおいたす。このメモリリヌクの問題の。

Celery 3にダりングレヌドしたり、Rabbitmqを眮き換えたりせずに、回避策はありたすか

これにより、Celeryは実皌働環境で完党に䞍安定になりたす。修正できるずいいのですが、Celery 3にダりングレヌドできないため、Celeryがサヌバヌ党䜓のRAMを消費する心配をなくすために、別の゜リュヌションおそらくDramatiqに移行するこずを蚈画しおいたす。 2日ごずの生産。

@ arielcamino-蚭定worker_max_tasks_per_childを䜿甚しお、少なくずも私のサヌバヌでは、メモリ䜿甚量を維持するのに

@Skowtうわヌ、それはずおも圹に立ちたす、どうもありがずう 今すぐ詊しおみたす。

@ arielcamino-蚭定worker_max_tasks_per_childを䜿甚しお、少なくずも私のサヌバヌでは、メモリ䜿甚量を維持するのに

回避策を共有しおいただきありがずうございたす。 これはここでは圹に立ちたせんでした-しかし、私たちはredisを䜿甚しおいたす。

@ thedrowredis-pyでのメモリリヌクを認識しおいたせん。 redis-pyにリヌクがあった堎合、誰かがCelery環境の倖でリヌクに遭遇し、redis-py問題远跡システムに報告したず思いたす。

できる限りサポヌトさせおいただきたすいく぀かのプロゞェクトでブロヌカヌずしおCelery w / Redisを䜿甚しおいたすが、展開でこの問題が発生したこずはありたせん。

珟圚のバヌゞョンのgeventでメモリリヌクが発生しおいるこずに気づいおいたせん。 私は、誰かがそれに遭遇した堎合、誰かが䜕かを蚀ったであろうず思いたすそれは以前に1回か2回起こったこずがありたす。 私の珟圚のgeventの展開では、geventを頻繁に䜿甚しお、䞀床に耇数のワヌカヌWebずバックグラりンドが数週間皌働しおおり、メモリリヌクは発生しおいたせん。

こんにちは皆さん、この問題が解決された理由はわかりたせん。この問題は2幎間発生しおおり、毎回最新バヌゞョンのCeleryに曎新されおいたすが、倧きなサヌバヌ64〜128 GBのRAMでは垞にRAMが䞍足しおいたす。このメモリリヌクの問題の。

Celery 3にダりングレヌドしたり、Rabbitmqを眮き換えたりせずに、回避策はありたすか

これにより、Celeryは実皌働環境で完党に䞍安定になりたす。修正できるずいいのですが、Celery 3にダりングレヌドできないため、Celeryがサヌバヌ党䜓のRAMを消費する心配をなくすために、別の゜リュヌションおそらくDramatiqに移行するこずを蚈画しおいたす。 2日ごずの生産。

䜕人の劎働者がいたすか いく぀のタスクを実行したすか このタスクを実行する頻床ず、通垞、完了するたでにかかる時間はどれくらいですか。

Rabbitmq / celeryが倧量のRAMを䜿甚し始める理由は、キュヌに入れられたタスクの量に関連しおいる可胜性がありたす。 キュヌに入れるタスクが倚すぎおワヌカヌがすべおを完了できない堎合、キュヌが拡倧し、このキュヌはたすたす倚くのRAMを䜿甚し、最終的には䜿甚可胜なすべおのRAMを消費したす。 この問題はRedisでも発生する可胜性があるず思いたす。

私には別の理論がありたすが、最初にこれがあなたの問題の理由であるかどうかを知りたいです。

@ardilom申し蚳ありたせんが、RabbitMQデヌタをdatadogに送信しおいないこずに気づきたしたが、状況を明確にしようず思いたす。これは、䞀郚のサヌバヌのRAMが2日ごずにダりンする方法です。
memory-leaks-1

保留䞭のタスクの数を垞にチェックしおおり、通垞は玄0ですこのデヌタは数日前のものです。

memory-leaks-2

1日あたり玄250,000のタスクを実行し、玄10人のワヌカヌがいお、それぞれが玄4〜10の同時実行性を持ち、平均実行時間は玄5秒です。これは、タスクの皮類によっお異なりたす。

私たちは垞にmessages_readyをチェックしお、キュヌに入れられおいるタスクが倚すぎないこずを確認したすか 最終的にはいく぀かのピヌクがありたすが、通垞、これらは0に近い倀です。

この問題を解決するには、Celeryワヌカヌを手動で再起動するだけで、RAMの䜿甚量が再び正垞になりたす。

他に䜕か必芁な堎合はお知らせください。構成を適甚した埌、タスクサヌバヌの1぀で

ありがずう

こんにちはみんな、これは私の堎合、 worker_max_tasks_per_childを1000に倉曎しお問題を修正したこずを確認するためです🎉ありがずう@Skowt

昚日蚀及しなかったこずがありたすが、私は「プリフォヌク」モヌドを䜿甚しおいたす。おそらく、geventに移行するこずが問題を解決する別の方法です。

@arielcamino特定のメモリリヌクを解決したため、この問題は解決されたした。 メモリリヌクの別の原因はただ芋぀かっおいたせん。 問題があるこずはわかっおいたすが、それを再珟する方法がわかりたせん。
問題をデバッグするには、バグが再珟される本番環境にアクセスできる人が必芁です。
ない堎合は、この問題が実行可胜ではないず刀断する必芁がありたす。

こんにちは、この問題を再開できたすか celery == 4.4.7rabbitmqを䜿甚を䜿甚するず、同様のリヌクが発生したす。ワヌカヌは数時間、堎合によっおはそれ以䞊安定しお実行されたす。その埌、突然リヌクが始たり、すべおのメモリを䜿甚するこずになりたす。

珟圚、 --concurrency=1ずフラグ--max-tasks-per-child=100でpreforkを䜿甚しおいたすが、芪プロセスがリヌクしおいるように芋えるため、圹に立たないようです。

celery_leak

この問題のデバッグに圹立぀詳现情報を提䟛できたす。

こんにちは、この問題を再開できたすか celery == 4.4.7rabbitmqを䜿甚を䜿甚するず、同様のリヌクが発生したす。ワヌカヌは数時間、堎合によっおはそれ以䞊安定しお実行されたす。その埌、突然リヌクが始たり、すべおのメモリを䜿甚するこずになりたす。

珟圚、 --concurrency=1ずフラグ--max-tasks-per-child=100でpreforkを䜿甚しおいたすが、芪プロセスがリヌクしおいるように芋えるため、圹に立たないようです。

celery_leak

この問題のデバッグに圹立぀詳现情報を提䟛できたす。

問題を再開するこずは倧したこずではありたせん。本番環境でこれに盎面しおいる誰かの利益であり、修正を远跡しお貢献するか、少なくずも本番環境でのリヌクの根本原因を芋぀けるのに圹立ちたす。

私は間違いなく助けるこずができたすが、私は䜕をすべきかに぀いおのアむデアを少し䜿い果たしたした、私はいく぀かのツヌルを実行したしたが、問題に぀いお倚くを特定するこずができたせんでした。 ちょっず絞り蟌んだのは、私が撮ったtracemallocスナップショットだけです。これは、同じ堎所で数分ごずにメモリが増加しおいるこずを瀺しおいたす。 これは、2぀のスナップショットを比范したトップ10です。

/usr/local/lib/python3.8/site-packages/celery/events/dispatcher.py:148: size=259 KiB (+218 KiB), count=1026 (+867), average=259 B
/usr/local/lib/python3.8/site-packages/kombu/messaging.py:178: size=231 KiB (+194 KiB), count=1056 (+888), average=224 B
/usr/local/lib/python3.8/site-packages/amqp/connection.py:513: size=217 KiB (+182 KiB), count=703 (+591), average=316 B
/usr/local/lib/python3.8/site-packages/celery/events/dispatcher.py:214: size=207 KiB (+174 KiB), count=704 (+592), average=302 B
/usr/local/lib/python3.8/site-packages/kombu/messaging.py:200: size=204 KiB (+171 KiB), count=704 (+592), average=296 B
/usr/local/lib/python3.8/site-packages/amqp/transport.py:253: size=203 KiB (+171 KiB), count=703 (+591), average=296 B
/usr/local/lib/python3.8/site-packages/amqp/connection.py:508: size=184 KiB (+154 KiB), count=703 (+591), average=268 B
/usr/local/lib/python3.8/site-packages/celery/worker/consumer/consumer.py:445: size=182 KiB (+153 KiB), count=352 (+296), average=528 B
/usr/local/lib/python3.8/site-packages/amqp/channel.py:1758: size=169 KiB (+143 KiB), count=703 (+593), average=247 B
/usr/local/lib/python3.8/site-packages/kombu/asynchronous/hub.py:301: size=167 KiB (+140 KiB), count=351 (+295), average=486 B

問題はただ存圚したす
これは、セロリタスクがアプリコンテキストにアクセスしお機胜を実行するずきに発生したす
タスクの実行埌に解攟たたは砎棄されたせん

--max-tasks-per-child=

圹に立たなかった

こんにちは、この問題を再開できたすか celery == 4.4.7rabbitmqを䜿甚を䜿甚するず、同様のリヌクが発生したす。ワヌカヌは数時間、堎合によっおはそれ以䞊安定しお実行されたす。その埌、突然リヌクが始たり、すべおのメモリを䜿甚するこずになりたす。
珟圚、 --concurrency=1ずフラグ--max-tasks-per-child=100でpreforkを䜿甚しおいたすが、芪プロセスがリヌクしおいるように芋えるため、圹に立たないようです。
celery_leak
この問題のデバッグに圹立぀詳现情報を提䟛できたす。

問題を再開するこずは倧したこずではありたせん。本番環境でこれに盎面しおいる誰かの利益であり、修正を远跡しお貢献するか、少なくずも本番環境でのリヌクの根本原因を芋぀けるのに圹立ちたす。

--max-tasks-per-child远加するず、機胜したす。
このサンプル匕数のように--autoscale=5,2 --max-tasks-per-child=40結果は次のようになりたす

Screenshot 2020-08-13 at 2 26 13 PM

最近のセロリのアップグレヌドによっおメモリリヌクが発生したず思いたすが、完党に自信はありたせん。 次の蚭定でリヌクが解決したこずを共有したす。

ドキュメントでどの蚭定が有効かわからないので、Django蚭定ファむルでこれらすべおの倀を蚭定しおいたす。

CELERY_CONCURRENCY = CELERY_WORKER_CONCURRENCY = 1
CELERY_MAX_TASKS_PER_CHILD = CELERY_WORKER_MAX_TASKS_PER_CHILD = 1

これは、geventプヌルでも発生するため、発生しおいるリヌクを解決したせん。 私が気付いたのは、celeryevキュヌが非垞に混雑しおいるこずです。 tracemallocは、リヌクの考えられる原因の1぀ずしおむベントのディスパッチを瀺したため、タスクむベントを明瀺的に無効にし、flowerむンスタンスをオフにしたした。今のずころ、リヌクは発生しおいないようです。週末に実行しお共有したす。ここに結果がありたす。

リヌクの考えられる原因タスクむベントを明瀺的に無効にし、flowerむンスタンスをオフにしたした

早い段階からこの問題を黙っお芋おいるそしお盎接経隓したこずがない誰かからの逞話的なデヌタポむント䞊蚘を実行したずきに同じ結果が埗られた別のプロゞェクトセロリの䜜業負荷がそれほど倧きくないを知っおいたすメモリリヌクを停止したす。 䞭叀の情報しかないので、それが同じ根本的な問題であるかどうかは_明らかに_確認できたせんAFAIKはrabbitmqであり、geventに぀いおはわかりたせんが、盞関しおいるのは興味深いこずです。

私はそれがどういうわけかrabbitmq接続ず関係があるず思いたす、私たちがこのリヌクを芳察しおいるスタック

  • セロリ最新バヌゞョンプリフォヌクたたはゲむベントプヌルのいずれかで、どちらも同じリヌクパタヌンを瀺したす。
  • rabbitmqcloudamqp SaaS
  • 花

すべおのタスクでリヌクをチェックしたしたが、リヌクは芋぀かりたせんでした。そのため、セロリ偎にいるのではないかず疑っおいたす。

興味深い事実の1぀は、珟圚倚くのワヌカヌが実行されおいるこずです。リヌクが開始されるず、花にもオフラむンずしお衚瀺されるこずに気付きたした。

どこを芋ればよいかわからなくなったので、フラワヌむベントずタスクむベントを無効にし、リヌクが再発するかどうかを監芖し続けたす。

この時点でメモリリヌクが発生しおいるのは、スタックの別の郚分であるず私は信じおいたす。 セロリは過去に偶然の行動を起こし、メモリリヌクの制埡に貢献した可胜性がありたすが、私たち党員がそれを確認するのに十分な同様の問題を抱えおいるようには芋えたせん。 私たちの倚くがどちらかを実行しおいるこずを知っおいたす...

  • 䞀床に膚倧な数のネストされたタスク、たたは
  • ワヌカヌ内でマルチコア凊理を開始するいく぀かのモノリシック

このような堎合、特定のレベルの同時実行性、タスクキュヌむング、およびチャむルドワヌカヌごずのタスクを蚱可たたは犁止するこずに぀いお賢明である必芁がありたす。 さらに、サヌバヌをクラッシュさせる前に、メモリを倧量に消費するタスクを匷制終了できる組み蟌みのセヌフガヌドを䜿甚する必芁がありたす。

たすたす倚くの人々がセロリで重いCPUバりンドおよびメモリバりンドプロセスを実行しおいたすが、それは実際には意図されおいなかったので、クむックスタヌトドキュメントにはこれに関する詳现を含める必芁があるず思いたす。

すでに私の以前のコメントで述べたように、我々は䞡方で劎働者を実行しおいるmax-tasks-per-childず同時実行セットに1ずっず前から。 メモリリヌクに぀いおは䜕もしたせん。 さらに、ブロヌカヌず結果のバック゚ンドの䞡方ずしおRedisを䜿甚しおいたす。

私の芳察によるず、RabbitMQをブロヌカヌずしお䜿甚する堎合、 max-tasks-per-childを1するず、メモリリヌクが「解決」される可胜性が高く、セロリではなくタスクの実装に問題がある可胜性がありたす。

私たちが芳察し、報告しおいるものは異なりたす。 1぀のタスクを凊理せずに、ワヌカヌを数日間アむドル状態のたたにしおも、メモリ制限に達しおスヌパヌバむザヌによっお匷制終了されるたでメモリリヌクが発生したす。 あなたは以前のコメントでより倚くの詳现ず蚘憶チャヌトを芋぀けるこずができたす。

ワヌカヌが1぀のタスクをスケゞュヌルどおりに凊理するず、メモリチャヌトは倚かれ少なかれ方圢波のように衚瀺されたすが、党䜓的なメモリ䜿甚量が増えるだけであるこずがはっきりずわかりたす。
Screenshot 2020-08-14 at 20 42 24

セロリ劎働者のプロファむリングをロヌドマップに茉せるこずができたした。 これに取り組み始めるずきに、メモリダンプず詳现を共有したす。

花をオフにするそしお蚭定を通じおタスクむベントを明瀺的に無効にするこずでリヌクが修正されたこずを確認できたす。

さっきも蚀ったように、䜜業員が挏れ始めた瞬間、花がオフラむンになり、セレリ゚フはい぀も忙しいので、簡単な方法で花を消したした。

残念ながら、リヌクの原因ずなるコヌドは芋぀かりたせんでした。 しかし、少なくずもこの回避策はありたす。

それならおそらくこれはセロリの問題ではなく花ですか

@auvipy flowerが問題を匕き起こしたすが、リヌクは間違いなくワヌカヌセロリで発生したす

@auvipy flowerが問題を匕き起こしたすが、リヌクは間違いなくワヌカヌセロリで発生したす

けっこうだ。 共有しおくれおありがずう。

私はRedisずFlowerでCeleryを䜿甚しおいたすが、珟圚メモリの問題は発生しおいないず蚀わざるを埗たせん。 デヌタに関しお私に䜕か欲しいものはありたすか

@auvipyはFlowerを䜿甚しおいたせん。 ワヌカヌは、むベントを無効にしお開始されたす。

@auvipyはFlowerを䜿甚しおいたせん。 ワヌカヌは、むベントを無効にしお開始されたす。

デバッグしお、メモリリヌクの原因を芋぀けおください。 セロリかあなたの可胜性がありたす。 ナニットテストず統合テストを共有できれば最高です

デバッグしお、メモリリヌクの原因を芋぀けおください。 セロリかあなたの可胜性がありたす。 ナニットテストず統合テストを共有できれば最高です

ここで蚀及し
䌚瀟のIPが公開されるため、ナニットテストたたは統合テストを共有できたせん。 ごめんなさい。 しかし、瀟内ロヌドマップに本番ワヌカヌのメモリダンプをキャプチャするタスクを远加するこずができたした。 完了したら、いく぀かのシナリオのカりンタヌず参照を共有したす。

@jsynowiec 5.0.0 GAより前に䜜成できる堎合曎新に぀いおは6266に埓っおください、それは玠晎らしいこずです。

バグ修正がマスタヌに到達するず、4.xにもバックポヌトされたす。

@thedrow 5.0のGA

1぀のリリヌスブロッカヌずいく぀かのドキュメントがありたす。
答えはすぐです。

花を消すず挏れが止たるこずが確認できたす。 ほが1か月間、リヌクなしで皌働しおいたす。

そのため、むベント公開メカニズムのどこかにただバグがありたす。
誰かがそれが䜕であるかに぀いおの考えを持っおいたすか

Flowerは䜿甚せず、ワヌカヌは--eventsなしで開始されたすが、メモリリヌクが継続的に発生したす。

答えはすぐです。

プロダクションワヌカヌからのメモリダンプずオブゞェクトカりンタヌの取埗に高い優先床を割り圓おるこずができたした。 次の数週間でいく぀かのデヌタを投皿できるようになるはずです。 たた、Python 3を䜿甚しおすべおを実行し、プロファむリングする必芁があるように、py2-> py3移怍を完了するこずの優先床を䞊げたした。

私が心配しおいるのは、ここで2぀の異なる問題に぀いお話しおいるずいうこずです。

どうやら。 1぀はむベントに関連しおおり、おそらくFlowerであり、ブロヌカヌずしおRabbitMQを䜿甚しおいる可胜性もありたす。 ここで報告されおいる問題によるず、GitHubでは、数幎前からあちこちに衚瀺されおいたす。 もう1぀私のプロゞェクトに圱響を䞎えるは、さたざたなコンポヌネントに関連しおおり、Redisをブロヌカヌずしお䜿甚するこずに関連しおいる可胜性がありたす。 たたは、おそらく根本的に、それらは🀷🏌を知っおいる同じコヌドに起因する同じ問題です。 trailがサブタスクを远跡し、 AsyncResultむンスタンスをリヌクしおいるようなものです😉

@ thedrow @ auvipyワヌカヌのメモリプロファむリングに移行しおいるこずをお知らせしたす。

たた、Python3の移行を完了しおいるずきに、 https//github.com/celery/celery/issues/4470たたはhttps://github.com/celery/celery/issues/5359に関連しおいるず思われる別の問題が発生したしたjoin_nativeぞの呌び出しが無期限にハングしたす。 クむックstraceは、文字通り読み取りにハングアップしおいるこずを瀺しおいたす。これは、䜎レベルのカヌネル/ラむブラリのものを瀺しおいる可胜性がありたす。 今のずころ、メモリリヌクに焊点を合わせおいるため、プレヌンに切り替えおjoinをプヌルしたした。

みなさん、こんにちは-最埌に_some_デヌタ celery-memtrace-1.tar.xz 、眲名、私の鍵。

アヌカむブには、玄16日埌の8人のワヌカヌからのtracemallocログ、その期間のメモリ䜿甚量グラフ、およびいく぀かのバヌゞョン情報Celeryスタヌトアップバナヌを含むが含たれおいたす。

私は正盎なずころ、これを分析するのにかなりの時間を費やしおいたせんが、aコヌドがリストに含たれおいなかった、bどこでも䜿甚しおいるSQLAlchemyずの奇劙な盞互䜜甚である可胜性があるため、問題が発生するこずは䞍可胜ではありたせん他の堎所にあるか、組み合わせ/盞互䜜甚の問題です。

他の詳现が圹立぀堎合は、お問い合わせください。 たた、このメモリ䜿甚量ログを䜿甚しおこれらの8぀のワヌカヌを匕き続き実行するため、より倚くの/より良いデヌタを収集できる可胜性がありたす。

線集このスレッドからのこのコメントも関連しおいたす-私たちはただ同じ蚭定を䜿甚しおいたす。

このリヌクの根本的な原因を芋぀けおいただければ幞いです。
これを自分で掘り䞋げる時間を䜜っおみたす。

これが問題の軜枛に圹立぀のではないかず思いたす。
https://reliability.substack.com/p/run-python-servers-more-efficiently

メモリリヌクの原因がセロリ自䜓ではなくリク゚ストラむブラリ内にある可胜性を調査しおいたす。 タスクのリク゚ストを䜿甚しおセロリのメモリリヌクを経隓しおいる他の人はいたすか

@ErrorInPersonaはい、リク゚ストの有無にかかわらず、ワヌカヌにOOMを登録しおいたす。

@drbig運がいいですか

Screenshot_2020-11-17_12-56-28

さお、「緑のもの」を芋おください。床はゆっくりず、しかし確実に䞊昇しおいたす...ですから、残念ながら、「うん、それはただ問題です」ずいう簡単な確認を陀いお、私の偎から远加するこずはあたりありたせん。

ただし、 @ thedrowが提䟛するリンクを- try running some workers with jemalloc forced inが含たれるようになったので、_最終的に_それに぀いお説明したす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡