인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

HanKyul Kim님의 프로필 이미지

작성한 질문수

고성능 실시간 분산 시스템 RabbitMQ + Kafka + Redis 실전 프로젝트

2-2 고성능 주문 처리 파이프라인 구축, Celery 를 활용한 병렬 처리 및 부하 테스트 [실습]

Celery worker 튜닝을 통한 성능 개선 부분 질문

해결된 질문

작성

·

64

1

부족한 식견으로 이해를 못했습니다.

 

강의에서 worker를 10개 -> 15개 -> 9개로 늘리고 줄이셨는데 8~9초에서 유의미한 개선이 안되는 이유가 궁금합니다!

답변 2

2

미국달팽이님의 프로필 이미지
미국달팽이
지식공유자

안녕하세요. HanKyul Kim 님 수강 감사드립니다.

아주 좋은 질문을 해주셨습니다.

확인해보니, worker 수를 10개 -> 15개 -> 9개로 조정했을 때 8~9초에서 개선이 미미한 이유는 태스크가 너무 가볍고, 태스크 자체의 실행 시간이 짧아서 worker 간 병렬 처리의 이점이 두드러지지 않을 수 있습니다.

브로커(RabbitMQ)나 결과 백엔드(RPC)의 오버헤드가 더 큰 영향을 미쳤을 가능성이 높아요. 지금 태스크는 단순 문자열 반환이라 worker 수를 늘려도 병렬 처리 이득이 크지 않고, worker_prefetch_multiplier=9로 설정된 상태에서 태스크 예약과 통신 비용이 병목일 수 있습니다.

이 값은 각 worker가 한 번에 미리 가져오는 태스크 수를 의미해요. worker가 10개라면 최대 90개의 태스크를 동시에 예약할 수 있고, 15개라면 135개까지 가능합니다. 하지만 태스크가 10,000개로 충분히 많더라도, prefetch로 인해 worker가 태스크를 과도하게 예약하면 브로커(RabbitMQ)와 worker 간 통신 오버헤드가 늘어나 성능 개선이 제한될 수 있습니다.

또한, worker 수를 10개 -> 15개로 늘렸을 때, 시스템의 CPU 코어 수를 초과하거나 메모리 사용량이 포화 상태에 가까워졌다면, 추가 worker가 오히려 컨텍스트 스위칭 비용을 늘릴 수 있어요. 반대로 9개로 줄였을 때도 태스크가 워낙 가볍고 빠르게 끝나서 리소스 활용도가 이미 최적화된 상태일 가능성이 있습니다.

테스트로 현실적이 부하를 일으킬 수 있는time.sleep(0.02)를 넣거나, prefetch 값을 1~4로 낮춰보시고, CPU 코어 수에 맞춰 worker 수를 조정해보세요. 그리고 나서 celery -A app worker -l info 로 실행 후 로그를 확인하면 리소스 활용도를 파악하실 수 있습니다. 추가 질문 있으면 언제든 말씀해주세요!

수강 감사드립니다.

항상 좋은 강의가 되도록 하겠습니다.

 

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. HanKyul Kim님이 질문하신 Celery worker 튜닝 관련하여 이해를 돕고자 합니다.

Celery worker의 수를 조정하면서 성능이 유의미하게 개선되지 않는 이유는 여러 가지가 있을 수 있습니다. 일반적으로, 작업자의 수를 늘리면 병렬 처리가 가능하기 때문에 처리 시간이 단축될 가능성이 큽니다. 하지만 특정 상황에서는 다음과 같은 이유로 작업자 수를 증가해도 성능 개선이 나타나지 않을 수 있습니다:

  1. IO 바운드 작업: 작업이 CPU 대신 주로 IO(입출력) 작업에 의존하는 경우, 병렬 작업자의 수를 늘려도 네트워크 대역폭이나 디스크 IO 속도 때문에 성능 개선이 제한될 수 있습니다.

  2. 리소스 한계: 시스템의 CPU, 메모리, 네트워크 대역폭 등의 자원이 부족할 경우, 작업자 수를 늘려도 병목 현상으로 인해 성능 이득이 거의 없을 수 있습니다.

  3. 작업자 간 컨텍스트 스위칭 비용: 너무 많은 작업자가 동시에 실행되면 오히려 작업자 사이의 컨텍스트 스위칭 비용이 증가하여 성능 이득이 상쇄될 수도 있습니다.

  4. Task Queue의 병목: Worker 수를 늘려도, 사이즈가 증가하거나 처리 시간이 오래 걸리는 작업들이 많을 경우 Celery task queue 자체의 병목 때문에 성능 개선이 어려울 수 있습니다.

이와 같은 상황을 해결하려면, 시스템 분석을 통해 병목 요소를 파악하고 이를 해결하기 위한 최적의 구성 및 자원 조정이 필요할 것입니다.

자세한 내용은 Celery worker의 성능 튜닝과 관련한 기존 답변이 “Celery 성능 문제 해결 방법”에서 논의되었을 수도 있습니다. 관련 내용을 참고하시어 이해를 넓히시기 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.