Celeryã®ã¯ãŒã«ãŒã®èŠªããã»ã¹ã§ã¡ã¢ãªãªãŒã¯ãçºçããŠããŸãã
ã¿ã¹ã¯ãå®è¡ããåããã»ã¹ã§ã¯ãããŸããã
ããã¯æ°æ¥ããšã«çªç¶èµ·ãããŸãã
Celeryãåæ¢ããªãéãããµãŒããŒã®ã¡ã¢ãªãæ°åæéã§æ¶è²»ããŸãã
ãã®åé¡ã¯ãå°ãªããšãCelery 4.1ã§çºçããCelery4.2ã§ãçºçããŸãã
Celeryã¯Ubuntu16ã§å®è¡ãããŠããããããŒã«ãŒã¯RabbitMQã䜿çšããŸãã
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ã䜿çšããŠãããšãã¯ããã®ãããªåé¡ã¯çºçããŸããã§ããã
ããã§åãåé¡
ãã®åé¡ã®ãããæ°æ¥ããšã«ã¯ãŒã«ãŒãåèµ·åããå¿
èŠããããŸã
ãã°ã«ã¯éèŠãªæãããã¯ãããŸããããåæ¥ç¶ã圱é¿ãäžããå¯èœæ§ãããã®ã§ã¯ãªãããšçã£ãŠããŸãã ã¡ã¢ãªã絶ããå¢å ãå§ããæéã®ã©ããã«ãã°ãšã³ããªãåæ¥ç¶ããŠããã®ã§
ç§ã®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}
åºæ¬çã«ãããã¯æ°ãããããã€ãããããŒãã§ãã 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å°ã®ãµãŒããŒã§ã¯ãŒã«ãŒãå®è¡ããŠããŸãã
æšæ¥ã¡ã¢ãªãªãŒã¯ãçºçããŸããããã»ãŒãã¹ãŠã®ãµãŒããŒã§åæã«çºçããŠããŸãã
é¢é£ããŠãããã©ããããããªãã®ã§ã圹ç«ã€å Žåã«åããŠããã«æ®ããŠãããŸãã
ã»ããªãš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 ïŒ
åãåé¡ããããŸãã¡ã¢ãªãªãŒã¯
èšæ¶
ããŒãžã§ã³
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
æåžã€ã³ããŒããã¥ãŒã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
ã§å®è¡ããŠãŽã·ãããç¡å¹ã«ããããš
ããªãã¯ããã§ãããèŠãããšãã§ããŸãïŒ
ã»ããªã¯ãŒã«ãŒãå®è¡ããŠãã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ãšã»ãŒåãé床ã§ãªãŒã¯ããŠããããã§ãã
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,
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
æ·»ä»ã®ç»åã§ã¯ã次ã®ããšãããããŸãã
æŽæ°
ãã®åé¡ã«é¢ä¿ãªããPython 3.6ã«ã¢ããã°ã¬ãŒãããŸããããã以éããªãŒã¯ã¯çºçããªããªã£ãããã§ãã
ïŒã¢ããã°ã¬ãŒãã¯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ãšåãæ¹æ³ã§ãªãŒã¯ããŠããããã§ãã
ã»ããª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人ããªãŒã¯ãéå§ããŸãã
ããã§ã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åç®ã®ã©ã³ãã§ãã
ããŒãããŒããªãã§ãã¹ãããŸãã
æŽæ°ïŒ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
æŽæ°ïŒ
ã»ããª4.3.0ã䜿çšãããšãåé¡ã¯è§£æ±ºããããã§ã1é±éããå®å®ããŠããŸãã
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ã©ããããããšãããããŸããïŒ ããã¯ç§ãã¡ãã¡ã¢ãªãªãŒã¯ã解決ããã®ã«åœ¹ç«ã¡ãŸããïŒ
åé¿çãããã®ã¯è¯ãããšã§ãããé©åãªä¿®æ£ãèŠã€ããããšãã§ããŸããïŒ
ãã®ã¡ã¢ãªãªãŒã¯ã®åé¡ãç¶ç¶çã«è¿œè·¡ãã
ç§ã¯æ¬çªç°å¢ã§ã»ããªã䜿çšããŠãããDockerãä»ããŠå±éããŠããŸãã
ã¹ã¯ãªãŒã³ã·ã§ããã®ããã«ãåãåé¡ãçºçããŠããŸãã
æ¬çªæ§æã以äžã«ç€ºããŸãã
Dockerã®èŠªã€ã¡ãŒãžïŒpython3.6.8-ãã¹ã¿ãŒ
ã»ããªããŒãžã§ã³ïŒ4.2.0
ã³ãã³ããªãã·ã§ã³ïŒ
ã»ããªã®ããŒãžã§ã³ã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
ãã©ã°ãš
ãé·æéå®è¡ãããŠããã¿ã¹ã¯ã§ã¯ãå€ãã®ããŒãããŒãã®æ¬ èœãèŠãããŸãã ãããã£ãŠããªã³ã¯ãããåé¡ã§å ±åãããåé¡ã¯åŒãç¶ãçºçããŸããã
ããŒãããŒããç¡å¹ã®å Žåãåãã§ãã
@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ã§ãã¡ã¢ãªãªãŒã¯ãçºçããŸãã以åã®ã³ã¡ã³ãã«èšèŒãããŠ
+1ãæå°éã®äœæ¥ã§ãããã¡ã¢ãªäœ¿çšéã24æéã«ããã£ãŠåŸã ã«å¢å ããããšã«æ°ã¥ããŸãã ãã®åé¡ã¯åéãããã¹ãã ãšæããŸãã
ããªãã¯ããªãã®ã¡ã¢ãªãªãŒã¯ã®åå ããããã¡ã€ãªã³ã°ããŠèŠã€ããããšãã§ããŸããïŒ
v4.4.6ã§ãã¡ã¢ãªãªãŒã¯ãçºçããŸãã以åã®ã³ã¡ã³ãã«èšèŒãããŠ
ããã¯å¥ã®åé¡ã§ããããä¿®æ£ãæ£ãããªãã£ãããã§ãã
ããã§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æ¥ããšã«ããŠã³ããæ¹æ³ã§ãã
ä¿çäžã®ã¿ã¹ã¯ã®æ°ãåžžã«ãã§ãã¯ããŠãããéåžžã¯çŽ0ã§ãïŒãã®ããŒã¿ã¯æ°æ¥åã®ãã®ã§ãïŒã
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 == 4.4.7ïŒrabbitmqã䜿çšïŒã䜿çšãããšãåæ§ã®ãªãŒã¯ãçºçããŸããã¯ãŒã«ãŒã¯æ°æéãå Žåã«ãã£ãŠã¯ãã以äžå®å®ããŠå®è¡ãããŸãããã®åŸãçªç¶ãªãŒã¯ãå§ãŸãããã¹ãŠã®ã¡ã¢ãªã䜿çšããããšã«ãªããŸãã
çŸåšã
--concurrency=1
ãšãã©ã°--max-tasks-per-child=100
ã§preforkã䜿çšããŠããŸããã芪ããã»ã¹ããªãŒã¯ããŠããããã«èŠããããã圹ã«ç«ããªãããã§ãããã®åé¡ã®ãããã°ã«åœ¹ç«ã€è©³çŽ°æ å ±ãæäŸã§ããŸãã
åé¡ãåéããããšã¯å€§ããããšã§ã¯ãããŸãããæ¬çªç°å¢ã§ããã«çŽé¢ããŠãã誰ãã®å©çã§ãããä¿®æ£ã远跡ããŠè²¢ç®ããããå°ãªããšãæ¬çªç°å¢ã§ã®ãªãŒã¯ã®æ ¹æ¬åå ãèŠã€ããã®ã«åœ¹ç«ã¡ãŸãã
ç§ã¯ééããªãå©ããããšãã§ããŸãããç§ã¯äœããã¹ããã«ã€ããŠã®ã¢ã€ãã¢ãå°ã䜿ãæãããŸãããç§ã¯ããã€ãã®ããŒã«ãå®è¡ããŸããããåé¡ã«ã€ããŠå€ããç¹å®ããããšãã§ããŸããã§ããã ã¡ãã£ãšçµã蟌ãã ã®ã¯ãç§ãæ®ã£ã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ã䜿çšããŠããŸããã芪ããã»ã¹ããªãŒã¯ããŠããããã«èŠããããã圹ã«ç«ããªãããã§ãã
ãã®åé¡ã®ãããã°ã«åœ¹ç«ã€è©³çŽ°æ å ±ãæäŸã§ããŸããåé¡ãåéããããšã¯å€§ããããšã§ã¯ãããŸãããæ¬çªç°å¢ã§ããã«çŽé¢ããŠãã誰ãã®å©çã§ãããä¿®æ£ã远跡ããŠè²¢ç®ããããå°ãªããšãæ¬çªç°å¢ã§ã®ãªãŒã¯ã®æ ¹æ¬åå ãèŠã€ããã®ã«åœ¹ç«ã¡ãŸãã
--max-tasks-per-child
è¿œå ãããšãæ©èœããŸãã
ãã®ãµã³ãã«åŒæ°ã®ããã«--autoscale=5,2 --max-tasks-per-child=40
çµæã¯æ¬¡ã®ããã«ãªããŸã
æè¿ã®ã»ããªã®ã¢ããã°ã¬ãŒãã«ãã£ãŠã¡ã¢ãªãªãŒã¯ãçºçãããšæããŸãããå®å šã«èªä¿¡ã¯ãããŸããã 次ã®èšå®ã§ãªãŒã¯ã解決ããããšãå ±æããŸãã
ããã¥ã¡ã³ãã§ã©ã®èšå®ãæå¹ãããããªãã®ã§ã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æ¥ç¶ãšé¢ä¿ããããšæããŸããç§ãã¡ããã®ãªãŒã¯ã芳å¯ããŠããã¹ã¿ãã¯ïŒ
ãã¹ãŠã®ã¿ã¹ã¯ã§ãªãŒã¯ããã§ãã¯ããŸãããããªãŒã¯ã¯èŠã€ãããŸããã§ããããã®ãããã»ããªåŽã«ããã®ã§ã¯ãªãããšçã£ãŠããŸãã
èå³æ·±ãäºå®ã®1ã€ã¯ãçŸåšå€ãã®ã¯ãŒã«ãŒãå®è¡ãããŠããããšã§ãããªãŒã¯ãéå§ããããšãè±ã«ããªãã©ã€ã³ãšããŠè¡šç€ºãããããšã«æ°ä»ããŸããã
ã©ããèŠãã°ãããããããªããªã£ãã®ã§ããã©ã¯ãŒã€ãã³ããšã¿ã¹ã¯ã€ãã³ããç¡å¹ã«ãããªãŒã¯ãåçºãããã©ãããç£èŠãç¶ããŸãã
ãã®æç¹ã§ã¡ã¢ãªãªãŒã¯ãçºçããŠããã®ã¯ãã¹ã¿ãã¯ã®å¥ã®éšåã§ãããšç§ã¯ä¿¡ããŠããŸãã ã»ããªã¯éå»ã«å¶ç¶ã®è¡åãèµ·ãããã¡ã¢ãªãªãŒã¯ã®å¶åŸ¡ã«è²¢ç®ããå¯èœæ§ããããŸãããç§ãã¡å šå¡ãããã確èªããã®ã«ååãªåæ§ã®åé¡ãæ±ããŠããããã«ã¯èŠããŸããã ç§ãã¡ã®å€ããã©ã¡ãããå®è¡ããŠããããšãç¥ã£ãŠããŸã...
ãã®ãããªå Žåãç¹å®ã®ã¬ãã«ã®åæå®è¡æ§ãã¿ã¹ã¯ãã¥ãŒã€ã³ã°ãããã³ãã£ã€ã«ãã¯ãŒã«ãŒããšã®ã¿ã¹ã¯ãèš±å¯ãŸãã¯çŠæ¢ããããšã«ã€ããŠè³¢æã§ããå¿ èŠããããŸãã ããã«ããµãŒããŒãã¯ã©ãã·ã¥ãããåã«ãã¡ã¢ãªã倧éã«æ¶è²»ããã¿ã¹ã¯ã匷å¶çµäºã§ããçµã¿èŸŒã¿ã®ã»ãŒãã¬ãŒãã䜿çšããå¿ èŠããããŸãã
ãŸããŸãå€ãã®äººã ãã»ããªã§éãCPUããŠã³ãããã³ã¡ã¢ãªããŠã³ãããã»ã¹ãå®è¡ããŠããŸãããããã¯å®éã«ã¯æå³ãããŠããªãã£ãã®ã§ãã¯ã€ãã¯ã¹ã¿ãŒãããã¥ã¡ã³ãã«ã¯ããã«é¢ãã詳现ãå«ããå¿ èŠããããšæããŸãã
ãã§ã«ç§ã®ä»¥åã®ã³ã¡ã³ãã§è¿°ã¹ãããã«ãæã
ã¯äž¡æ¹ã§åŽåè
ãå®è¡ããŠããmax-tasks-per-child
ãšåæå®è¡ã»ããã«1
ãã£ãšåããã ã¡ã¢ãªãªãŒã¯ã«ã€ããŠã¯äœãããŸããã ããã«ããããŒã«ãŒãšçµæã®ããã¯ãšã³ãã®äž¡æ¹ãšããŠRedisã䜿çšããŠããŸãã
ç§ã®èŠ³å¯ã«ãããšãRabbitMQããããŒã«ãŒãšããŠäœ¿çšããå Žåã max-tasks-per-child
ã1
ãããšãã¡ã¢ãªãªãŒã¯ãã解決ããããå¯èœæ§ãé«ããã»ããªã§ã¯ãªãã¿ã¹ã¯ã®å®è£
ã«åé¡ãããå¯èœæ§ããããŸãã
ç§ãã¡ã芳å¯ããå ±åããŠãããã®ã¯ç°ãªããŸãã 1ã€ã®ã¿ã¹ã¯ãåŠçããã«ãã¯ãŒã«ãŒãæ°æ¥éã¢ã€ãã«ç¶æ ã®ãŸãŸã«ããŠããã¡ã¢ãªå¶éã«éããŠã¹ãŒããŒãã€ã¶ãŒã«ãã£ãŠåŒ·å¶çµäºããããŸã§ã¡ã¢ãªãªãŒã¯ãçºçããŸãã ããªãã¯ä»¥åã®ã³ã¡ã³ãã§ããå€ãã®è©³çŽ°ãšèšæ¶ãã£ãŒããèŠã€ããããšãã§ããŸãã
ã¯ãŒã«ãŒã1ã€ã®ã¿ã¹ã¯ãã¹ã±ãžã¥ãŒã«ã©ããã«åŠçãããšãã¡ã¢ãªãã£ãŒãã¯å€ããå°ãªããæ¹åœ¢æ³¢ã®ããã«è¡šç€ºãããŸãããå
šäœçãªã¡ã¢ãªäœ¿çšéãå¢ããã ãã§ããããšãã¯ã£ãããšããããŸãã
ã»ããªåŽåè ã®ãããã¡ã€ãªã³ã°ãããŒããããã«èŒããããšãã§ããŸããã ããã«åãçµã¿å§ãããšãã«ãã¡ã¢ãªãã³ããšè©³çŽ°ãå ±æããŸãã
è±ããªãã«ããïŒãããŠèšå®ãéããŠã¿ã¹ã¯ã€ãã³ããæ瀺çã«ç¡å¹ã«ããïŒããšã§ãªãŒã¯ãä¿®æ£ãããããšã確èªã§ããŸãã
ãã£ããèšã£ãããã«ãäœæ¥å¡ãæŒãå§ããç¬éãè±ããªãã©ã€ã³ã«ãªããã»ã¬ãªãšãã¯ãã€ãå¿ããã®ã§ãç°¡åãªæ¹æ³ã§è±ãæ¶ããŸããã
æ®å¿µãªããããªãŒã¯ã®åå ãšãªãã³ãŒãã¯èŠã€ãããŸããã§ããã ããããå°ãªããšããã®åé¿çã¯ãããŸãã
ãããªãããããããã¯ã»ããªã®åé¡ã§ã¯ãªãè±ã§ããïŒ
@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éãããã§ããïŒ
ããŠããç·ã®ãã®ããèŠãŠãã ãããåºã¯ãã£ãããšãããã確å®ã«äžæããŠããŸã...ã§ããããæ®å¿µãªãããããããããã¯ãŸã åé¡ã§ãããšããç°¡åãªç¢ºèªãé€ããŠãç§ã®åŽããè¿œå ããããšã¯ããŸããããŸããã
ãã ãã @ thedrowãæäŸãããªã³ã¯ã- try running some workers with jemalloc forced in
ãå«ãŸããããã«ãªã£ãã®ã§ã_æçµçã«_ããã«ã€ããŠèª¬æããŸãã
æãåèã«ãªãã³ã¡ã³ã
ãã®åé¡ã解決ãããã®ã¯ãªãã§ããïŒ