Celery: ์ง€์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜

์— ๋งŒ๋“  2018๋…„ 06์›” 23์ผ  ยท  129์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: celery/celery

Celery ์ž‘์—…์ž์˜ ์ƒ์œ„ ํ”„๋กœ์„ธ์Šค์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
๋ฉฐ์น ๋งˆ๋‹ค ๊ฐ‘์ž๊ธฐ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
Celery๋ฅผ ์ค‘์ง€ํ•˜์ง€ ์•Š์œผ๋ฉด ์ˆ˜์‹ญ ์‹œ๊ฐ„ ๋‚ด์— ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ ์–ด๋„ Celery 4.1์—์„œ ๋ฐœ์ƒํ•˜๋ฉฐ Celery 4.2์—์„œ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
Celery๋Š” Ubuntu 16์—์„œ ์‹คํ–‰๋˜๊ณ  ๋ธŒ๋กœ์ปค๋Š” RabbitMQ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

memory

Prefork Workers Pool RabbitMQ Broker Bug Report Critical Needs Testcase โœ˜ Needs Verification โœ˜ memory leak

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด ๋ฌธ์ œ๊ฐ€ ์ข…๊ฒฐ ๋œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ชจ๋“  129 ๋Œ“๊ธ€

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๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ทธ๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๊ฐ™์€ ๋ฌธ์ œ
screenshot 2018-06-25 11 09 22
์ด ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฉฐ์น ๋งˆ๋‹ค ์ž‘์—…์ž๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๋กœ๊ทธ์—๋Š” ์ค‘์š”ํ•œ ๋‹จ์„œ๊ฐ€ ์—†์ง€๋งŒ ์žฌ ์—ฐ๊ฒฐ์ด ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ง€์†์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ ์–ด๋”˜๊ฐ€์— ๋กœ๊ทธ ํ•ญ๋ชฉ์„ ๋‹ค์‹œ ์—ฐ๊ฒฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—
๋‚ด 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}

screenshot 2018-06-25 11 35 17
๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๊ฒƒ์€ ์ƒˆ๋กœ ๋ฐฐ์น˜ ๋œ ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ 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 ๋Œ€์˜ ์„œ๋ฒ„๋กœ ์ž‘์—…์ž๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์–ด์ œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์ง€๋งŒ ๊ฑฐ์˜ ๋ชจ๋“  ์„œ๋ฒ„์—์„œ ๋™์‹œ์— ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
memoryleak

๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ณ  ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๊ธฐ์— ๋‘์‹ญ์‹œ์˜ค.

์…€๋Ÿฌ๋ฆฌ์™€ 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

๋™์ผํ•œ ๋ฌธ์ œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ์–ต
image

๋ฒ„์ „
python 3.6.5 ์…€๋Ÿฌ๋ฆฌ 4.2.1 ๋ฐฑ์—”๋“œ redis ๋ธŒ๋กœ์ปค rabbitmq

๊ตฌ์„ฑ

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

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

