본문 바로가기

Node.js

[Node.js] 스레드 풀

Node.js의 스레드 풀은 병렬 처리를 위해 작업자 스레드를 활용하여 기본 이벤트 루프 외부에서 JavaScript 코드를 실행하는 데 사용되는 메커니즘입니다. 이를 통해 Node.js는 CPU 집약적인 작업을 동시에 수행하여 애플리케이션의 전반적인 성능과 확장성을 향상시킬 수 있습니다. 스레드 풀은 주로 Node.js의 특정 내장 모듈에서 차단 또는 계산 집약적인 작업을 오프로드하는 데 사용됩니다.

스레드 풀 개요:

  1. 작업자 스레드:
    • Node.js에서는 JavaScript 코드를 동시에 실행할 수 있는 추가 스레드(작업자)를 생성할 수 있도록 Worker Threads API를 도입했습니다.
    • 작업자 스레드는 병렬로 실행될 수 있는 V8 JavaScript 엔진의 별도 인스턴스이며 각각 자체 이벤트 루프가 있습니다.
  2. 스레드 풀 크기:
    • 스레드 풀의 크기는 UV_THREADPOOL_SIZE 환경 변수에 의해 결정됩니다.
    • 기본적으로 Node.js는 사용 가능한 CPU 코어 수에 따라 스레드 풀 크기를 설정합니다.
  3. 활용도:
    • 스레드 풀은 파일 I/O 작업, 암호화 작업, DNS 조회기본 바인딩이나 시스템 호출과 관련된 기타 작업과 같은 특정 비동기 작업에 활용됩니다.

스레드 풀을 사용하는 모듈:

