• celery 돌릴 때 nohup으로 지정해놓은 log파일에서 확인

  • celery 수행이 오래 걸리는게 아니었음

    • task 1, 2 둘 다 1초마다 실행

    • task 1 : sleep 10초 걸리는 task

    • task 2 : 바로 실행하는 task

    • 결과 1(Worker 1개)

      • Queue 개수와 상관 없었음

        # Queue 1개에서 task 1,2 돌릴 경우
        # task 2 : 0.04초
        [2021-04-22 13:39:37,801: INFO/ForkPoolWorker-6] Task aip.celery.test2[a026866c-ebc8-40e8-ae13-8bd6bcdd2018] succeeded in 0.043861500000275555s: 'task2'
        [2021-04-22 13:39:37,859: INFO/ForkPoolWorker-8] Task aip.celery.test2[75f2b9cb-4a82-476f-abf4-c1634312a7f0] succeeded in 0.04921889999968698s: 'task2'
        
        # task 1,2 각각 다른 Queue에서 실행할 경우
        # task 2 : 0.04초
        [2021-04-22 13:42:33,268: INFO/ForkPoolWorker-2] Task aip.celery.test2[a84cbc5e-9647-429b-be90-92651fe81e38] succeeded in 0.04919719999998051s: 'task2'
        [2021-04-22 13:42:33,276: INFO/ForkPoolWorker-3] Task aip.celery.test2[466c7271-a067-40bb-a0c4-16c23dbc5898] succeeded in 0.04812519999904907s: 'task2'
        
      • 수행 시간이 오래 걸리는 것보다 응답 올때까지 대기타는 게 문제임

      • 그런데 보이는 것만 그렇게 보이는 게 아닐까? 라고도 생각해봤지만 실제로 result를 저장시키고 있는 DB를 보니 보이는 것과 똑같이 pending현상 있었음

      • 혹시 결과 저장하는 것때문에 pending 현상이 있나? 싶어서 CELERY_RESULT_BACKEND도 없애고 아래와 같이 설정했는데 똑같음

      @app.task
      def test1(ignore_result=True):
      
    • 결과 2(Worker 2개)

      • 아래 명령어로 worker를 2개, 각각 queue 1개씩 할당해도 해결되지 않았음
      celery multi start 2 -A aip worker -Q:1 task1, -Q:2 task2 --loglevel=info -n backend@%n >
      
  • 원인은 같은 queue에 있는 task가 오래 걸릴 경우, 뒤에 있는 task들이 모두 대기해야 함

    • worker를 3개로 늘리고 priority에 따라 routing을 분기해주었음
    nohup watchmedo auto-restart -- celery -A aip worker -Q low_priority --loglevel=info -n low_priority@%n > /var/log/celery_worker.log &
    nohup watchmedo auto-restart -- celery -A aip worker -Q middle_priority --loglevel=info -n middle_priority@%n > /var/log/celery_worker.log &
    nohup watchmedo auto-restart -- celery -A aip worker -Q high_priority --loglevel=info -n high_priority@%n > /var/log/celery_worker.log &
    
    • redis → rabbitmq로 변경
    • settings.py 에 result를 저장하지 않도록 설정
    CELERY_IGNORE_RESULT = True
    
  • 21-05-24 기준 같은 queue에 있는 task가 오래 걸릴 경우, 뒤에 있는 task들이 모두 대기해야 하는 문제가 아닌, 남아있는 worker가 없을 경우 대기하는 것임

    • crontab에서 호출하던, apply_async로 하던 상관 없음
    • 무조건 multi-processing 중인 worker의 개수가 호출되는 task 개수보다 부족할 경우 대기탐