```ํŒŒ์ด์ฌ

-- ์ฝ”๋”ฉ : utf-8--

๋‹ค์‹œ๋งˆ ์ˆ˜์ž… ๋Œ€๊ธฐ์—ด, ๊ตํ™˜์—์„œ
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 ์ž‘์—…์ž๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ฐ€์‹ญ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. ๋†€๋ž๊ฒŒ๋„ ๊ฐ€์‹ญ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ฆ‰๊ฐ์ ์ธ ํšจ๊ณผ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
celery-memory-14d

์…€๋Ÿฌ๋ฆฌ ์ž‘์—…์ž๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋‘ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์‹ญ์„ ๋น„ํ™œ์„ฑํ™”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๋ฉด ์—ฌ๊ธฐ์— ์„ค๋ช… ๋œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ŠคํŒŒ์ดํฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— 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์™€ ๊ฑฐ์˜ ๊ฐ™์€ ๋น„์œจ๋กœ ๋ˆ„์ถœ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

์ด์ œ AMQP๊ฐ€ ๋‚ด๋ถ€์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋ฉด ์ž์ฒด ์‹ฌ์žฅ ๋ฐ•๋™์ด ์žˆ๊ณ  ๋Š์–ด์ง„ ์—ฐ๊ฒฐ์„ ๊ฐ์ง€ํ•˜๋ฉด ๋‚ด๋ถ€์—์„œ ๋‹ค์‹œ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑํ™” ๋œ ์ด๋ฒคํŠธ ์œ ํ˜• (๊ฐ€์‹ญ, ํ•˜ํŠธ ๋น„ํŠธ)์— ๋”ฐ๋ผ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋ˆ„์ถœ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ eventlet ๋ฐ gevent์˜ ๋ชจ๋“  ๋ฒ„์ „์— ํ•ด๋‹น๋˜์ง€๋งŒ ์ผ๋ถ€๋Š” ์ƒํ™ฉ์„ ์•…ํ™” / ๋” ๋ˆˆ์— ๋„๊ฒŒ ๋งŒ๋“œ๋Š” ์—ฐ๊ฒฐ ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ์˜ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ์ž„์„ ๋ถ€์ •ํ•˜๊ฑฐ๋‚˜ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํŒŒ์ด์ฌ : 2.7
์…€๋Ÿฌ๋ฆฌ : 4.2.1
OS : CentOS ๋ฆด๋ฆฌ์Šค 6.10
๋ธŒ๋กœ์ปค๋กœ์„œ์˜ Redis

์ฒจ๋ถ€ ๋œ ์ด๋ฏธ์ง€์—์„œ ๋‹ค์Œ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋Š” ์ง€์†์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  ์žฌ์‹œ์ž‘์‹œ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.
  2. 1 ์›” 13 ์ผ-์…€๋Ÿฌ๋ฆฌ 3.1.25์—์„œ 4.2.1๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„ ์ฆ๊ฐ€ ์†๋„๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

image

์ตœ์‹  ์ •๋ณด

์ด ๋ฌธ์ œ์— ๊ด€๊ณ„์—†์ด ์šฐ๋ฆฌ๋Š” ํŒŒ์ด์ฌ 3.6์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๊ณ  ๊ทธ ์ดํ›„๋กœ ๋ˆ„์ˆ˜๊ฐ€ ๋” ์ด์ƒ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

image
(์—…๊ทธ๋ ˆ์ด๋“œ๋Š” 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๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์œ ์ถœ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

image

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 ๋ช…์ด ๋ˆ„์ˆ˜๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
image

๊ทธ๋ž˜์„œ ๊ฐ ์ž‘์—…์ž์—์„œ ์‹คํ–‰๋˜๋Š” ๋ธŒ๋กœ๋“œ ์บ์ŠคํŠธ ๋ฉ”์‹œ์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. 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 ์‹œ๊ฐ„ ๋™์•ˆ ๊ณ„์†๋˜๋Š” ์ž‘์€ ์ŠคํŒŒ์ดํฌ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ "ํก์ˆ˜ / ์ˆ˜์ง‘"๋˜์—ˆ์Šต๋‹ˆ๋‹ค .. ๋งˆ์ง€๋ง‰ ํ•˜๋‚˜๊ฐ€ ์ŠคํŒŒ์ดํฌ๋ฅผ ์‹œ์ž‘ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ŠคํŒŒ์ดํฌ, ์ฒซ ๋ฒˆ์งธ ๋žจํ”„ ์ดํ›„, ๋‚˜๋Š” ์ƒˆ๋Š” ์ž‘์—…์ž๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ž‘์—…์ž๊ฐ€ ๊ทธ ํ›„์— ์ƒˆ๊ธฐ ์‹œ์ž‘ํ–ˆ๊ฑฐ๋‚˜ ์•„๋งˆ๋„ ์ด๋ฏธ ์ƒˆ๋Š” ๊ฒƒ, ๋‘ ๋ฒˆ์งธ ๋žจํ”„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

์‹ฌ์žฅ ๋ฐ•๋™์—†์ด ํ…Œ์ŠคํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ : 2 ์ผ ํ›„ ๋‹ค์‹œ ํ•˜ํŠธ ๋น„ํŠธ๊ฐ€ ์œ ์ถœ๋˜์ง€ ์•Š๊ณ  ๋™์ผํ•œ ๋™์ž‘

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

image

์ตœ์‹  ์ •๋ณด:
์…€๋Ÿฌ๋ฆฌ 4.3.0์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋œ ๊ฒƒ ๊ฐ™๊ณ  ์ผ์ฃผ์ผ ์ดํ›„๋กœ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.
image

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

์–ด๋–ป๊ฒŒ ๋“  ์ฝ”๋“œ๋ฅผ ๊ณ„์ธกํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋งํฌ์™€ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

๋˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์›์ธ์„ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
https://github.com/celery/celery/blob/master/celery/events/dispatcher.py#L75
ํ† ๋ผ์™€์˜ ์—ฐ๊ฒฐ ๋ฌธ์ œ ์ดํ›„์—์ด ๋ฒ„ํผ๊ฐ€ ์ปค์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฒฐ๊ตญ ์ด๋ฒคํŠธ๋ฅผ ์ง€์šฐ์ง€ ๋ชปํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉฐ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๊ณ„์† ์„ฑ์žฅํ•˜๊ณ  ์ ์  ๋” ๋งŽ์€ ์ˆซ์–‘์„ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค. buffer_while_offline=False ์—ฌ๊ธฐ https://github.com/celery/celery/blob/master/celery/worker/consumer/events.py#L43์„ ์ „๋‹ฌํ•˜๋ฉด ๋ˆ„์ˆ˜๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์ด๊ฒƒ์ด ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@ yevhen-m ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ข‹์ง€๋งŒ ์ ์ ˆํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฐ์†์ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ๋ฅผ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค.

image

celery-pod-screencshot-lastweek

ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์…€๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋„์ปค๋ฅผ ํ†ตํ•ด ๋ฐฐํฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์Šคํฌ๋ฆฐ ์ƒท๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
ํ”„๋กœ๋•์…˜ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Docker ์ƒ์œ„ ์ด๋ฏธ์ง€ : python 3.6.8-buster
์…€๋Ÿฌ๋ฆฌ ๋ฒ„์ „ : 4.2.0
๋ช…๋ น ์˜ต์…˜ :

  • ๋™์‹œ์„ฑ 4
  • ํ”„๋ฆฌ ํŽ˜์น˜ ์Šน์ˆ˜ 8
  • ๊ฒฐ๊ณผ _ ๋ฐฑ์—”๋“œ ์—†์Œ
  • acks_late ๋ฐ reject_on_worker_lost

์…€๋Ÿฌ๋ฆฌ ๋ฒ„์ „์„ 4.3.0์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์…€๋Ÿฌ๋ฆฌ 4.4.0์€ ์ตœ์‹  ์•ˆ์ • ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

ํŒ€,์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์…€๋Ÿฌ๋ฆฌ 4.4.0์—์„œ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๊ณ  ์ˆ˜์ • ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

ํŒ€,์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์…€๋Ÿฌ๋ฆฌ 4.4.0์—์„œ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๊ณ  ์ˆ˜์ • ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

๋ถˆํ–‰ํ•˜๊ฒŒ๋„. ์ด์ œ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€,์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์…€๋Ÿฌ๋ฆฌ 4.4.0์—์„œ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๊ณ  ์ˆ˜์ • ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

4.4.1์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.4.1์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฒ„์ „ 4.4.1์—์„œ ์ˆ˜์ • ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

@auvipy ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ 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๋Š” ๋ธŒ๋กœ์ปค ๋ฐ ๊ฒฐ๊ณผ ์ €์žฅ์†Œ ๋ชจ๋‘๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

image

~ ์žฅ๊ธฐ ์‹คํ–‰ ์ž‘์—…์—์„œ ๋ˆ„๋ฝ ๋œ ํ•˜ํŠธ ๋น„ํŠธ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งํฌ ๋œ ์ด์Šˆ์—๋ณด๊ณ  ๋œ ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์ง€์†๋ฉ๋‹ˆ๋‹ค. ~

๋น„ํ™œ์„ฑํ™” ๋œ ์‹ฌ์žฅ ๋ฐ•๋™๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

@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๋ฅผ ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

image

+1, ์ตœ์†Œํ•œ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋”๋ผ๋„ 24 ์‹œ๊ฐ„์— ๊ฑธ์ณ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ ์ง„์ ์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์›์ธ์„ ํ”„๋กœํŒŒ์ผ ๋งํ•˜๊ณ  ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

v4.4.6์—์„œ ์—ฌ์ „ํžˆ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์˜๊ฒฌ์— ๋‚˜์—ด๋œ ์„ค์ •์œผ๋กœ ์ž‘์—…์ž๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. OP๋Š” RabbitMQ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Redis๋ฅผ ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

image

๋‹ค๋ฅธ ๋ฌธ์ œ์ด๊ฑฐ๋‚˜ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด OP์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ๋„ ๋‹ค๋ฅธ ๋ฌธ์ œ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

....

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

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

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

Redis ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜? ์ €๋Š” 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 ์ผ๋งˆ๋‹ค ์ค‘๋‹จ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
memory-leaks-1

์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ๋ณด๋ฅ˜์ค‘์ธ ์ž‘์—…์˜ ์ˆ˜๋ฅผ ํ™•์ธํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์•ฝ 0์ž…๋‹ˆ๋‹ค (์ด ๋ฐ์ดํ„ฐ๋Š” ๋ฉฐ์น  ์ „์˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

memory-leaks-2

์šฐ๋ฆฌ๋Š” ํ•˜๋ฃจ์— ์•ฝ 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_leak

์ด ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋Š” ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ๋‚˜์š”? celery == 4.4.7 (rabbitmq ์‚ฌ์šฉ)์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์‚ฌํ•œ ๋ˆ„์ˆ˜๋ฅผ ๊ฒฝํ—˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—…์ž๊ฐ€ ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ, ๋•Œ๋กœ๋Š” ํ›จ์”ฌ ๋” ์•ˆ์ •์ ์œผ๋กœ ์‹คํ–‰ ํ•œ ๋‹ค์Œ ๊ฐ‘์ž๊ธฐ ๋Š๋ฆฌ๊ฒŒ ๋ˆ„์ˆ˜๋˜๊ธฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ --concurrency=1 ๋ฐ ํ”Œ๋ž˜๊ทธ --max-tasks-per-child=100 ์™€ ํ•จ๊ป˜ prefork๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.์ด ํ”Œ๋ž˜๊ทธ๋Š” ์ƒ์œ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์œ ์ถœ ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฏ€๋กœ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

celery_leak

์ด ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋Š” ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ฌ๋Š” ๊ฒƒ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ํ”„๋กœ๋•์…˜์—์„œ์ด ๋ฌธ์ œ์— ์ง๋ฉด ํ•œ ๋ˆ„๊ตฐ๊ฐ€์˜ ๊ด€์‹ฌ์ด๋ฉฐ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ  ๊ธฐ์—ฌํ•˜๊ฑฐ๋‚˜ ์ ์–ด๋„ ํ”„๋กœ๋•์…˜์—์„œ ๋ˆ„์ถœ์˜ ๊ทผ๋ณธ ์›์ธ์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ๋„์šธ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์–ด๋–ป๊ฒŒํ•ด์•ผํ• ์ง€์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ๋ถ€์กฑํ–ˆ๊ณ  ๋ช‡ ๊ฐ€์ง€ ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋งŽ์ด ์‹๋ณ„ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ์ขํ˜€์ง€๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ์ œ๊ฐ€ ์ฐ์€ 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๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.์ด ํ”Œ๋ž˜๊ทธ๋Š” ์ƒ์œ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์œ ์ถœ ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฏ€๋กœ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
celery_leak
์ด ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜๋Š” ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ฌ๋Š” ๊ฒƒ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ํ”„๋กœ๋•์…˜์—์„œ์ด ๋ฌธ์ œ์— ์ง๋ฉด ํ•œ ๋ˆ„๊ตฐ๊ฐ€์˜ ๊ด€์‹ฌ์ด๋ฉฐ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ  ๊ธฐ์—ฌํ•˜๊ฑฐ๋‚˜ ์ ์–ด๋„ ํ”„๋กœ๋•์…˜์—์„œ ๋ˆ„์ถœ์˜ ๊ทผ๋ณธ ์›์ธ์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋ฅผ ์œ„ํ•ด --max-tasks-per-child ํ•˜๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์ด ์ƒ˜ํ”Œ ์ธ์ˆ˜ --autoscale=5,2 --max-tasks-per-child=40 ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Screenshot 2020-08-13 at 2 26 13 PM

์ตœ๊ทผ ์…€๋Ÿฌ๋ฆฌ ์—…๊ทธ๋ ˆ์ด๋“œ๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์™„์ „ํžˆ ํ™•์‹  ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์„ค์ •์œผ๋กœ ๋ˆ„์ถœ์ด ํ•ด๊ฒฐ๋˜์—ˆ์Œ์„ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ์—์„œ ์–ด๋–ค ์„ค์ •์ด ์œ ํšจํ•œ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ Django ์„ค์ • ํŒŒ์ผ์—์„œ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

CELERY_CONCURRENCY = CELERY_WORKER_CONCURRENCY = 1
CELERY_MAX_TASKS_PER_CHILD = CELERY_WORKER_MAX_TASKS_PER_CHILD = 1

์ด๊ฒƒ์€ gevent ํ’€์—์„œ๋„ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€๋ณด๊ณ ์žˆ๋Š” ๋ˆ„์ˆ˜๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•Œ์•„ ์ฐจ๋ฆฐ ๊ฒƒ์€ ์…€๋Ÿฌ๋ฆฌ ์˜ˆํ”„ ๋Œ€๊ธฐ์—ด์ด ๋งค์šฐ ๋ฐ”์˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. tracemalloc์€ ์ด๋ฒคํŠธ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹๋ˆ„์ˆ˜์˜ ๊ฐ€๋Šฅํ•œ ์†Œ์Šค ์ค‘ ํ•˜๋‚˜๋กœ ๋ณด์—ฌ ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹œ ์ ์œผ๋กœ ์ž‘์—… ์ด๋ฒคํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ํ”Œ๋ผ์›Œ ์ธ์Šคํ„ด์Šค๋ฅผ ํ•ด์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๊ฒฐ๊ณผ.

๋ˆ„์ˆ˜์˜ ๊ฐ€๋Šฅํ•œ ์†Œ์Šค ๋‚˜๋Š” ๋ช…์‹œ ์ ์œผ๋กœ ์ž‘์—… ์ด๋ฒคํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ๊ฝƒ ์ธ์Šคํ„ด์Šค๋ฅผ ๋•๋‹ˆ๋‹ค.

์ดˆ์ฐฝ๊ธฐ๋ถ€ํ„ฐ์ด ๋ฌธ์ œ๋ฅผ ์กฐ์šฉํžˆ ์ง€์ผœ๋ณธ ์‚ฌ๋žŒ (์ง์ ‘ ๊ฒฝํ—˜ ํ•œ ์ ์ด์—†๋Š” ์‚ฌ๋žŒ)์˜ ์ผํ™” ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ : ์œ„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ (์…€๋Ÿฌ๋ฆฌ ์ž‘์—…๋Ÿ‰์ด ๋งŽ์ง€ ์•Š์Œ)๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๊ณ  ์ •๋ณด ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ (AFAIK, rabbitmq, gevent ๋“ฑ์— ๋Œ€ํ•œ ์ •๋ณด ์—†์Œ)๋ผ๋Š” ์‚ฌ์‹ค์กฐ์ฐจ ํ™•์ธํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์ด ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋“  rabbitmq ์—ฐ๊ฒฐ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.์ด ๋ˆ„์ถœ์„ ๊ด€์ฐฐ ํ•œ ์Šคํƒ์ž…๋‹ˆ๋‹ค.

  • celery (์ตœ์‹  ๋ฒ„์ „) : prefork ๋˜๋Š” gevent pool, ๋‘˜ ๋‹ค ๋™์ผํ•œ ๋ˆ„์ถœ ํŒจํ„ด์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • rabbitmq (cloudamqp SaaS)
  • ๊ฝƒ

์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์ž‘์—…์— ๋ˆ„์ถœ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ–ˆ์ง€๋งŒ ๋ˆ„์ถœ์„ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์…€๋Ÿฌ๋ฆฌ ์ธก๋ฉด์—์„œ ๋ฌด์–ธ๊ฐ€๊ฐ€ ์˜์‹ฌ๋˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ์‚ฌ์‹ค์€ ํ˜„์žฌ ๋งŽ์€ ์ž‘์—…์ž๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ ๋ˆ„์ถœ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๊ฝƒ์— ์˜คํ”„๋ผ์ธ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์–ด๋””๋ฅผ ๋ณผ์ง€ ์•„์ด๋””์–ด๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ๊ฝƒ ๋ฐ ์ž‘์—… ์ด๋ฒคํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋ˆ„์ถœ์ด ๋‹ค์‹œ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ณ„์† ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ˆ„์ถœ๋˜๋Š” ์Šคํƒ์˜ ๋˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด๋ผ๊ณ  ๋ฏฟ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์…€๋Ÿฌ๋ฆฌ๋Š” ๊ณผ๊ฑฐ์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋ฐ ๊ธฐ์—ฌํ•œ ์šฐ์—ฐํ•œ ํ–‰๋™์„ํ–ˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ ๋ชจ๋‘๋Š”์ด๋ฅผ ํ™•์ธํ• ๋งŒํผ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋‹ฌ๋ฆฌ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ...

  • ํ•œ ๋ฒˆ์— ๋งŽ์€ ์ˆ˜์˜ ์ค‘์ฒฉ ๋œ ์ž‘์—… ๋˜๋Š”
  • ์ž‘์—…์ž ๋‚ด์—์„œ ๋ฉ€ํ‹ฐ ์ฝ”์–ด ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ชจ ๋†€๋ฆฌ ์‹

์ด ๊ฒฝ์šฐ ํŠน์ • ์ˆ˜์ค€์˜ ๋™์‹œ์„ฑ, ์ž‘์—… ๋Œ€๊ธฐ์—ด ๋ฐ ํ•˜์œ„ ์ž‘์—… ์ž๋‹น ์ž‘์—…์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ํ˜„๋ช…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…์ด ์„œ๋ฒ„๋ฅผ ์†์ƒ์‹œํ‚ค๊ธฐ ์ „์— ์ฃฝ์ผ ์ˆ˜์žˆ๋Š” ๋‚ด์žฅ ๋œ ๋ณดํ˜ธ ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ ์  ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์…€๋Ÿฌ๋ฆฌ์—์„œ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ CPU ๋ฐ”์šด๋“œ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ”์šด๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.์ด ํ”„๋กœ์„ธ์Šค๋Š” ์‹ค์ œ๋กœ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ์‹œ์ž‘ ๋ฌธ์„œ์— ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์ด ํฌํ•จ๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ์˜๊ฒฌ์—์„œ ์ด๋ฏธ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์˜ค๋ž˜ ์ „๋ถ€ํ„ฐ max-tasks-per-child ๋ฐ ๋™์‹œ์„ฑ์ด 1 ์„ค์ •๋œ ์ž‘์—…์ž๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ฌด๊ฒƒ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Redis๋ฅผ ๋ธŒ๋กœ์ปค ๋ฐ ๊ฒฐ๊ณผ ๋ฐฑ์—”๋“œ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ด€์ฐฐ์— ๋”ฐ๋ฅด๋ฉด RabbitMQ๋ฅผ ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉํ•  ๋•Œ max-tasks-per-child ๋ฅผ 1 ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ "ํ•ด๊ฒฐ"๋˜๋ฉด ์…€๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹Œ ์ž‘์—… ๊ตฌํ˜„ ๋ฌธ์ œ ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ด€์ฐฐํ•˜๊ณ ๋ณด๊ณ ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‹จ์ผ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์ž‘์—…์ž๋ฅผ ๋ฉฐ์น  ๋™์•ˆ ์œ ํœด ์ƒํƒœ๋กœ ๋‘๋”๋ผ๋„ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์— ๋„๋‹ฌํ•˜์—ฌ ๊ฐ๋…์ž์— ์˜ํ•ด ์ฃฝ์„ ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ˆ„์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด์ „ ์˜๊ฒฌ์—์„œ ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์ฐจํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—…์ž๊ฐ€ ์ผ์ •์— ๋”ฐ๋ผ ๋‹จ์ผ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ์ฐจํŠธ๋Š” ์–ด๋Š ์ •๋„ ๊ตฌํ˜•ํŒŒ์™€ ๋น„์Šทํ•˜๊ฒŒ ํ‘œ์‹œ๋˜์–ด์•ผํ•˜์ง€๋งŒ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ์ฆ๊ฐ€ ๋งŒํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Screenshot 2020-08-14 at 20 42 24

์ €๋Š” ์…€๋Ÿฌ๋ฆฌ ์ž‘์—…์ž์˜ ํ”„๋กœํŒŒ์ผ ๋ง์„ ๋กœ๋“œ๋งต์— ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„์™€ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฝƒ์„ ๋„๊ณ  ์„ค์ •์„ ํ†ตํ•ด ์ž‘์—… ์ด๋ฒคํŠธ๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋ˆ„์ˆ˜๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๊นŒ ๋ง์”€ ๋“œ๋ ธ๋“ฏ์ด ์ผ๊พผ์ด ์ƒˆ๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์ˆœ๊ฐ„ ๊ฝƒ์†์—์„œ ์˜คํ”„๋ผ์ธ ์ƒํƒœ๊ฐ€ ๋  ๊ฒƒ์ž„์„ ์•Œ์•„ ์ฐจ๋ฆฌ๊ณ  ์…€๋Ÿฌ๋ฆฌ ์˜ˆํ”„๊ฐ€ ํ•ญ์ƒ ๋ฐ”์˜๊ฒŒ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์‰ฌ์šด ๊ธธ์„ ๋ฐŸ์•„ ๊ฝƒ์„ ๊ป์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๋ˆ„์ˆ˜๋ฅผ ์ผ์œผํ‚ค๋Š” ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ์–ด๋„์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์€ ์…€๋Ÿฌ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฝƒ์ผ๊นŒ์š”?

@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 ํ–‰์šด์ด ์žˆ์Šต๋‹ˆ๊นŒ?

Screenshot_2020-11-17_12-56-28

๊ธ€์Ž„, "๋…น์ƒ‰"์„๋ณด์„ธ์š”. ๋ฐ”๋‹ฅ์ด ์ฒœ์ฒœํžˆ ์˜ฌ๋ผ๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ํ™•์‹คํ•˜๊ฒŒ ... "๊ทธ๋ž˜, ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ๋น ๋ฅธ ํ™•์ธ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋‚ด ์ชฝ์—์„œ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ @thedrow๊ฐ€ ์ œ๊ณต ํ•œ ๋งํฌ๋ฅผ - try running some workers with jemalloc forced in ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ _eventually_์— ๋„๋‹ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