BullMQ의 CPU 및 메모리 점유

SEUNGJUN·2024년 7월 24일

BullMQ는 Node.js 환경에서 작업 큐를 관리하는 데 사용된다. 큐에 작업을 추가하고, 작업자를 통해 작업을 처리하는 과정에서 CPU 및 메모리를 사용한다. CPU와 메모리 사용량은 작업의 복잡도, 큐에 있는 작업의 수, 작업 처리 빈도 및 사용 중인 Redis 서버의 성능에 따라 달라질 수 있다.

CPU 점유

1. 작업 추가 및 제거

  • 작업을 큐에 추가하거나 제거하는 과정에서 일부 CPU 자원이 사용된다. 이는 주로 작업을 Redis에 저장하고, 필요한 경우 Redis로부터 데이터를 읽고 쓰는 과정에서 발생한다.

  • 작업 추가는 보통 간단한 명령어 실행이므로 CPU 사용량이 상대적으로 낮다.

2. 작업 처리

  • 작업자는 큐로부터 작업을 가져와 처리한다. 이 과정에서 작업의 복잡도에 따라 CPU 사용량이 달라진다.

  • 간단한 작업 (예: 데이터베이스 조회, 간단한 계산 등)은 적은 CPU 자원을 사용하지만, 복잡한 작업 (예: 데이터 변환, 외부 API 호출, 이미지 처리 등)은 더 많은 CPU 자원을 사용한다.

메모리 점유

1. 작업 큐의 크기

  • 큐에 있는 작업의 수가 많을수록 더 많은 메모리가 사용된다. 각 작업은 Redis에 저장되며, 작업의 데이터 크기에 따라 메모리 사용량이 증가할 수 있다.

  • 큐에 저장된 작업 데이터가 클수록 더 많은 메모리를 사용한다.

2. 작업 데이터

  • 각 작업은 데티어(payload)를 가지고 있다. 이 데이터의 크기에 따라 메모리 사용량이 달라질 수 있다.

  • 작업 데이터가 크다면, 작업자도 해당 데이터를 메모리에 로드하므로 메모리 사용량이 증가 할수 있다.

간단한 작업 예시

import { Queue, Worker } from 'bullmq';
import { redisConnection } from './redis';

const queue = new Queue('simpleQueue', { connection: redisConnection });

async function simpleTask(job) {
  return job.data.text.toUpperCase();
}

const worker = new Worker('simpleQueue', simpleTask, { connection: redisConnection });

worker.on('completed', job => {
  console.log(`Job ${job.id} completed!`);
});

queue.add('simpleTask', { text: 'hello world' });
  • CPU 사용량: 문자열 변환 작업은 CPU 사용량이 매우 낮다.

  • 메모리 사용량: 단일 작업 데이터의 크기가 작아 메모리 사용량도 낮다.

복잡한 작업 예시

import { Queue, Worker } from 'bullmq';
import axios from 'axios';
import { redisConnection } from './redis';

const queue = new Queue('complexQueue', { connection: redisConnection });

async function complexTask(job) {
  const responses = await Promise.all([
    axios.get('https://api.example.com/data1'),
    axios.get('https://api.example.com/data2'),
    axios.get('https://api.example.com/data3'),
  ]);
  return responses.map(response => response.data);
}

const worker = new Worker('complexQueue', complexTask, { connection: redisConnection });

worker.on('completed', job => {
  console.log(`Job ${job.id} completed!`);
});

queue.add('complexTask', {});
  • CPU 사용량: 여러 개의 API 호출을 병렬로 처리하기 때문에 CPU 사용량이 높을 수 있다.

  • 메모리 사용량: 각 API의 응답 데이터가 크다면 메모리 사용량도 높아질 수 있다.

BullMQ 작업자가 CPU를 어떻게 사용하는지 이해하려면, 작업자의 내부 동작 방식을 살펴봐야 한다. BullMQ 작업자는 큐에 있는 작업을 가져와서 처리하는 역할을 하며, 이 과정에서 다양한 단계에서 CPU를 사용한다.

BullMQ 작업자의 동작 과정과 CPU 사용

1. 작업 가져오기

  • 작업자는 Redis에서 작업을 가져온다. 이 과정에서 Redis와의 네트워크 통신이 발생하며, 작업자는 작업을 메모리에 로드한다.

  • 이 과정에서는 비교적 적은 CPU 자원이 사용된다.

2. 작업 가져오기

  • 작업자는 작업을 수행한다. 이 단계에서 대부분의 CPU 자원이 사용된다.

  • 작업의 종류에 따라 CPU 사용량이 크게 달라진다. 예를 들어, 단순한 데이터 변환 작업은 적은 CPU 자원을 사용하지만, 복잡한 계산이나 외부 API 호출은 많은 CPU 자원을 사용할 수 있다.

3. 작업 완료 처리

  • 작업이 완료되면 작업 결과를 Redis에 저장하거나 후속 작업을 처리한다. 이 과정에서도 Redis와의 통신이 발생한다.

  • 작업 완료 처리는 일반적으로 적은 CPU 자원을 사용한다.

최적화 방안

1. 작업 분할

  • 큰 작업을 여러 작은 작업으로 분할하여 CPU 부하를 분산시킨다. 작은 작업들은 개별적으로 처리되기 때문에 각 작업에 대한 CPU 사용량이 균등해진다.

2. 작업자 수 조절

  • 작업자의 수를 조절하여 병렬 처리를 최적화할 수 있다. CPU 코어 수에 맞춰 작업자를 늘리면 더 많은 작업을 동시에 처리할 수 있다.

3. 비동기 작업 활용

  • Node.js의 비동기 특성을 활용하여 I/O 작업(예: 파일 읽기/쓰기, 네트워크 요청)을 비동기로 처리하면, CPU 사용량을 효율적으로 관리할 수 있다.

4. 작업 처리 우선순위

  • 중요한 작업을 우선 처리하도록 우선순위를 설정하면 CPU 사용을 더 효율적으로 관리할 수 있다.

5. 메모리 관리:

  • 작업 데이터의 크기를 최소화하고, 메모리 누수를 방지하여 시스템의 전체적인 성능을 개선할 수 있다.
profile
RECORD DEVELOPER

0개의 댓글