Celery: ๋งค์ผ ๋ฐค 10์‹œ 42๋ถ„๋ถ€ํ„ฐ ์ˆ˜๋งŒ ๊ฐœ์˜ backend_cleanup ์ž‘์—…์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์ด ์ž‘๋™์„ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 10์›” 21์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: celery/celery

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • [x] ๋ฌธ์ œ์— celery -A proj report ์˜ ์ถœ๋ ฅ์„ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค.
    (์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ตœ์†Œํ•œ Celery๋ฅผ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค.
    ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ฒ„์ „).
  • [x] Celery์˜ master ๋ถ„๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์•ฑ์€ django1.11 ๋ฐ celery4.1[sqs]์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Elastic Beanstalk๋ฅผ ํ†ตํ•ด Amazon AWS์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. AWS SQS๋Š” ๋ธŒ๋กœ์ปค์ž…๋‹ˆ๋‹ค.

์žฌํ˜„ ๋‹จ๊ณ„

๋ฌธ์ œ๋Š” ๋งค์ผ ๋ฐค 10์‹œ 42๋ถ„๊ฒฝ์— ๋‚˜ํƒ€๋‚˜๋ฉฐ ์•ฝ 1์‹œ๊ฐ„ ๋™์•ˆ ์ง€์†๋ฉ๋‹ˆ๋‹ค. ์ˆ˜๋งŒ ๊ฐœ์˜ backend_cleanup ์ž‘์—…์ด ์‹คํ–‰๋˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์˜ ์ž‘์—… ๊ฒฐ๊ณผ ๋ชฉ๋ก์— ๋”ฐ๋ผ ๊ฐ ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. CPU ์‚ฌ์šฉ๋Ÿ‰์ด 100%๋กœ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์˜ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ์—ด๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์ง€ 1์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด CPU ์‚ฌ์šฉ๋Ÿ‰์ด ์ •์ƒ์œผ๋กœ ๋Œ์•„์˜ต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๊ธฐ์—ด์ด ์ค„์–ด๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  delay() ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. SQS์—์„œ ๋Œ€๊ธฐ์—ด์„ ์ œ๊ฑฐํ•˜๊ณ  ์•ฑ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ์ „์ฒด ์ฝ”๋“œ๋ฅผ AWS Elastic Beanstalk์— ๋‹ค์‹œ ์—…๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด delay() ์ž‘์—…์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ œ๊ฑฐ, ๋‹ค์‹œ ์‹œ์ž‘ ๋˜๋Š” ๋‹ค์‹œ ์—…๋กœ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ๋น„๋™๊ธฐ ์ž‘์—…์ด ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ œ๊ณต backendcleaup ์ž‘์—…๋„ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด ์•ฑ์—๋Š” ๊ธฐ๋ณธ ์ œ๊ณต celery.backend_cleanup ์ž‘์—…์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ฃผ๊ธฐ์  ๋˜๋Š” crontab ์ž‘์—…์ด ์—†์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„์ด ๋ฌธ์ œ๋ฅผ ๋„์™€ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™

backend_cleanup ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„ ์ „์ฒด ์•ฑ์ด ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ํ–‰๋™

## ์žฌํ˜„ ๋‹จ๊ณ„์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

celery-sqs-worker-report.txt

Question

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

