Celery ์์
์์ ์์ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์์ต๋๋ค.
์์
์ ์คํํ๋ ์์ ํ๋ก์ธ์ค๊ฐ ์๋๋๋ค.
๋ฉฐ์น ๋ง๋ค ๊ฐ์๊ธฐ ๋ฐ์ํฉ๋๋ค.
Celery๋ฅผ ์ค์งํ์ง ์์ผ๋ฉด ์์ญ ์๊ฐ ๋ด์ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ชจํฉ๋๋ค.
์ด ๋ฌธ์ ๋ ์ ์ด๋ Celery 4.1์์ ๋ฐ์ํ๋ฉฐ Celery 4.2์์๋ ๋ฐ์ํฉ๋๋ค.
Celery๋ Ubuntu 16์์ ์คํ๋๊ณ ๋ธ๋ก์ปค๋ RabbitMQ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Canvas ์ํฌ ํ๋ก๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น? # 4839๊ฐ ๊ด๋ จ์ด์์ ์๋ ์์ต๋๋ค.
๋ํ ์์ ์ ๋์์ฑ์ ์ํด prefork ํ์ ์ฌ์ฉํ๊ณ ์๋ค๊ณ ๊ฐ์ ํฉ๋๊น?
๊ฐ์ฌํฉ๋๋ค 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 ์ฌ ์ฐ๊ฒฐ ์ค์ ๋ฐ์ํฉ๋๊น? ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ์์ ์ ์์ต๋๋ค.
์.
์ฌ ์ฐ๊ฒฐ์ด ํธ๋ฆฌ๊ฑฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๊ฐ์ ๋ฌธ์ ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค ... ๋ฌด์์ด ์์ธ์ธ์ง, ์ ๊ธฐ์ต๋ ฅ ์ ์ถ์ด ์๋์ง ์์ ๋ด๊ธฐ๊ฐ ๋๋ฌด ์ด๋ ต์ต๋๋ค. ๊ทธ๊ฒ์ ์ ์ด๋ ํ ๋ฌ ๋์ ๋๋ฅผ ๊ดด๋กญํ๋ค. ๋๋ ์ ๋ฌ๋ฆฌ 3์ ์ฌ์ฉํ๊ณ ๋ชจ๋ ๊ฒ์ด ๊ด์ฐฎ์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฌธ์ ์ ๊ฒฝ์ฐ rabbitmq์ ํจ๊ป ubuntu 16, celery 4.1.0์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋์ปค๋ฅผ ํตํด ๋ฐฐํฌํ์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์๋ 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๋ ์ฐ๋ถํฌ 17, 1 ์๋ฒ-3 ๋์์ฑ์ ๊ฐ์ง 1 ์์
์์
๋๋ค. ๋ฐฑ์๋์ rabbit ๋ฐ redis; ๋ชจ๋ ํจํค์ง๋ ์ต์ ๋ฒ์ ์
๋๋ค.
@marvelph @ dmitry-kostin ์ ํํ ๊ตฌ์ฑ (๋ฌผ๋ก ๋ฏผ๊ฐํ ์ ๋ณด ์๋ต)๊ณผ ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ์์ ๋๋ ์ํ์ ์ ๊ณตํด ์ฃผ์๊ฒ ์ต๋๊น? ๋ํ ์์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฆ๊ฐ๊ฐ ๋ํ๋๊ธฐ ์์ํ๋ ํ๊ท ๊ฐ๋ ์๊ฐ ๊ฐ๊ฒฉ์ ๋ํ ์ถ์ ์น๊ฐ ์์ต๋๊น?
๊ตฌ์ฑ์ด ๊ธฐ๋ณธ๊ฐ์ ๊ฐ๊น์ต๋๋ค.
์์
= ( 'app.tasks',)
result_persistent = True
task_ignore_result = ๊ฑฐ์ง
task_acks_late = ์ฐธ
worker_concurrency = 3
worker_prefetch_multiplier = 4
enable_utc = True
์๊ฐ๋ = '์ ๋ฝ / ๋ชจ์คํฌ๋ฐ'
broker_transport_options = { 'visibility_timeout': 3600, 'confirm_publish': True, 'fanout_prefix': True, 'fanout_patterns': True}
๊ธฐ๋ณธ์ ์ผ๋ก ์ด๊ฒ์ ์๋ก ๋ฐฐ์น ๋ ๋
ธ๋์
๋๋ค. ๊ทธ๊ฒ์ 06/21 18-50์ ๋ฐฐ์น๋์์ต๋๋ค; 05-00 ๊ฒฝ์ 6/23 ์ฑ์ฅ์ ์ณ๋ค๋ณด๊ณ ๋ง์นจ๋ด 23-00 ๊ฒฝ์ 6/23์ ์ถ๋ฝํ์ต๋๋ค.
์์ ์ ๋งค์ฐ ๊ฐ๋จํ๊ณ ๊ฑฐ๊ธฐ์๋ ์ํผ ๋ก์ง์ด ์์ต๋๋ค. ๋ช ํํ ์์ ํ๋ก์ ํธ์์ ์ ์ฒด ์ํฉ์ ์ฌํ ํ ์ ์์ง๋ง ์ง๊ธ์ ์์ ์๊ฐ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด์ด ์ข์ผ๋ฉด ์ฃผ๋ง์ ์ ์ฒด ์์ ๋ฅผ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค.
UPD
์์
์์ฒด๊ฐ ์ฝ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ๋ ๊ฒ์ ๋ณผ ์ ์๋ฏ์ด ๊ทธ๋ํ์์ ๊ธ์ฆ์ผ๋ก ๋ณผ ์ ์์ง๋ง ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ๋ดค์ ๋ ์์ฑ ๋ ์์
์ด๋ ๋ค๋ฅธ ํ๋์ด ์์์ต๋๋ค.
@marvelph @ dmitry-kostin @jxltom ๋๋ ๋น์ ์ด Python3์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ํ๋ก์ธ์ค์ ๋ํด tracemalloc ์ ํ์ฑํ ํ์๊ฒ ์ต๋๊น? ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ถ์ ์ ๊ธฐ๋กํ๊ธฐ ์ํด ์์ ์ ํ๋ก์ธ์ค๋ฅผ ํจ์นํด์ผ ํ ์๋ ์์ต๋๋ค. ๋์์ด ํ์ํ๋ฉด ์๋ ค์ฃผ์ธ์.
@georgepsarakis ์์ ์ ๋ฐ ๋ก๊ทธ ํต๊ณ (์ : ์์ 10 ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ํ์ผ)์์ 5 ๋ถ๊ณผ ๊ฐ์ ํน์ ๊ฐ๊ฒฉ์ผ๋ก tracemalloc์ ํ์ฑํํ๋ค๋ ์๋ฏธ์ ๋๊น?
@jxltom ๋๋ ๊ทธ์ ๊ฐ์ ๊ฒ์ด ์ฑ ์์๋ ์ฝ๋ ๋ถ๋ถ์ ์ฐพ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ป๊ฒ ์๊ฐํด?
@georgepsarakis ๋๋ gdb์ https://github.com/lmacken/pyrasite ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์ ํ๋ก์ธ์ค๋ฅผ ์ฃผ์ ํ๊ณ tracemalloc์ ํตํด ๋๋ฒ๊ทธ๋ฅผ ์์ํ๋ ค๊ณ ํ์ต๋๋ค. ๋ค์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๊ฐ์ฅ ๋ง์ ์์ 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 ๋ถ ํ ๋ ์ค๋ ์ท์ ์ฐจ์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
>>> 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
์ด๊ฒ์ ๊ณ์ํด์ ๋๋ฒ๊น ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์์ด ์์ต๋๊น? ์งํ ๋ฐฉ๋ฒ์ ๋ํ ๋จ์๊ฐ ์์ต๋๋ค. ๊ฐ์ฌ.
์๋ ํ์ธ์.
์ฌ์์ฐ์ ์ํด ํ๋ก์ ํธ๋ฅผ ์๋ผ๋ผ ์๊ฐ์ด ์ข ํ์ํฉ๋๋ค.
์ ๋ฌ๋ฆฌ์ ์ค์ ์ ๋๋ค.
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์์๋ supervisord๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํฉ๋๋ค.
์๋
ํ์ธ์.
๋ด ํ
์คํธ ํ๊ฒฝ์ ์ฑ๋ฅ ์ ํ๋ฅผ ํ์ฉ ํ ์ ์์ผ๋ฏ๋ก tracemalloc์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋คํํ๊ธฐ ์ํด ํจ์น ๋ ์
๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๊น?
@jxltom 5 ๋ถ ๋์ tracemalloc์ด ๋ฌธ์ ๋ฅผ ์ฐพ๋ ๋ฐ ๋์์ด๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด 5 ๊ฐ์ ๋
ธ๋๊ฐ ์๊ณ ๊ทธ์ค 3 ๊ฐ๋ง์ด ์ง๋ 4 ์ผ ๋์์ด ๋ฌธ์ ๋ฅผ ๊ฒช์๊ณ ์ด๋ฒ์๋ 2 ๊ฐ๊ฐ ์ ์์ ์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๋ฅผ ์ฐพ๋ ๊ฒ์ด ๋งค์ฐ ๊น๋ค๋ก์ธ ๊ฒ์
๋๋ค ..
์ด ์ค์์น ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ์์ฃผ ์ ๋ณด์ผ ๋๊น์ง ์ค์์น๋ฅผ ์ผ๊ณ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ปค์ง๊ธฐ ์์ํ๋ ํ ๊ธ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค๋ฅธ ์คํ ์์คํ
์์๋ ๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์์ ๋ณด๋ ค๊ณ ํ์ต๋๋ค.
๋ฐ์ ๋น๋๋ ๋ค์ํ์ง๋ง Celery 4.x๋ฅผ ์ฌ์ฉํ๋ ์ธ ์์คํ
์์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ์ผ๋ฉฐ ํ ์์คํ
์์๋ ๋ฐ์ํ์ง ์์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ์๋ ์์คํ
์ Python 3.5.x์ด๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ์๋ ์์คํ
์ Python 2.7.x์
๋๋ค.
@ dmitry-kostin ๋ค๋ฅธ ๋ ์ผ๋ฐ ๋ ธ๋์์ ์ฐจ์ด์ ์ ๋ฌด์์ ๋๊น? ๋ ๋ค ๋ธ๋ก์ปค์ ๋์ผํ rabbitmq๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
ํ ๋ก ์์ rabbitmq์ ๊ด๋ จ์ด์์ ์ ์๋ค๊ณ ์ธ๊ธ ํ์ผ๋ฏ๋ก ๋์ redis๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ ๋์ผํ ๊ตฌ์ฑ์ผ๋ก ๋ค๋ฅธ ์ ๋ ธ๋๋ฅผ ์์ํ์ต๋๋ค. ์ง๊ธ๊น์ง์ด ๋ ธ๋๋ 24 ์๊ฐ ์คํ ํ ํ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์์ต๋๋ค. ๋์ค์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์์ผ๋ฉด ์ฌ๊ธฐ์ ๊ฒ์ํ๊ฒ ์ต๋๋ค.
@marvelph ๊ทธ๋ ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ์๋ ์ธ ์์คํ ์ python3์ ์ฌ์ฉํ๊ณ ์๊ณ ๊ด์ฐฎ์ ์์คํ ์ python2๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ ๋ป์ ๋๊น?
@jxltom ์ ํ ์ฐจ์ด๊ฐ ์์ผ๋ฉฐ ์ ๊ทธ๋ค์ ํ์ด์ฌ 3 ๋ฐ rabit์ ๋ธ๋ก์ปค ๋ฐ redis์ ๋ฐฑ์๋์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ์ฌํํ๊ธฐ ์ํด ํ
์คํธ ์์ ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๋ฉฐ์น ์์ ์ฑ๊ณตํ๋ค๋ฉด์ด ๋ฒ๊ทธ๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ ๋๊ตฐ๊ฐ๋ฅผ ์ํด์ด ์๋ฒ์ ์๊ฒฉ ์ฆ๋ช
์ ์ค ๊ฒ์
๋๋ค.
๋ฟก๋ฟก
์.
๋ด ํ๊ฒฝ์ ๊ดํ ํ Python 2์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
์ค๋ ๊ธฐ๊ฐ ๋์ 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์ ํ๊ฒฝ ๋ณ์๋ก ์ ๋ฐ์ดํธํ๊ณ ๋์ปค / ์ฝ๋๋ฅผ ์์ ํ ๋์ผํ๊ฒ ์ ์งํ์ฌ rabbitmq์์ redis๋ก ๋ธ๋ก์ปค๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ 4 ์ผ ๋์ ์คํ๋๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์์ต๋๋ค .
๊ทธ๋์ ๋๋์ด ๋ฌธ์ ๊ฐ rabbitmq ๋ธ๋ก์ปค์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ๋ฅํ๋ฉด ์ฌ๊ธฐ์ ์ธ๊ธ ๋ ๋ฒค์น ๋งํฌ ๋ช ๋ น์ ์คํ ํด๋ณด์ญ์์ค. https://github.com/celery/celery/issues/2927#issuecomment -171455414
์ด ์์คํ
์ 20 ๋์ ์๋ฒ๋ก ์์
์๋ฅผ ์คํํ๊ณ ์์ต๋๋ค.
์ด์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ์ง๋ง ๊ฑฐ์ ๋ชจ๋ ์๋ฒ์์ ๋์์ ๋ฐ์ํ๊ณ ์์ต๋๋ค.
๊ด๋ จ์ด ์๋์ง ๋ชจ๋ฅด๊ณ ๋์์ด ๋ ์ ์๋๋ก ์ฌ๊ธฐ์ ๋์ญ์์ค.
์ ๋ฌ๋ฆฌ์ rabbitmq์ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค (์ ๋ฌ๋ฆฌ๊ฐ ์ฐ๊ฒฐ์ด ๋์ด์ง๊ณ ์ด๋น๋ก๋๋ฅผ ๋ค์ ์ฐ๊ฒฐํ๊ธฐ ์์ํ๊ณ CPU๊ฐ 1 ์ฝ์ด์์ 100 %๊ฐ๋๊ณ ๋นํธ๊ฐ ์ ์์ ์ ๋ณด๋ผ ์ ์์ผ๋ฉฐ ์ ๋ฌ๋ฆฌ๋ฅผ ๋ค์ ์์ํด์ผ ํจ).
๋ด๊ฐ ์ฌ๊ธฐ์ ์ด๊ฒ์๋ณด๊ณ ํ๋ ์ด์ ๋ ๋ฐฉ์์ ๋๋ฌธ์ ๋๋ค. ๋ชจ๋ํฐ๋ง ํ ๋ฉฐ์น ํ์ ๋ฌธ์ ์ ์์์ ์ฐพ์ ๊ฒ ๊ฐ๊ณ ๋ฉ๋ชจ๋ฆฌ์์ ๋์คํฌ๋ก ์ผ๋ถ ๋ฉ์์ง๋ฅผ ์ด๋ํ๋ rabbitmq ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ ์ ๋ฌ๋ฆฌ๋ ์ต๋ํ ๋นจ๋ฆฌ ์ฌ ์ฐ๊ฒฐ์ ์๋ํ๊ธฐ ์์ํ๊ณ rabbitmq ๋ก๊ทธ๋ ํ ๋ฒ์ ~ 10 ๊ฐ ์ ๋์ ์ผ๊ด ์ฒ๋ฆฌ๋ก ์ด๋น ์์ญ ๊ฑด์ ์ฐ๊ฒฐ / ์ฐ๊ฒฐ ํด์ ์์ ์ ๋ณด์ฌ์ค๋๋ค. rabbitmq๋ฅผ ๋ค์ ์์ํด๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์๊ณ ์ ๋ฌ๋ฆฌ๋ฅผ ๋ค์ ์์ํ๋ฉด ์ฆ์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค. ์ ์ ํ ์์ ์ฌํญ์ ์์ง๋ง ์๋ฅผ ๋ค์ด ๋ฉ์์ง๊ฐ ํญ์ ๋ฉ๋ชจ๋ฆฌ์ ๋จ์ ์๋๋ก ํ์ฉํ๋ ๋ง๋ฃ ์ ์ฑ ์ ์ค์ ํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ผ๋ฉฐ ๊ทธ ์ดํ๋ก๋ ๋ณด์ง ๋ชปํ์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ์ธ๋ถ ์ ๋ณด๊ฐ ๋ด๊ฐ ๋ณธ ๊ฒ๊ณผ ์ผ์นํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ (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๋ฅผ ์ฌ์ฉํ๋๋ก ์ ๋ฐ์ดํธํ์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ์ ์์ ๋๋ค.
BTW ๋น ๋ฅธ ์์ ์ ์ฐพ๊ณ ์๋ ๋ชจ๋ ์ฌ๋์ ์ํด- @jxltom์ด ์ ์ํ๋๋ก rabbit์ redis๋ก ๊ต์ฒดํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
๊ทธ๋์ ๋ฌธ์ ๋ ํ์คํ ํ ๋ผ ์
๋ฌ๋ฆฌ ํ
๋๋ฆฌ ๊ทผ์ฒ์ ์์ต๋๋ค.
@dieeasy ์ฐ๋ฆฌ๋ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒฝํํ์ต๋๋ค. RPC ๊ฒฐ๊ณผ ๋ฐฑ์๋๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด DB ๊ฒฐ๊ณผ ๋ฐฑ์๋๋ก ์ ํํ๊ณ ๋์์ด๋๋์ง ํ์ธํ์ญ์์ค. ์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๋ฌธ์ ๋ https://github.com/celery/kombu/pull/779 ์ด๋ฉฐ ์ฌ๊ธฐ์ ์ค๋ช ๋์ด ์์ต๋๋ค : https://github.com/celery/kombu/pull/779#discussion_r134961611
๋์ผํ ๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์์ต๋๋ค.
๊ธฐ์ต
๋ฒ์
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
```ํ์ด์ฌ
๋ค์๋ง ์์
๋๊ธฐ์ด, ๊ตํ์์
oslo_log์์ ๋ก๊ทธ๋ฅผ ๋ก๊น
์ผ๋ก ๊ฐ์ ธ ์ค๊ธฐ
app.conf์์ CONF ๊ฐ์ ธ ์ค๊ธฐ
๋ก๊ทธ = logging.getLogger (__ name__)
celery_queues = (
ํ ( 'im', exchange = Exchange ( 'sender'), routing_key = 'im'),
ํ ( 'sms', exchange = Exchange ( 'sender'), routing_key = 'sms'),
Queue ( 'mail', exchange = Exchange ( 'sender'), routing_key = 'mail'),
ํ ( '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'}
}
๊ตฌ์ฑ = {
'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 ๋ฐ rabbitmq 3.7.7-1๋ก ํ
์คํธํ์ต๋๋ค.
ํธ์ง : ๋ํ Python ๋ฒ์ 3.6.5 ๋ฐ ์ฐ๋ถํฌ 16.04 (AWS EC2 ์ด๋ฏธ์ง)
์ ๋ฌ๋ฆฌ 4.2.1 ๋ฐ redis ๋ธ๋ก์ปค์์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ 3 ์๊ฐ ๋ง์ 100MiB์์ 500MiB (์ ํ)๋ก ์ฆ๊ฐํ๊ณ ์์ ์๋ ๊ฝ์์ ์คํ๋ผ์ธ์ผ๋ก ํ์๋ฉ๋๋ค. prefork pool๊ณผ gevent๋ ๋ชจ๋ ๋์ผํ ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
@yifeikong ์ด๊ฒ์ ๋์ผํ ๋ฌธ์ ๊ฐ ์๋ ์ ์์ง๋ง ๊ทํ์ ๊ฒฝ์ฐ https://github.com/celery/celery/pull/4839#issuecomment -447739820 ์ ์ ๋ ์๋ฃจ์ ์ ์๋ํด ์ฃผ์๊ฒ ์ต๋๊น?
@georgepsarakis ์ ๋ Python 3.6.5๋ฅผ ์ฌ์ฉํ๊ณ
# 5047 ๊ณผ ๋์ผํ ์์ธ ์ผ ์ ์์ต๋๋ค.์ด ๋ฒ๊ทธ๋ ๋ค๋ฅธ ํ์์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ RabbitMQ๋ฅผ ๋ธ๋ก์ปค๋ก ์ฌ์ฉํ์ฌ Celery 4.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 ์ฌ์ฉ, __del__
์์ monkey path AsyncResult
๋งํ ์ ์์ต๋๋ค.
๋ก๊ทธ๋ฅผ ๋ถ์ํ์ฌ ๊ฐ์ญ์์ ๋์น ํํธ ๋นํธ์ ๊ด๋ จ๋ ๋ง์ ๋ฉ์์ง๊ฐ ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค.
{"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
์์
์๋ฅผ ์คํํ์ฌ ๊ฐ์ญ์ ๋นํ์ฑํํ๋ ๊ฒ์ด ์์ต๋๋ค. ๋๋๊ฒ๋ ๊ฐ์ญ์ ๋นํ์ฑํํ๋ฉด ์ฆ๊ฐ์ ์ธ ํจ๊ณผ๊ฐ์์์ต๋๋ค.
์ฌ๊ธฐ์์ ๋ณผ ์ ์์ต๋๋ค.
์ ๋ฌ๋ฆฌ ์์ ์๋ฅผ ์คํํ๋ ๋ ํ๋ก์ ํธ์์ ๊ฐ์ญ์ ๋นํ์ฑํํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ๊ฐ์ ๋์์ต๋๋ค.
์ฃผ์๋ฅผ ๊ธฐ์ธ์ด๋ฉด ์ฌ๊ธฐ์ ์ค๋ช ๋ ๊ฒ๊ณผ ์ ์ฌํ ๋ฉ๋ชจ๋ฆฌ ์คํ์ดํฌ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ https://github.com/celery/celery/issues/4843#issuecomment -399833781
๋ด๊ฐ ์์ ํ ์ดํดํ๋ ค๊ณ ๋ ธ๋ ฅํ ํ ๊ฐ์ง๋ ๊ฐ์ญ์ ์์ ํ ๋นํ์ฑํํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ๋ฌด์์ธ์ง์ ๋๋ค. ํ๋ด์ ์์ ์ <-> ์์ ์ ์์ฌ ์ํต์ผ๋ก ๋ง ์ค๋ช ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋๊ตฐ๊ฐ ์ด์ ๋ํด ๋ฐํ ์ ์๋ค๋ฉด ๋งค์ฐ ๊ฐ์ฌ ํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ด ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฉฐ ๋ ธ๋ ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
์ด ๋ฌธ์ ๊ฐ ์ข ๊ฒฐ ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ด ๋ฌธ์ ์ ๋ํ ์ ๊ทน์ ์ธ ํผ๋๋ฐฑ๊ณผ ๊ด์ฌ์ด ์์ผ๋ฏ๋ก ๋ค์ ์์ํ๊ฒ ์ต๋๋ค.
๊ธ์, @georgepsarakis ๋ ๋ด ์ ์ถ์ด # 4839๊ฐ ์๋๋ผ๊ณ ์ง๋จํ๊ณ ๋น์ ์ ๊ทธ๊ฒ์ด # 4843์ด๋ผ๊ณ ์์ฌ ํ๊ธฐ ๋๋ฌธ์ ์ ์ด๋ ์ง๊ธ์์ด ์ ์ถ ์ค๋ ๋๋ก ๋์ด๊ฐ ๊ฒ์ ๋๋ค. # 4843๋ ๋ด ์ ์ถ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด ์ค๋ ๋์ ์ด๊ธฐ ๋ฌธ์ ์ ๋ฐ๋ฅด๋ฉด :
์ด ๋ฌธ์ ๋ ์ ์ด๋ Celery 4.1์์ ๋ฐ์ํ๋ฉฐ Celery 4.2์์๋ ๋ฐ์ํฉ๋๋ค.
Celery๋ Ubuntu 16์์ ์คํ๋๊ณ ๋ธ๋ก์ปค๋ RabbitMQ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋๋ ํ์ฌ :
ํ์ด์ฌ 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๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค). Celery 4.2.1 + gevent 1.3.7์ ๊ทธ๋ ์ต๋๋ค. ์ํ๊น๊ฒ๋ gevent 1.3.7๊ณผ gevent 1.2.2๋ ๋ฌธ์ ์ ๊ฐ๋ฅํ ์์ธ์ผ๋ก gevent ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค๋ช (๋๋ ์ ์ธ)ํ๊ธฐ ์ํด ์ํธ ๊ตํ ํ ์ ์์ต๋๋ค.
ํธ์ง : ํ ... ์ ๊ฐ ๋ฐ์ํ ์ค๋ฅ๋ฅผ ์์ ํ ์์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ gevent ํจ์น (022f447dd)๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์๋ ์ํค๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ด๋ค.
Celery 4.1.1์ 022f447์ ์ ์ฉํ๊ณ gevent 1.3.7์ ์ค์นํ์ต๋๋ค. ๊ทธ Celery + gevent ์กฐํฉ์ด ์คํ๋๊ณ ... ๋ด๊ฐ ๊ฒฝํ ํ ๋์์ ์ผ์นํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํจํด์ ์์ฑํ์ต๋๋ค. Celery 4.2.1 + gevent 1.2.2 (์ญ ํจ์น ํฌํจ)๋ฅผ ์ค์นํ๊ณ ์ผ๋ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํจํด์ด ๋ํ๋๋์ง ํ์ธํฉ๋๋ค.
gevent 1.4.0์ด ๋์์ต๋๋ค. ๊ทธ๊ฒ ์ด๋ป๊ฒ ์๋ํ๋์ง๋ณด๊ธฐ ์ํด ์์ฉ๋์ด๋ฅผ ์ค์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.
Celery 4.2.1 + gevent 1.2.2 + gevent 1.2.2์ ๋ฆฌ๋ฒ์ค ํจ์น๋ Celery 4.2.1 + gevent 1.3.7์ฒ๋ผ ๋์ถ์ ์ผ์ผํค์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
Celery 4.2.1 + gevent 1.4.0์ gevent 1.3.7 AFAICT์ ๊ฑฐ์ ๊ฐ์ ๋น์จ๋ก ๋์ถ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
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๊ฐ ๋ด๋ถ์์ ์ํํ๋ ์์
์ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ฉด ์์ฒด ์ฌ์ฅ ๋ฐ๋์ด ์๊ณ ๋์ด์ง ์ฐ๊ฒฐ์ ๊ฐ์งํ๋ฉด ๋ด๋ถ์์ ๋ค์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ํ์ฑํ ๋ ์ด๋ฒคํธ ์ ํ (๊ฐ์ญ, ํํธ ๋นํธ)์ ๋ฐ๋ผ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋์ถ ๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ eventlet ๋ฐ gevent์ ๋ชจ๋ ๋ฒ์ ์ ํด๋น๋์ง๋ง ์ผ๋ถ๋ ์ํฉ์ ์
ํ / ๋ ๋์ ๋๊ฒ ๋ง๋๋ ์ฐ๊ฒฐ ๋ฌธ์ ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค.
์๋ ํ์ธ์,
๋๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฐ๋ฆฌ์ ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ์์ ๋
ผ์ํ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ์์ ๋ถ์ ํ๊ฑฐ๋ ํ์ธํ ์ ์์ต๋๊น?
ํ์ด์ฌ : 2.7
์
๋ฌ๋ฆฌ : 4.2.1
OS : CentOS ๋ฆด๋ฆฌ์ค 6.10
๋ธ๋ก์ปค๋ก์์ Redis
์ฒจ๋ถ ๋ ์ด๋ฏธ์ง์์ ๋ค์์ ๋ณผ ์ ์์ต๋๋ค.
์ต์ ์ ๋ณด
์ด ๋ฌธ์ ์ ๊ด๊ณ์์ด ์ฐ๋ฆฌ๋ ํ์ด์ฌ 3.6์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๊ณ ๊ทธ ์ดํ๋ก ๋์๊ฐ ๋ ์ด์ ๋ฐ์ํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
(์
๊ทธ๋ ์ด๋๋ 2 ์ 19 ์ผ์์์์ต๋๋ค)
์๋ ํ์ธ์.
์ด๊ฒ์ด ์ผ๋ง๋ ๊ด๋ จ์ด ์๋์ง ํ์คํ์ง ์์ง๋ง ์์ฐ ๊ณผ์ ์์ ์ ๋ฌ๋ฆฌ๋ก ์ธํด 2GB์ SWAP ๊ณต๊ฐ์ด ์๋ชจ๋ฉ๋๋ค. ๊ฝ์ ๋ง๋ ๊ฒ์ ๊ธฐ์ต์ ์ง์ฐ์ง ์์์ง๋ง ์ ๋ฌ๋ฆฌ๋ ๊ทธ๋ง ๋์๋ค.
๋๊ตฌ๋ ์ ๋ฌ๋ฆฌ 4.3rc1์ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๊น?
@auvipy Celery 4.3.0rc1 + gevent 1.4.0์ ์ค์นํ์ต๋๋ค. pip๋ ๋น๊ตฌ๋ฅผ 3.6.0.0 ๋ฐ kombu 4.3.0์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ์ต๋๋ค.
๊ทธ ์ ๊ทธ๋ ์ด๋๋ก # 4839๊ฐ ์์ ๋์๊ธฐ ๋๋ฌธ์ rc1 ํจํค์ง์์๋ vine 1.2.0์ด ํ์ํ์ง ์๋ค๋ ์ฌ์ค์ ์์ํดํฉ๋๋ค.
์ด์จ๋ Celery 4.3.0 rc1์ ์ ์์ ์ผ๋ก ์คํ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
@ ldav1s ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ฐ๋ผ์ vine์ ์ค์ ๋ก py-amqp ์์ ์ข
์์ฑ์ผ๋ก ์ ์ธ๋ฉ๋๋ค. ์ ์ค์น์์๋ ์ต์ vine
๋ฒ์ ์ด ์ค์น๋์ง๋ง ๊ธฐ์กด ๋ฒ์ ์์๋ ๋ฐ์ํ์ง ์์ ์ ์์ต๋๋ค.
@thedrow ์๋ง๋ ์ฐ๋ฆฌ๋ Celery ์๊ตฌ ์ฌํญ์์๋ ์ข ์์ฑ์ ์ ์ธํด์ผํ ๊น์?
๊ทธ๊ฒ์ ๋ํ ๋ฌธ์ ๋ฅผ ์ด๊ณ ๊ฑฐ๊ธฐ์์ ๋ ผ์ํฉ์๋ค.
Celery 4.3.0rc1 + gevent 1.4.0์ด ๋ฉฐ์น ๊ฐ ์คํ๋์์ต๋๋ค. Celery 4.2.1 + gevent 1.4.0๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ์ถ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
celery 4.2.1, python 3.6์์ ๋์ผํ ๋์ถ์ด ์์
์ด๊ฒ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
์ฌ๊ธฐ์ ๊ฐ์ ๋ฌธ์ ๊ฐ
์ธ์ฌ๋ง,
๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ง ๋์ผํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ค๋ฅธ ํ๊ฒฝ / ๋คํธ์ํฌ์์ ์ ๋ฌ๋ฆฌ ์ฑ์ ๋ง์ด๊ทธ๋ ์ด์ ํ ํ ์ ๋ฌ๋ฆฌ ์์ ์๊ฐ ์ ์ถ๋๊ธฐ ์์ํ์ต๋๋ค. ์ด์ ์๋ ์ ๋ฌ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ rabbitmq ์ธ์คํด์ค๊ฐ ๋์ผํ ํ๊ฒฝ / ๋คํธ์ํฌ์์์์ต๋๋ค.
๋ด ๊ตฌ์ฑ์ Python 3.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)
์ ๋ฌ๋ฆฌ
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์ ๋ช ๋ น์ ํตํด ์์๋๋ eventlet ํ์ด์๋ ์ฌ๋ฌ ์์ ์๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
[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 ๋ช ๋ น์ ๊ฒฐ๊ณผ์ ๋๋ค. 1 ๋ช ์ ์์ ์๊ฐ 1464m๋ก๋ง ๋์ถ๋ฉ๋๋ค.
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
๋์ ์์ ์์ ๋ํ tracemalloc TOP 10 ๊ฒฐ๊ณผ
[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 ํ๋ ์์ TOP 1
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)
๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ๋ก๊ทธ์ ์์ ์ ๊ฐ ํํธ ๋นํธ๋ฅผ ๋์น ๊ฒ ์ธ์๋ ์ค๋ฅ๊ฐ ์์ต๋๋ค. ์ด์ ์ด์ ํ๊ฒฝ์ ์ฌ์ฉํ๊ณ ์๋ libs์ ์ ํํ ๋ฒ์ ์ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค.
์ ๋ฐ์ดํธ : ๋์ผํ ์ ํํ ์ข ์์ฑ lib ๋ฒ์ ๊ณผ 5 ๋ถ๋ง๋ค ๋ธ๋ก์ปค ํํธ ๋นํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค์ ์ ์ถ ๋ ๊ฒ๋ณด๋ค 2 ์ผ ์ด์ ๋ ์ค๋ ์๊ฐ ๋์ ์์ ์ ์ผ๋ก ๋ณด์์ต๋๋ค.
์๊ฐ๋ณ๋ก ์ฝ 1 ์๊ฐ ๋์ ๊ณ์๋๋ ์์ ์คํ์ดํฌ๊ฐ ์์์ง๋ง "ํก์ / ์์ง"๋์์ต๋๋ค .. ๋ง์ง๋ง ํ๋๊ฐ ์คํ์ดํฌ๋ฅผ ์์ํ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ฒซ ๋ฒ์งธ ์คํ์ดํฌ, ์ฒซ ๋ฒ์งธ ๋จํ ์ดํ, ๋๋ ์๋ ์์ ์๋ฅผ ๋ค์ ์์ํ์ต๋๋ค. ๋ค๋ฅธ ์์ ์๊ฐ ๊ทธ ํ์ ์๊ธฐ ์์ํ๊ฑฐ๋ ์๋ง๋ ์ด๋ฏธ ์๋ ๊ฒ, ๋ ๋ฒ์งธ ๋จํ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์ฌ์ฅ ๋ฐ๋์์ด ํ ์คํธํ๊ฒ ์ต๋๋ค.
์ ๋ฐ์ดํธ : 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์ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋ ๊ฒ ๊ฐ๊ณ ์ผ์ฃผ์ผ ์ดํ๋ก ์์ ์ ์
๋๋ค.
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
ํ ๋ผ์์ ์ฐ๊ฒฐ ๋ฌธ์ ์ดํ์์ด ๋ฒํผ๊ฐ ์ปค์ง๊ธฐ ์์ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๊ฒฐ๊ตญ ์ด๋ฒคํธ๋ฅผ ์ง์ฐ์ง ๋ชปํ๋ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํ๋ฉฐ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ณ์ ์ฑ์ฅํ๊ณ ์ ์ ๋ ๋ง์ ์ซ์์ ์๋นํฉ๋๋ค. buffer_while_offline=False
์ฌ๊ธฐ https://github.com/celery/celery/blob/master/celery/worker/consumer/events.py#L43์ ์ ๋ฌํ๋ฉด ๋์๊ฐ ํด๊ฒฐ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๊ตฐ๊ฐ ์ด๊ฒ์ด ๊ด๋ จ์ด ์๋์ง ํ์ธํ ์ ์์ต๋๊น?
@ yevhen-m ๊ฐ์ฌํฉ๋๋ค! ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด๋์์ต๋๋ค!
ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ด ์ข์ง๋ง ์ ์ ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์ ์ ์์ต๋๊น?
์ฐ์์ด ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฌธ์ ๋ฅผ ๋ฐ๋ฅด์ญ์์ค.
ํ๋ก๋์
ํ๊ฒฝ์์ ์
๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๋์ปค๋ฅผ ํตํด ๋ฐฐํฌํ๊ณ ์์ต๋๋ค.
์คํฌ๋ฆฐ ์ท๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํ๋ก๋์
๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Docker ์์ ์ด๋ฏธ์ง : python 3.6.8-buster
์
๋ฌ๋ฆฌ ๋ฒ์ : 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 ๋ฌธ์ ๋ ์ฌ์ ํ Celery 4.4.2 ๋ฐ 4.4.6์ ์์ต๋๋ค. ๋ชจ๋ ์์ ์์์ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํฉ๋๋ค.
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
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์์
์ ์ด๋ฆ๊ณผ ๋๊ธฐ์ด์ ์ค์ ํฉ๋๋ค. ํ๋ฆฌ ํฌํฌ ๋ชจ๋์์ ์คํ ์ค์
๋๋ค. Redis๋ ๋ธ๋ก์ปค ๋ฐ ๊ฒฐ๊ณผ ์ ์ฅ์ ๋ชจ๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
~ ์ฅ๊ธฐ ์คํ ์์ ์์ ๋๋ฝ ๋ ํํธ ๋นํธ๊ฐ ๋ง์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ๋งํฌ ๋ ์ด์์๋ณด๊ณ ๋ ๋ฌธ์ ๋ ์ฌ์ ํ ์ง์๋ฉ๋๋ค. ~
๋นํ์ฑํ ๋ ์ฌ์ฅ ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
@jsynowiec ์ด ๋ฌธ์ ์ ์ง๋ฉดํ์ ๋ ์ ์๊ฒ ๋์์ด ๋ ์ ์ผํ ๊ฒ์ ๊ฐ์ญ์ด ๋นํ์ฑํ ๋ ์์ ์๋ฅผ ์ด์ํ๋ ๊ฒ์ด ์์ต๋๋ค. https://github.com/celery/celery/issues/4843#issuecomment -459789086
celery 4.4.2 ๋ฐ redis์์ ๋ธ๋ก์ปค๋ก ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. 48 ์๊ฐ ๋์ ์
๋ฌ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง ๋๊น์ง ์ต๋ 60GB์ RAM์ ์๋นํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ช
๋ช
๋ ์๋ฃจ์
์ค ์ด๋ ๊ฒ๋์ด ๋์์ ์ํฅ์ ๋ฏธ์น์ง ์์์ต๋๋ค.
celery 4.4.2 ๋ฐ redis์์ ๋ธ๋ก์ปค๋ก ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. 48 ์๊ฐ ๋์ ์ ๋ฌ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด์ง ๋๊น์ง ์ต๋ 60GB์ RAM์ ์๋นํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ช ๋ช ๋ ์๋ฃจ์ ์ค ์ด๋ ๊ฒ๋์ด ๋์์ ์ํฅ์ ๋ฏธ์น์ง ์์์ต๋๋ค.
์ต์ ํจ์น ๋ฒ์ ์ ์ฌ์ฉํด ๋ณด์
จ์ต๋๊น?
OP์ ๊ฐ์ ์กฐ๊ฑด์ด ์์ต๋๊น?
v4.4.6์์ ์ฌ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์กด์ฌํฉ๋๋ค. ์ด์ ์๊ฒฌ์ ๋์ด๋ ์ค์ ์ผ๋ก ์์ ์๋ฅผ ์คํํฉ๋๋ค. OP๋ RabbitMQ๋ฅผ ์ฌ์ฉํ๊ณ Redis๋ฅผ ๋ธ๋ก์ปค๋ก ์ฌ์ฉํฉ๋๋ค.
+1, ์ต์ํ์ ์์ ์ ์ํํ๋๋ผ๋ 24 ์๊ฐ์ ๊ฑธ์ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ ์ง์ ์ผ๋ก ์ฆ๊ฐํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ด์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์์ ์์ธ์ ํ๋กํ์ผ ๋งํ๊ณ ์ฐพ์ ์ ์์ต๋๊น?
v4.4.6์์ ์ฌ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์กด์ฌํฉ๋๋ค. ์ด์ ์๊ฒฌ์ ๋์ด๋ ์ค์ ์ผ๋ก ์์ ์๋ฅผ ์คํํฉ๋๋ค. OP๋ RabbitMQ๋ฅผ ์ฌ์ฉํ๊ณ Redis๋ฅผ ๋ธ๋ก์ปค๋ก ์ฌ์ฉํฉ๋๋ค.
๋ค๋ฅธ ๋ฌธ์ ์ด๊ฑฐ๋ ์์ ์ฌํญ์ด ์ฌ๋ฐ๋ฅด์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ด 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 ํด๋ผ์ด์ธํธ์์ ๋ฉ๋ชจ๋ฆฌ ๋์? ์ ๋ celery v4.4.6์ gevent, redis๋ฅผ ๋ธ๋ก์ปค๋ก ์ฌ์ฉํ๊ณ ๊ฒฐ๊ณผ ๋ฐฑ์๋๊ฐ ์์ต๋๋ค.
๊ทธ๊ฒ๋ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ์๋ง๋ gevent์ ์์ต๋๊น?
CC @jamadden @andymccurdy
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋์ ์ฃผ์๊ฒ ์ต๋๊น?
์๋ง๋ gevent์ ์์ต๋๊น?
gevent
์ฌ์ฉํ์ง ์์ต๋๋ค. ์์
์๋ concurrency = 1 ๋ฐ prefork๋ก ์์๋ฉ๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,์ด ๋ฌธ์ ๊ฐ ์ ์ข ๊ฒฐ๋์๋์ง ํ์คํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ 2 ๋ ๋์์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์์ผ๋ฉฐ ๋งค๋ฒ ์ ๋ฌ๋ฆฌ์ ๋ง์ง๋ง ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๊ณ ์์ผ๋ฉฐ ์ฌ์ ํ ํฐ ์๋ฒ (64-128GB RAM)์ RAM์ด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฌธ์ ์.
Celery 3๋ก ๋ค์ด ๊ทธ๋ ์ด๋ํ๊ฑฐ๋ Rabbitmq๋ฅผ ๊ต์ฒดํ์ง ์๊ณ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ด๋ก ์ธํด Celery๋ ํ๋ก๋์ ํ๊ฒฝ์์ ์์ ํ ๋ถ์์ ํฉ๋๋ค. ๊ณ ์น ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. Celery 3๋ก ๋ค์ด ๊ทธ๋ ์ด๋ ํ ์ ์์ผ๋ฏ๋ก Celery๊ฐ ์ ์ฒด ์๋ฒ RAM์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ์ง ์๊ธฐ ์ํด ๋ค๋ฅธ ์๋ฃจ์ (๋๋ผ๋งํฑ)์ผ๋ก ์ด๋ํ ๊ณํ์ ๋๋ค. 2 ์ผ๋ง๋ค ์์ฐ.
@arielcamino- ์ ์ด๋ ๋ด ์๋ฒ์ ๋ํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ 100 ~ ์์ ํ ์์ ์ ์ธ์คํด์ค๋ฅผ ๋์ฒดํ๊ธฐ ์ํด worker_max_tasks_per_child ์ค์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋๋ 512MB์ ์์ ์ธ์คํด์ค๋ฅผ ์คํํ๊ณ ์์ผ๋ฉฐ ์ด๊ฒ์ ๋์์ด๋์์ผ๋ฏ๋ก (์ด์ ์๋ ๋ด ๋จ์ ๊ณ ๊ฐ ์์ผฐ์ต๋๋ค) ์๋ง๋ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
@Skowt ์์ฐ,
@arielcamino- ์ ์ด๋ ๋ด ์๋ฒ์ ๋ํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ 100 ~ ์์ ํ ์์ ์ ์ธ์คํด์ค๋ฅผ ๋์ฒดํ๊ธฐ ์ํด worker_max_tasks_per_child ์ค์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋๋ 512MB์ ์์ ์ธ์คํด์ค๋ฅผ ์คํํ๊ณ ์์ผ๋ฉฐ ์ด๊ฒ์ ๋์์ด๋์์ผ๋ฏ๋ก (์ด์ ์๋ ๋ด ๋จ์ ๊ณ ๊ฐ ์์ผฐ์ต๋๋ค) ์๋ง๋ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด๊ฒ์ ์ฌ๊ธฐ์์ ๋์์ด๋์ง ์์์ต๋๋ค-์ฐ๋ฆฌ๋ redis๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
@thedrow redis-py์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์์ง ๋ชปํฉ๋๋ค. redis-py์ ๋์ถ์ด์๋ ๊ฒฝ์ฐ ๋๊ตฐ๊ฐ Celery ํ๊ฒฝ ์ธ๋ถ์์์ด๋ฅผ ๋ฐ๊ฒฌํ๊ณ redis-py ๋ฌธ์ ์ถ์ ๊ธฐ์๋ณด๊ณ ํ์ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ด๊ฐ ํ ์์๋ ๊ณณ์์ ๋์์ ์ค์ ๊ธฐ์ฉ๋๋ค (์ฌ๋ฌ ํ๋ก์ ํธ์์ ๋ธ๋ก์ปค๋ก Redis๊ฐ์๋ Celery๋ฅผ ์ฌ์ฉํฉ๋๋ค).ํ์ง๋ง ๋ฐฐํฌ์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์์ต๋๋ค.
ํ์ฌ ๋ฒ์ ์ gevent์์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ์์ง ๋ชปํฉ๋๋ค. ๋๋ ๋๊ตฐ๊ฐ๊ฐ ๊ทธ๊ฒ์ ๋ง๋ฌ๋ค๋ฉด ๋๊ตฐ๊ฐ๊ฐ ๋งํ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค (์ด์ ์ ํ๋ ๋ฒ ์ผ์ด๋ฌ์ต๋๋ค). ํ์ฌ gevent ๋ฐฐํฌ์๋ gevent๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ํ ๋ฒ์ ๋ช ์ฃผ ๋์ ์ฌ๋ฌ ์์ ์ (์น ๋ฐ ๋ฐฑ๊ทธ๋ผ์ด๋)๊ฐ ์์ผ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ์ง ์์์ต๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ,์ด ๋ฌธ์ ๊ฐ ์ ์ข ๊ฒฐ๋์๋์ง ํ์คํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ 2 ๋ ๋์์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์์ผ๋ฉฐ ๋งค๋ฒ ์ ๋ฌ๋ฆฌ์ ๋ง์ง๋ง ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๊ณ ์์ผ๋ฉฐ ์ฌ์ ํ ํฐ ์๋ฒ (64-128GB RAM)์ RAM์ด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฌธ์ ์.
Celery 3๋ก ๋ค์ด ๊ทธ๋ ์ด๋ํ๊ฑฐ๋ Rabbitmq๋ฅผ ๊ต์ฒดํ์ง ์๊ณ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ด๋ก ์ธํด Celery๋ ํ๋ก๋์ ํ๊ฒฝ์์ ์์ ํ ๋ถ์์ ํฉ๋๋ค. ๊ณ ์น ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. Celery 3๋ก ๋ค์ด ๊ทธ๋ ์ด๋ ํ ์ ์์ผ๋ฏ๋ก Celery๊ฐ ์ ์ฒด ์๋ฒ RAM์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ์ง ์๊ธฐ ์ํด ๋ค๋ฅธ ์๋ฃจ์ (๋๋ผ๋งํฑ)์ผ๋ก ์ด๋ํ ๊ณํ์ ๋๋ค. 2 ์ผ๋ง๋ค ์์ฐ.
๋ช ๋ช ์ ์ผ๊พผ์ด ์์ต๋๊น? ์ผ๋ง๋ ๋ง์ ์์ ์ ์คํํฉ๋๊น? ์ด ์์ ์ ์ผ๋ง๋ ์์ฃผ ์คํํ๊ณ ์ผ๋ฐ์ ์ผ๋ก ์๋ฃํ๋ ๋ฐ ์ผ๋ง๋ ๊ฑธ๋ฆฌ๋์?
Rabbitmq / celery๊ฐ ๋ง์ ๋จ์ ์ฌ์ฉํ๊ธฐ ์์ํ๋ ์ด์ ๋ ๋๊ธฐ์ด์์๋ ์์ ์ ์๊ณผ ๊ด๋ จ์ด์์ ์ ์์ต๋๋ค. ๋๋ฌด ๋ง์ ์์ ์ ๋๊ธฐ์ด์ ๋ฃ๊ณ ์์ ์๊ฐ ์์ ์ ๋ชจ๋ ์๋ฃ ํ ์์๋ ๊ฒฝ์ฐ ๋๊ธฐ์ด์ด ์ปค์ง๊ณ ์ด ๋๊ธฐ์ด์ ์ ์ ๋ ๋ง์ RAM์ ์ฌ์ฉํ๊ณ ๊ฒฐ๊ตญ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ RAM์ ์๋นํ๊ฒ๋ฉ๋๋ค. ์ด ๋ฌธ์ ๋ Redis์์๋ ๋ฐ์ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๋ค๋ฅธ ์ด๋ก ์ด ์์ง๋ง ๋จผ์ ์ด๊ฒ์ด ๋น์ ์ ๋ฌธ์ ์ ์์ธ์ธ์ง ์๊ณ ์ถ์ต๋๋ค.
@ardilom ์ฃ์กํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ RabbitMQ ๋ฐ์ดํฐ๋ฅผ datadog์ ๋ณด๋ด์ง ์๋๋ค๋ ์ฌ์ค์ ๊นจ๋ฌ์์ง๋ง ์ํฉ์ ๋ช
ํํํ๋ ค๊ณ ๋
ธ๋ ฅํ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์ผ๋ถ ์๋ฒ RAM์ด 2 ์ผ๋ง๋ค ์ค๋จ๋๋ ๋ฐฉ์์
๋๋ค.
์ฐ๋ฆฌ๋ ํญ์ ๋ณด๋ฅ์ค์ธ ์์ ์ ์๋ฅผ ํ์ธํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ฝ 0์ ๋๋ค (์ด ๋ฐ์ดํฐ๋ ๋ฉฐ์น ์ ์ ๊ฒ์ ๋๋ค).
์ฐ๋ฆฌ๋ ํ๋ฃจ์ ์ฝ 250,000 ๊ฐ์ ์์ ์ ์คํํ๊ณ ๊ฐ๊ฐ ์ฝ 4 ~ 10 ๊ฐ์ ๋์์ฑ์ ๊ฐ์ง ์ฝ 10 ๋ช ์ ์์ ์๋ฅผ ๋ณด์ ํ๊ณ ์์ผ๋ฉฐ ํ๊ท ๋ฐํ์์ ์ฝ 5 ์ด์ด๋ฉฐ ์์ ์ ์ข ๋ฅ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
๋๊ธฐ์ค์ธ ์์ ์ด ๋๋ฌด ๋ง์ง ์์์ง ํญ์ messages_ready ๋ฅผ ํ์ธ messages_ready ๋ฅผ ์ธก์ ํด๋ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํ์ญ๋๊น? ๊ฒฐ๊ตญ์๋ ์ฝ๊ฐ์ ํผํฌ๊ฐ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก๋ 0์ ๊ฐ๊น์ต๋๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Celery ์์ ์๋ฅผ ์๋์ผ๋ก ๋ค์ ์์ํ๋ฉด RAM ์ฌ์ฉ๋์ด ๋ค์ ์ ์ํ๋ฉ๋๋ค.
๋ค๋ฅธ ๊ฒ์ด ํ์ํ๋ฉด ์๋ ค์ฃผ์ธ์. ๊ตฌ์ฑ์ ์ ์ฉํ ํ ๋๋จธ์ง ์๋ฒ์ ์ฐจ์ด๊ฐ ์๋์ง ํ์ธํ๊ธฐ ์ํด ์์ ์๋ฒ ์ค ํ๋์์ worker_max_tasks_per_child ์ค์ ์ ๋ณ๊ฒฝํ์ต๋๋ค.
๊ฐ์ฌ!
์๋ ํ์ธ์, ์ด๊ฒ์ ์ ๊ฒฝ์ฐ์ 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 ์ค๋ ์ท์ ๋๋ค. ์ด๊ฒ์ ๋ช ๋ถ ์ ๋๋ง๋ค ๊ฐ์ ์ฅ์์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฆ๊ฐํ๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋ค์์ ๋ ์ค๋ ์ท์ ๋น๊ตํ๋ ์์ 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 ํ์์๋ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ๋ณด๊ณ ์๋ ๋์๋ฅผ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค. ๋ด๊ฐ ์์ ์ฐจ๋ฆฐ ๊ฒ์ ์ ๋ฌ๋ฆฌ ์ํ ๋๊ธฐ์ด์ด ๋งค์ฐ ๋ฐ์๋ค๋ ๊ฒ์ ๋๋ค. tracemalloc์ ์ด๋ฒคํธ ๋์คํจ์น๋ฅผ โโ๋์์ ๊ฐ๋ฅํ ์์ค ์ค ํ๋๋ก ๋ณด์ฌ ์ฃผ์๊ธฐ ๋๋ฌธ์ ๋ช ์ ์ ์ผ๋ก ์์ ์ด๋ฒคํธ๋ฅผ ๋นํ์ฑํํ๊ณ ํ๋ผ์ ์ธ์คํด์ค๋ฅผ ํด์ ํ์ต๋๋ค. ์ฌ๊ธฐ์ ๊ฒฐ๊ณผ.
๋์์ ๊ฐ๋ฅํ ์์ค ๋๋ ๋ช ์ ์ ์ผ๋ก ์์ ์ด๋ฒคํธ๋ฅผ ๋นํ์ฑํํ๊ณ ๊ฝ ์ธ์คํด์ค๋ฅผ ๋๋๋ค.
์ด์ฐฝ๊ธฐ๋ถํฐ์ด ๋ฌธ์ ๋ฅผ ์กฐ์ฉํ ์ง์ผ๋ณธ ์ฌ๋ (์ง์ ๊ฒฝํ ํ ์ ์ด์๋ ์ฌ๋)์ ์ผํ ๋ฐ์ดํฐ ํฌ์ธํธ : ์์ ์์ ์ ์ํํ์ ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ๋ค๋ฅธ ํ๋ก์ ํธ (์ ๋ฌ๋ฆฌ ์์ ๋์ด ๋ง์ง ์์)๋ฅผ ์๊ณ ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ค์งํฉ๋๋ค. ์ค๊ณ ์ ๋ณด ๋ง ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋์ผํ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ (AFAIK, rabbitmq, gevent ๋ฑ์ ๋ํ ์ ๋ณด ์์)๋ผ๋ ์ฌ์ค์กฐ์ฐจ ํ์ธํ ์ ์์ง๋ง ์๊ด ๊ด๊ณ๊ฐ ์๋ค๋ ์ ์ด ํฅ๋ฏธ ๋กญ์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๋ rabbitmq ์ฐ๊ฒฐ๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.์ด ๋์ถ์ ๊ด์ฐฐ ํ ์คํ์ ๋๋ค.
์ฐ๋ฆฌ๋ ๋ชจ๋ ์์ ์ ๋์ถ์ด ์๋์ง ํ์ธํ์ง๋ง ๋์ถ์ ์ฐพ์ ์ ์์๊ธฐ ๋๋ฌธ์ ์ ๋ฌ๋ฆฌ ์ธก๋ฉด์์ ๋ฌด์ธ๊ฐ๊ฐ ์์ฌ๋๋ ์ด์ ์ ๋๋ค.
ํ ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ์ฌ์ค์ ํ์ฌ ๋ง์ ์์ ์๊ฐ ์คํ ์ค์ด๋ผ๋ ๊ฒ์ ๋๋ค. ํ ๋ฒ ๋์ถ๋๊ธฐ ์์ํ๋ฉด ๊ฝ์ ์คํ๋ผ์ธ์ผ๋ก ํ์๋๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ด๋๋ฅผ ๋ณผ์ง ์์ด๋์ด๊ฐ ๋ถ์กฑํ์ฌ ๊ฝ ๋ฐ ์์ ์ด๋ฒคํธ๋ฅผ ๋นํ์ฑํํ๊ณ ๋์ถ์ด ๋ค์ ๋ฐ์ํ๋์ง ์ฌ๋ถ๋ฅผ ๊ณ์ ๋ชจ๋ํฐ๋งํฉ๋๋ค.
์ด ์์ ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋์ถ๋๋ ์คํ์ ๋ ๋ค๋ฅธ ๋ถ๋ถ์ด๋ผ๊ณ ๋ฏฟ๊ณ ์์ต๋๋ค. ์ ๋ฌ๋ฆฌ๋ ๊ณผ๊ฑฐ์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ ์ดํ๋ โโ๋ฐ ๊ธฐ์ฌํ ์ฐ์ฐํ ํ๋์ํ์ ์ ์์ง๋ง, ์ฐ๋ฆฌ ๋ชจ๋๋์ด๋ฅผ ํ์ธํ ๋งํผ ๋น์ทํ ๋ฌธ์ ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ด ๋ฌ๋ฆฌ๊ณ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค ...
์ด ๊ฒฝ์ฐ ํน์ ์์ค์ ๋์์ฑ, ์์ ๋๊ธฐ์ด ๋ฐ ํ์ ์์ ์๋น ์์ ์ ํ์ฉํ๊ฑฐ๋ ํ์ฉํ์ง ์๋ ๊ฒ์ ๋ํด ํ๋ช ํด์ผํฉ๋๋ค. ๋ํ ์ฐ๋ฆฌ ๋ชจ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ์์ ์ด ์๋ฒ๋ฅผ ์์์ํค๊ธฐ ์ ์ ์ฃฝ์ผ ์์๋ ๋ด์ฅ ๋ ๋ณดํธ ์ฅ์น๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
์ ์ ๋ ๋ง์ ์ฌ๋๋ค์ด ์ ๋ฌ๋ฆฌ์์ ์์ฒญ๋๊ฒ ๋ง์ CPU ๋ฐ์ด๋ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ด๋ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ณ ์์ต๋๋ค.์ด ํ๋ก์ธ์ค๋ ์ค์ ๋ก ๋ง๋ค์ด์ง์ง ์์๊ธฐ ๋๋ฌธ์ ๋น ๋ฅธ ์์ ๋ฌธ์์ ์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ด ํฌํจ๋์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด์ ์๊ฒฌ์์ ์ด๋ฏธ ์ธ๊ธํ๋ฏ์ด ์ค๋ ์ ๋ถํฐ max-tasks-per-child
๋ฐ ๋์์ฑ์ด 1
์ค์ ๋ ์์
์๋ฅผ ์คํํ๊ณ ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ํด์๋ ์๋ฌด๊ฒ๋ํ์ง ์์ต๋๋ค. ๋ํ Redis๋ฅผ ๋ธ๋ก์ปค ๋ฐ ๊ฒฐ๊ณผ ๋ฐฑ์๋๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ด ๊ด์ฐฐ์ ๋ฐ๋ฅด๋ฉด RabbitMQ๋ฅผ ๋ธ๋ก์ปค๋ก ์ฌ์ฉํ ๋ max-tasks-per-child
๋ฅผ 1
ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ "ํด๊ฒฐ"๋๋ฉด ์
๋ฌ๋ฆฌ๊ฐ ์๋ ์์
๊ตฌํ ๋ฌธ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๊ด์ฐฐํ๊ณ ๋ณด๊ณ ํ๋ ๊ฒ์ ๋ค๋ฆ ๋๋ค. ๋จ์ผ ์์ ์ ์ฒ๋ฆฌํ์ง ์๊ณ ์์ ์๋ฅผ ๋ฉฐ์น ๋์ ์ ํด ์ํ๋ก ๋๋๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ๋๋ฌํ์ฌ ๊ฐ๋ ์์ ์ํด ์ฃฝ์ ๋๊น์ง ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋์ถ๋ฉ๋๋ค. ์ด์ ์๊ฒฌ์์ ์์ธํ ๋ด์ฉ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฐจํธ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
์์
์๊ฐ ์ผ์ ์ ๋ฐ๋ผ ๋จ์ผ ์์
์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ์ฐจํธ๋ ์ด๋ ์ ๋ ๊ตฌํํ์ ๋น์ทํ๊ฒ ํ์๋์ด์ผํ์ง๋ง ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ฆ๊ฐ ๋งํ๋ค๋ ๊ฒ์ ๋ถ๋ช
ํ ์ ์ ์์ต๋๋ค.
์ ๋ ์ ๋ฌ๋ฆฌ ์์ ์์ ํ๋กํ์ผ ๋ง์ ๋ก๋๋งต์ ๋ฃ์์ต๋๋ค. ์ด ์์ ์ ์์ํ ๋ ๋ฉ๋ชจ๋ฆฌ ๋คํ์ ์์ธํ ๋ด์ฉ์ ๊ณต์ ํ๊ฒ ์ต๋๋ค.
๊ฝ์ ๋๊ณ ์ค์ ์ ํตํด ์์ ์ด๋ฒคํธ๋ฅผ ๋ช ์ ์ ์ผ๋ก ๋นํ์ฑํํ๋ฉด ๋์๊ฐ ํด๊ฒฐ๋์์์ ํ์ธํ ์ ์์ต๋๋ค.
์๊น ๋ง์ ๋๋ ธ๋ฏ์ด ์ผ๊พผ์ด ์๊ธฐ ์์ํ๋ ์๊ฐ ๊ฝ์์์ ์คํ๋ผ์ธ ์ํ๊ฐ ๋ ๊ฒ์์ ์์ ์ฐจ๋ฆฌ๊ณ ์ ๋ฌ๋ฆฌ ์ํ๊ฐ ํญ์ ๋ฐ์๊ฒ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ด ๊ธธ์ ๋ฐ์ ๊ฝ์ ๊ป์ต๋๋ค.
๋ถํํ๋ ๋์๋ฅผ ์ผ์ผํค๋ ์ฝ๋๋ฅผ ์ฐพ์ ์ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์ด๋์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ์ ์ ๋ฌ๋ฆฌ ๋ฌธ์ ๊ฐ ์๋๋ผ ๊ฝ์ผ๊น์?
@auvipy ๊ฝ์ด ๋ฌธ์ ๋ฅผ ์ ๋ฐํ์ง๋ง ๋์ถ์ ํ์คํ ์์ ์ (์ ๋ฌ๋ฆฌ)์์ ๋ฐ์ํฉ๋๋ค.
@auvipy ๊ฝ์ด ๋ฌธ์ ๋ฅผ ์ ๋ฐํ์ง๋ง ๋์ถ์ ํ์คํ ์์ ์ (์ ๋ฌ๋ฆฌ)์์ ๋ฐ์ํฉ๋๋ค.
๊ทธ๋ด ์ ์์ง. ๊ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
Redis ๋ฐ Flower์ ํจ๊ป Celery๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค๊ณ ๋งํด์ผํฉ๋๋ค. ๋ฐ์ดํฐ์ ๊ด๋ จํ์ฌ ๋์๊ฒ ์ํ๋ ๊ฒ์ด ์์ต๋๊น?
@auvipy๋ Flower๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์๋ ์ด๋ฒคํธ๊ฐ ๋นํ์ฑํ ๋ ์ํ๋ก ์์๋ฉ๋๋ค.
@auvipy๋ Flower๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์์ ์๋ ์ด๋ฒคํธ๊ฐ ๋นํ์ฑํ ๋ ์ํ๋ก ์์๋ฉ๋๋ค.
๋๋ฒ๊น ์ ์๋ํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์์ ์์ธ์ ์ฐพ์ผ์ญ์์ค. ์ ๋ฌ๋ฆฌ ๋๋ ๋น์ ์ ์ ์์ต๋๋ค. ๋จ์ ํ ์คํธ์ ํตํฉ ํ ์คํธ๋ฅผ ๊ณต์ ํ ์์๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
๋๋ฒ๊น ์ ์๋ํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์์ ์์ธ์ ์ฐพ์ผ์ญ์์ค. ์ ๋ฌ๋ฆฌ ๋๋ ๋น์ ์ ์ ์์ต๋๋ค. ๋จ์ ํ ์คํธ์ ํตํฉ ํ ์คํธ๋ฅผ ๊ณต์ ํ ์์๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
์ฌ๊ธฐ์ ์ธ๊ธ ํ ๋ฐ์ ๊ฐ์ด, ์์
์๊ฐ ์์
์ ์ฒ๋ฆฌํ์ง ์๋๋ผ๋ ์
๋ฌ๋ฆฌ ์์
์๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋์๋ก ์ธํด OOM์ด ๋ฐ์ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
ํ์ฌ์ IP๊ฐ ๋
ธ์ถ ๋ ์ ์์ผ๋ฏ๋ก ๋จ์ ๋๋ ํตํฉ ํ
์คํธ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ์ฃ์กํฉ๋๋ค. ํ์ง๋ง ๋ด๋ถ ๋ก๋๋งต์์ ํ๋ก๋์
์์
์์ ๋ฉ๋ชจ๋ฆฌ ๋คํ๋ฅผ ์บก์ฒํ๋ ์์
์ ์ถ๊ฐํ์ต๋๋ค. ์๋ฃ๋๋ฉด ๋ช ๊ฐ์ง ์๋๋ฆฌ์ค์ ๋ํ ์นด์ดํฐ ๋ฐ ์ฐธ์กฐ๋ฅผ ๊ณต์ ํฉ๋๋ค.
@jsynowiec 5.0.0 GA ์ด์ ์ ๋ง๋ค ์ ์๋ค๋ฉด (์ ๋ฐ์ดํธ๋ฅผ ์ํด # 6266์ ๋ฐ๋ฅด์ญ์์ค) ๊ทธ๊ฒ์ ๊ต์ฅ ํ ๊ฒ์ ๋๋ค.
๋ฒ๊ทธ ์์ ์ด ๋ง์คํฐ์ ๋์ฐฉํ๋ฉด 4.x๋ก๋ ๋ฐฑ ํฌํธ๋ฉ๋๋ค.
@thedrow 5.0์ GA๋ ์ธ์ ๊ณํ๋ฉ๋๊น? ์ํ๊น๊ฒ๋ ์์ง Py3 ๐๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ๋ ๊ฑฐ์ ์ฝ๋๊ฐ ์์ผ๋ฏ๋ก ๋น๋ถ๊ฐ Celery 4๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
ํ๋์ ๋ฆด๋ฆฌ์ค ์ฐจ๋จ๊ธฐ์ ์๋ฃํด์ผ ํ ๋ฌธ์๊ฐ ์์ต๋๋ค.
๊ณง ๋ต์ด ๋์ต๋๋ค.
๊ฝ์ ๋๋ฉด ๋์๊ฐ ๋งํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ฑฐ์ ํ ๋ฌ ๋์ ๋์ถ์์ด ์คํ๋์์ต๋๋ค.
๋ฐ๋ผ์ ์ด๋ฒคํธ ๊ฒ์ ๋ฉ์ปค๋์ฆ ์ด๋๊ฐ์ ์ฌ์ ํ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค.
๋๊ตฌ๋ ์ง ๊ทธ๊ฒ์ด ๋ฌด์์ธ์ง ์๊ณ ์์ต๋๊น?
์ฐ๋ฆฌ๋ Flower๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์
์๋ --events
์์ด ์์๋์ง๋ง ์ง์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํฉ๋๋ค.
๊ณง ๋ต์ด ๋์ต๋๋ค.
ํ๋ก๋์ ์์ ์๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ ๋คํ ๋ฐ ๊ฐ์ฒด ์นด์ดํฐ๋ฅผ ์ป๋ ๋ฐ ๋์ ์ฐ์ ์์๋ฅผ ํ ๋นํ์ต๋๋ค. ๋ช ์ฃผ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ ํ ์์์ ๊ฒ์ ๋๋ค. ๋ํ Python 3์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๊ฒ์ด ์คํ๋๊ณ ํ๋กํ์ผ ๋ง๋๋๋ก py2-> py3 ํฌํ ๋ง๋ฌด๋ฆฌ์ ๋ํ ์ฐ์ ์์๋ฅผ ๋์์ต๋๋ค.
์ ๊ฐ ๊ฑฑ์ ํ๋ ๊ฒ์ ์ฌ๊ธฐ์ ๋ ๊ฐ์ง ๋ค๋ฅธ ๋ฌธ์ ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ถ๋ช
ํ. ํ๋๋ ์ด๋ฒคํธ ๋ฐ ๊ฝ๊ณผ ๊ด๋ จ์ด ์์ผ๋ฉฐ RabbitMQ๋ฅผ ๋ธ๋ก์ปค๋ก ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ณด๊ณ ๋ ๋ฌธ์ ์ ๋ฐ๋ฅด๋ฉด GitHub์์ ๋ช ๋
๋์ ์ฌ๊ธฐ์ ๊ธฐ์ ๋ํ๋ฉ๋๋ค. ๋ด ํ๋ก์ ํธ์ ์ํฅ์ ๋ฏธ์น๋ ๋ค๋ฅธ ํ๋๋ ๋ค๋ฅธ ๊ตฌ์ฑ ์์์ ๊ด๋ จ์ด ์์ผ๋ฉฐ Redis๋ฅผ ๋ธ๋ก์ปค๋ก ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ๋๋ ๋ฃจํธ์์ ๐คท๐ผ๋ฅผ ์๋ ๋์ผํ ์ฝ๋์์ ๋ฐ์ํ๋ ๋์ผํ ๋ฌธ์ ์ผ ์ ์์ต๋๋ค. trail
ํ์ ์์
์ ์ถ์ ํ๊ณ AsyncResult
์ธ์คํด์ค๋ฅผ ์ ์ถํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๐
@thedrow @auvipy ์ฐ๋ฆฌ๊ฐ ์ด์ ์์ ์์ ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ ๋ง์ผ๋ก ์ด๋ํ๊ณ ์์์ ์๋ ค๋๋ฆฝ๋๋ค.
๋ํ Python3 ๋ง์ด๊ทธ๋ ์ด์
์ ์๋ฃํ๋ ๋์ https://github.com/celery/celery/issues/4470 ๋๋ https://github.com/celery/celery/issues/5359 ์ ๊ด๋ จ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค join_native
ํธ์ถ์ด ๋ฌด๊ธฐํ ์ค๋จ๋ฉ๋๋ค. ๋น ๋ฅธ strace๋ ๋ฌธ์ ๊ทธ๋๋ก ์ฝ๊ธฐ์ ๋งค๋ฌ๋ ค ์์ผ๋ฉฐ, ์ด๋ ์ ์์ค ์ปค๋ / lib ํญ๋ชฉ์ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ง๊ธ์ ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ด์ ์ ๋ง์ถ๋ฉด์ join
๋ฅผ ํ๋งํ๋ ์ผ๋ฐ ๋ชจ๋๋ก ์ ํํ์ต๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ-๋ง์นจ๋ด _some_ data : celery-memtrace-1.tar.xz , signature , my key .
์์นด์ด๋ธ์๋ ~ 16 ์ผ ํ 8 ๋ช
์ ์์
์์ tracemalloc
๋ก๊ทธ, ๊ธฐ๊ฐ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ทธ๋ํ ๋ฐ ์ผ๋ถ ๋ฒ์ ์ ๋ณด (Celery ์์ ๋ฐฐ๋ ํฌํจ)๊ฐ ํฌํจ๋ฉ๋๋ค.
๋๋ ์ ์งํ๊ฒ ์ด๊ฒ ์ค ํ๋๋ฅผ ๋ถ์ํ๋ ๋ฐ ์๋นํ ์๊ฐ์ ์๋นํ์ง ์์์ง๋ง a) ์ฐ๋ฆฌ ์ฝ๋๋ ๋ชฉ๋ก์ ์์์ต๋๋ค. ๋ค๋ฅธ ๊ณณ์ ์๊ฑฐ๋ ์กฐํฉ / ์ํธ ์์ฉ ๋ฌธ์ ์ ๋๋ค.
๋ค๋ฅธ ์ธ๋ถ ์ฌํญ์ด ์ ์ฉ ํ ๊ฒฝ์ฐ ๋ฌธ์ํ์ญ์์ค. ๋ํ์ด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ก๊น ์ ์ฌ์ฉํ์ฌ 8 ๋ช ์ ์์ ์๋ฅผ ๊ณ์ ์คํํ๋ฏ๋ก ๋ ๋ง์ / ๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ์์ง ํ ์ ์์ต๋๋ค.
ํธ์ง : ๋ํ ์ด ์ค๋ ๋
์ด ์ ์ถ์ ๊ทผ๋ณธ ์์ธ์ ์ฐพ์ผ์๊ธฐ ๋ฐ๋๋๋ค.
๋๋ ์ด๊ฒ์ ๋ํด ์ค์ค๋ก ํํค์น ์๊ฐ์ ๋ด๋๋ก ๋
ธ๋ ฅํ ๊ฒ์ด๋ค.
์ด๊ฒ์ด ๋ฌธ์ ๋ฅผ ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
https://reliability.substack.com/p/run-python-servers-more-efficiently
๋ฉ๋ชจ๋ฆฌ ๋์ ์์ธ์ด ์ ๋ฌ๋ฆฌ ์์ฒด๊ฐ ์๋ ์์ฒญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์์์ ๊ฐ๋ฅ์ฑ์ ์กฐ์ฌํ๊ณ ์์ต๋๋ค. ์์ ์์ ์์ฒญ์ ์ฌ์ฉํ์ฌ ์ ๋ฌ๋ฆฌ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๊ฒฝํํ๋ ๋ค๋ฅธ ์ฌ๋์ด ์์ต๋๊น?
@ErrorInPersona ์, ์์ฒญ์ด ์๊ฑฐ๋์๋ ์์ ์์ OOM์ ๋ฑ๋กํ๊ณ ์์ต๋๋ค.
@drbig ํ์ด์ด ์์ต๋๊น?
๊ธ์, "๋ น์"์๋ณด์ธ์. ๋ฐ๋ฅ์ด ์ฒ์ฒํ ์ฌ๋ผ๊ฐ๊ณ ์์ต๋๋ค.ํ์ง๋ง ํ์คํ๊ฒ ... "๊ทธ๋, ์ฌ์ ํ ๋ฌธ์ ์ ๋๋ค"๋ผ๋ ๋น ๋ฅธ ํ์ธ์ ์ ์ธํ๊ณ ๋ ๋ด ์ชฝ์์ ์ถ๊ฐ ํ ๊ฒ์ด ๋ง์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ @thedrow๊ฐ ์ ๊ณต ํ ๋งํฌ๋ฅผ - try running some workers with jemalloc forced in
์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก _eventually_์ ๋๋ฌํ๊ฒ ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ๋ฌธ์ ๊ฐ ์ข ๊ฒฐ ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?