๊ฐ์
Celery์์ concurrency ๊ฐ์ ํ ๋ฒ์ ๋ช๊ฐ์ ์์ ์ ๋์์ ์คํํ ์ง ๊ฒฐ์ ํ๋ ์ค์ํ ์ค์ ์ด๋ค.
์ ์ ํ concurrency ๊ฐ์ ์ด๋ป๊ฒ ์ค์ ํ ๊น .. (ํ๋์จ์ด, ์ํฌ๋ก๋, ์์ ํน์ฑ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค!)
ํ์ธ
concurrency
- Celery๋ ๊ธฐ๋ณธ์ ์ผ๋ก Prefork (multiprocessing) ๋ชจ๋๋ฅผ ์ฌ์ฉ
- concurrency๋ ๊ฐ worker๊ฐ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ์์ ๊ฐ์๋ฅผ ์๋ฏธํ๋ค.
- worker๋ ์ค์ ๋ก Task๋ฅผ ์คํํ๋ ํ๋ก์ธ์ค(์์ ๋จ์)๋ฅผ ์๋ฏธํ๋ค.
1๏ธโฃ CPU ์ฝ์ด ์
Celery๊ฐ CPU ์ฐ์ฐ์ ๋ง์ด ์ฌ์ฉํ๋ ์์ (์: ๋จธ์ ๋ฌ๋, ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ฑ)์ ์คํํ๋ค๋ฉด, CPU ์ฝ์ด ์ ๊ธฐ์ค์ผ๋ก ์ค์
CPU ์ฝ์ด ๊ฐ์ | ์ ์ ํ concurrency ๊ฐ |
2 ์ฝ์ด | 2~4 |
4 ์ฝ์ด | 4~8 |
8 ์ฝ์ด | 8~16 |
โ ๋ฉํฐ์ฝ์ด๋ฅผ ํ์ฉํ ์ ์๋๋ก CPU ์ฝ์ด ๊ฐ์๋งํผ concurrency ์ค์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์
2๏ธโฃ ํ์คํฌ ์ ํ (CPU-bound vs I/O-bound)
์์ ์ ํ | ์ค๋ช | ์ ์ ํ concurrency ๊ฐ |
CPU-bound | ๋จธ์ ๋ฌ๋, ์์์ฒ๋ฆฌ, ์ํ ์ฐ์ฐ ๋ฑ | CPU ์ฝ์ด ์๋งํผ ์ค์ (os.cpu_count()) |
I/O-bound | ํฌ๋กค๋ง, DB ์กฐํ, ๋คํธ์ํฌ ์์ฒญ ๋ฑ | CPU ์ฝ์ด ์ * 2~4 |
โ CPU ์ฐ์ฐ์ด ๋ง์ ๊ฒฝ์ฐ (CPU-bound)
celery -A celery_tasks.celery_app worker --concurrency=$(nproc)
โ ํฌ๋กค๋ง, DB ์ฐ์ฐ์ด ๋ง์ ๊ฒฝ์ฐ (I/O-bound)
celery -A celery_tasks.celery_app worker --concurrency=$(( $(nproc) * 4 ))
โ I/O ์์ ์ด ๋ง์ผ๋ฉด CPU ์ฝ์ด๋ณด๋ค ๋ ๋ง์ worker๋ฅผ ํ ๋นํ๋ ๊ฒ์ด ์ ๋ฆฌํจ
3๏ธโฃ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ณ ๋ ค
Worker ํ๋ก์ธ์ค๋ง๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๊ฒฝ์ฐ concurrency ๊ฐ์ ๋๋ฌด ๋์ด๋ฉด Out of memory (OOM) ๋ฐ์ ๊ฐ๋ฅ
์๋ฒ RAM | ์ ์ ํ concurrency ๊ฐ |
2GB | 2~4 |
4GB | 4~8 |
8GB ์ด์ | 8~16 |
โ ๋ฉ๋ชจ๋ฆฌ๊ฐ 2GB๋ฐ์ ์๋ค๋ฉด, concurrency=2~4 ์ ๋๊ฐ ์ ์ ํ๋ค.
4๏ธโฃ Celery ์คํ ๋ชจ๋ (Prefork vs Threaded)
Celery๋ --pool=prefork(๊ธฐ๋ณธ๊ฐ) ๋๋ --pool=threads ๋ชจ๋๋ก ์คํํ ์ ์๋ค.
โ CPU ์ฌ์ฉ์ด ๋ง๋ค๋ฉด prefork (๊ธฐ๋ณธ)
celery -A celery_tasks.celery_app worker --loglevel=info --concurrency=4 --pool=prefork
โ ๊ฐ ์์ ์ด ๋ณ๋์ ํ๋ก์ธ์ค์์ ์คํ๋๋ฏ๋ก CPU ์ฌ์ฉ์ด ๋ง์ ๋ ์ ๋ฆฌํจ
โ I/O ์์ ์ด ๋ง๋ค๋ฉด threads
celery -A celery_tasks.celery_app worker --loglevel=info --concurrency=10 --pool=threads
โ ์น ํฌ๋กค๋ง, DB ์กฐํ ๊ฐ์ I/O ์์ ์ด ๋ง๋ค๋ฉด threads ๋ชจ๋๊ฐ ๋ ํจ์จ์
์ ๋ฆฌ
Celery ์์ ์ด ํฌ๋กค๋ง ์ค์ฌ์ด๋ผ๋ฉด, I/O-bound์ ํด๋นํ๋ฏ๋ก concurrency = (CPU ์ฝ์ด ์ * 4) ์ผ๋ก ํ๋๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.
celery -A celery_tasks.celery_app worker --concurrency=$(( $(nproc) * 4 )) --pool=threads
'๐ฉ๐ปโ๐ป > network' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Celery] ๊ฐ๋จํ๊ฒ ์ฑ๋ฅ ์ฒดํฌ (0) | 2025.02.19 |
---|---|
[Proxy] ๋ฆฌ๋ฒ์ค ํ๋ก์ Reverse Proxy ์ ๋ฆฌ (0) | 2025.01.24 |
ํน์ port์ ์๋น์ค์๋ง HTTPS 443 SSL ์ ์ฉํ๊ธฐ (0) | 2025.01.22 |
RPC vs gRPC (0) | 2025.01.14 |
์ธํฐ๋ท ์๋ 2๊ฐ์ PC ํต์ ํ๋ ๋ฐฉ๋ฒ (1) | 2024.11.28 |