์ผ์ •์„ ๋ฎ์–ด์“ฐ๊ณ  crontab ์‚ฌ์šฉ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
'celery.backend_cleanup': { 'task': 'celery.backend_cleanup', 'schedule': 86400, # every 24 hours instead of crontab('0', '4', '*') which is used in celery beat 'options': {'expires': 12 * 3600}} ,

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

๋ฐฉ๊ธˆ ๋ฌธ์ œ๊ฐ€ ๊ธฐ๋ณธ ์ œ๊ณต ์ž‘์—…์ธ celery.backend_cleanup์— ๊ด€ํ•œ ๊ฒƒ์ž„์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์•ฑ์„ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜คํ›„ 10์‹œ 42๋ถ„์— ์—„์ฒญ๋‚œ backend_cleanup ์ž‘์—…์ด ์‹œ์ž‘๋˜์–ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ช‡ ์ดˆ ํ›„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

[2017-10-23 22:51:27,677: CRITICAL/MainProcess] Unrecoverable error: Exception('Request Empty body  HTTP 599  Server aborted the SSL handshake (None)',)
Traceback (most recent call last):
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/worker.py", line 203, in start
    self.blueprint.start(self)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 370, in start
    return self.obj.start()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/consumer/consumer.py", line 320, in start
    blueprint.start(self)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/consumer/consumer.py", line 596, in start
    c.loop(*c.loop_args())
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/celery/worker/loops.py", line 88, in asynloop
    next(loop)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/hub.py", line 354, in create_loop
    cb(*cbargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 111, in on_readable
    return self._on_event(fd, _pycurl.CSELECT_IN)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 124, in _on_event
    self._process_pending_requests()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 132, in _process_pending_requests
    self._process(curl, errno, reason)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/http/curl.py", line 178, in _process
    buffer=buffer, effective_url=effective_url, error=error,
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 150, in __call__
    svpending(*ca, **ck)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 143, in __call__
    return self.throw()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 140, in __call__
    retval = fun(*final_args, **final_kwargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 100, in _transback
    return callback(ret)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 143, in __call__
    return self.throw()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/promises.py", line 140, in __call__
    retval = fun(*final_args, **final_kwargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 98, in _transback
    callback.throw()
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/vine/funtools.py", line 96, in _transback
    ret = filter_(*args + (ret,), **kwargs)
  File "/Users/user/code/accusize-021/lib/python3.4/site-packages/kombu/async/aws/connection.py", line 253, in _on_status_ready
    raise self._for_status(response, response.read())
Exception: Request Empty body  HTTP 599  Server aborted the SSL handshake (None)

๊ทธ ์‚ฌ์ด AWS SQS์—์„œ ๋Œ€๊ธฐ์—ด์ด ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ช‡ ๊ฐ€์ง€ backend_cleanup ์ž‘์—…์ด ๊ณ„์† ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์นจ๋‚ด ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

[2017-10-23 22:51:28,967: WARNING/MainProcess] ๋ฏธํ™•์ธ ๋ฉ”์‹œ์ง€ 10๊ฐœ ๋ณต์› ์ค‘

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ SQS ๋Œ€๊ธฐ์—ด์— ๋Œ€ํ•œ HTTPS ์—ฐ๊ฒฐ์ด ์ค‘์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. AWS Elastic Beanstalk์— ์•ฑ์„ ๋‹ค์‹œ ๋ฐฐํฌํ•˜์ง€ ์•Š๋Š” ํ•œ ์•ฑ์„ SQS์— ๋‹ค์‹œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์•„๋ฌด๋„์ด ๋ฌธ์ œ๋ฅผ ๋„์™€ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ์‘๋‹ต์€ ํฌ๊ฒŒ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. CELERY_RESULT_BACKEND์„ "django-db"์—์„œ "redis"๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  CELERY_TIMEZONE์„ "UTC"๋กœ ๋ณ€๊ฒฝํ•œ ํ›„์—๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Django Admin์˜ ์ž‘์—… ๊ฒฐ๊ณผ์—์„œ ์ž‘์—… ๊ฒฐ๊ณผ ์ถ”๊ฐ€๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์ง€๋งŒ ๋‚ด ๋ฌธ์ œ๋Š” ๋Œ€๋ถ€๋ถ„ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ผ์ •์„ ๋ฎ์–ด์“ฐ๊ณ  crontab ์‚ฌ์šฉ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
'celery.backend_cleanup': { 'task': 'celery.backend_cleanup', 'schedule': 86400, # every 24 hours instead of crontab('0', '4', '*') which is used in celery beat 'options': {'expires': 12 * 3600}} ,

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