Node.js의 여러 내장 모듈은 스레드 풀을 활용하여 작업을 동시에 수행합니다. 스레드 풀을 활용하는 몇 가지 주목할만한 모듈은 다음과 같습니다.

  1. 파일 시스템(fs) 모듈:
    • fs.readFile을 사용하여 파일을 읽거나 fs.writeFile을 사용하여 파일을 쓰는 등 fs 모듈의 특정 작업은 스레드 풀을 활용합니다.
    • 이를 통해 파일 I/O 작업을 동시에 수행할 수 있어 기본 이벤트 루프가 차단되는 것을 방지할 수 있습니다.
    • 파일시스템(fs) 모듈에서 스레드풀을 사용하는 이유는?
    • 더보기

      Node.js의 파일 시스템(fs) 모듈은 주로 파일 I/O 작업을 비동기적으로 처리하기 위해 스레드 풀을 사용합니다. 파일 읽기 또는 쓰기와 같은 파일 I/O 작업은 시간이 많이 걸릴 수 있으며 동기적으로 수행되는 경우 기본 이벤트 루프를 잠재적으로 차단할 수 있습니다. 스레드 풀을 활용함으로써 Node.js는 이러한 차단 작업을 작업자 스레드로 오프로드하여 다른 비동기 작업이 기본 이벤트 루프에서 계속 실행되도록 할 수 있습니다.

       

      fs 모듈이 스레드 풀을 사용하는 이유는 다음과 같습니다.

      1. 파일 I/O의 차단 특성:
        • 파일 I/O 작업, 특히 대용량 파일의 경우 본질적으로 차단될 수 있습니다. 동기적으로 수행되는 경우 이러한 작업은 파일 작업이 완료될 때까지 전체 응용 프로그램의 실행을 중지할 수 있습니다.
      2. 동시성 및 병렬성:
        • Node.js는 비차단 및 비동기식으로 설계되었습니다. 스레드 풀을 활용하면 Node.js가 파일 작업을 동시 및 병렬로 처리할 수 있으므로 이러한 작업이 이벤트 루프에서 병목 현상을 일으키는 것을 방지할 수 있습니다.
      3. CPU 사용량 최적화:
        • 특정 파일 작업에는 대량의 데이터를 읽거나 처리하는 등 CPU 집약적인 작업이 포함될 수 있습니다. 이러한 작업을 스레드 풀의 작업자 스레드로 오프로드하면 병렬 처리가 가능해 사용 가능한 CPU 리소스를 더 잘 활용할 수 있습니다.
      4. 이벤트 루프 차단 방지:
        • 스레드 풀을 사용하여 파일 작업을 비동기적으로 수행하면 기본 이벤트 루프가 차단되는 것을 방지할 수 있습니다. 비차단 I/O는 HTTP 요청 처리 또는 사용자 상호 작용에 대한 응답과 같은 다른 비동기 작업이 파일 작업이 진행되는 동안 계속 처리될 수 있도록 보장합니다.
      5. 효율적인 자원 활용:
        • 스레드 풀의 작업자 스레드는 기본 libuv 라이브러리에 의해 관리되며 병렬 실행을 위한 메커니즘을 제공합니다. 이러한 효율적인 리소스 활용은 I/O 동시성이 높은 애플리케이션이나 여러 파일 작업을 동시에 처리해야 하는 애플리케이션에 매우 중요합니다.
      6. 확장성:
        • 여러 파일 작업을 동시에 수행해야 하는 시나리오에서 스레드 풀을 사용하면 Node.js가 애플리케이션의 응답성을 저하시키지 않고 더 많은 수의 파일 관련 작업을 확장하고 처리할 수 있습니다.
  2. 암호화 모듈:
    • 암호화 기능을 제공하는 Node.js의 crypto 모듈은 특정 작업에 스레드 풀을 활용합니다.
    • 예시에는 해싱, 암호화, 해독 작업이 포함됩니다.
    • 암호화 모듈에서 스레드풀을 왜 사용할까?
    • 더보기

      Node.js의 'crypto' 모듈과 같은 암호화 모듈에서 스레드 풀을 사용하면 성능, 병렬성 및 효율적인 리소스 활용과 관련된 여러 가지 이점을 제공합니다. 암호화 작업, 특히 해싱, 암호화 또는 암호 해독과 관련된 작업은 계산 집약적일 수 있습니다. 스레드 풀을 활용하면 이러한 작업을 동시에 수행할 수 있어 전반적인 애플리케이션 성능과 응답성이 향상됩니다.

       

      암호화 모듈에서 스레드 풀을 사용하면 다음과 같은 이점이 있습니다.

      1. 병렬성과 동시성:
        • 암호화 작업에는 병렬화할 수 있는 수학적 계산이 포함되는 경우가 많습니다. 스레드 풀을 사용하면 다중 코어 프로세서를 활용하여 여러 스레드에서 여러 암호화 작업을 동시에 처리할 수 있습니다.
      2. 향상된 처리량:
        • 비밀번호 해싱이나 키 파생과 같은 암호화 작업에는 시간이 많이 걸릴 수 있습니다. 스레드 풀을 사용하면 암호화 모듈이 이러한 작업을 병렬화할 수 있으므로 사용 가능한 CPU 리소스를 보다 효율적으로 활용하여 처리량이 향상됩니다.
      3. 반응형 애플리케이션:
        • 스레드 풀을 활용하면 암호화 작업이 메인 이벤트 루프를 차단하는 것을 방지할 수 있습니다. 이러한 작업은 작업자 스레드에서 병렬로 수행될 수 있으므로 애플리케이션은 사용자 요청 처리 또는 I/O 작업 처리와 같은 다른 비동기 작업에 계속 응답합니다.
      4. 효율적인 자원 활용:
        • 암호화 작업에는 CPU 집약적인 계산이 포함되는 경우가 많습니다. 이러한 계산을 스레드 풀의 작업자 스레드로 오프로드하면 특히 여러 암호화 작업이 동시에 수행되는 시나리오에서 사용 가능한 CPU 코어를 효율적으로 활용할 수 있습니다.
      5. 확장성:
        • 여러 암호화 작업을 동시에 수행해야 하는 시나리오에서는 스레드 풀을 통해 암호화 모듈이 더 많은 양의 요청을 확장하고 처리할 수 있습니다. 이는 특히 보안 및 암호화 요구 사항이 높은 애플리케이션과 관련이 있습니다.
      6. 지연 시간 단축:
        • 스레드 풀을 사용하여 암호화 작업을 병렬화하면 이러한 작업의 전체 대기 시간을 줄일 수 있습니다. 여러 스레드에 작업 부하를 분산함으로써 암호화 작업을 완료하는 데 걸리는 시간이 최소화되어 응답 시간이 빨라집니다.
  3. zlib 모듈:
    • zlib 모듈은 Node.js의 압축 및 압축 해제 작업에 사용됩니다.
    • 대량의 데이터를 압축하거나 압축을 풀면 계산 집약적일 수 있으며 스레드 풀은 이러한 작업을 병렬화하는 데 도움이 됩니다.
  4. DNS 모듈:
    • Node.js의 dns 모듈은 DNS(도메인 이름 시스템) 조회를 비동기식으로 수행하며 특정 작업에는 스레드 풀이 포함됩니다.
    • 이는 메인 이벤트 루프를 차단하지 않고 도메인 이름을 확인하는 데 도움이 됩니다.
  5. 쿼리 문자열 모듈:
    • URL 쿼리 문자열을 구문 분석하고 형식을 지정하는 데 사용되는 Node.js의 querystring 모듈은 특정 작업에 스레드 풀을 활용합니다.

이 예는 Node.js의 스레드 풀이 특정 작업을 병렬화하여 동시성과 성능을 향상시키는 방법을 보여줍니다. Node.js의 모든 작업이 스레드 풀을 사용하는 것은 아니라는 점에 유의하는 것이 중요합니다. 비동기식으로 수행할 수 있는 I/O 작업 및 기타 작업은 이 기능을 통해 가장 큰 이점을 얻을 수 있습니다. 또한 스레드 풀의 활용은 개발자에게 투명하며 Node.js는 이를 내부적으로 관리합니다.

'Node.js' 카테고리의 다른 글

[Node.js] HTTP, HTTPs  (0) 2024.01.02
[Node.js] 에러처리 올바르게 하기  (1) 2024.01.01
[Node.js] 버퍼와 스트림  (1) 2024.01.01
[Node.js] Node 내장 객체  (0) 2023.12.30
[Node.js] CommonJs vs ECMAScript  (0) 2023.12.30