[Node.js] Thread Pool

Falcon·2023년 6월 20일
1

javascript

목록 보기
24/28
post-thumbnail

Goals

  • node.js 의 Thread Pool 기본 설정값
  • Thread Pool 용도 파악
  • Thread Pool 설정값 변경 방법

Thread Pool 기본 설정값

Its default size is 4, but it can be changed at startup time by setting the UV_THREADPOOL_SIZE environment variable to any value (the absolute maximum is 1024). - libuv docs

UV_THREADPOOL_SIZE 값이 thread pool 내의 thread 개수를 의미한다.
기본적으로 4로 설정되어있다.

.js 파일 내에서 값을 할당하는 것은 없고 nodejs 가 실행되는 EntryPoint에서 바로 지정해줘야한다.

UV_THREADPOOL_SIZE 설정 방법

Windows CLI

$ env:UV_THREADPOOL_SIZE=<value>
$ node test.js

macOS/Linux

$ export UV_THREADPOOL_SIZE <value>
$ node test.js

Thread Pool 용도

CPU 또는 I/O intensive 한 작업에 내부적으로 쓰인다.
(개발자가 직접 컨트롤하지 않아도)

nodejs eventloop 에서 처리하기에 무거운 작업이 자동으로 thread pool 내의 thread 에 위임된다.
ex) 'crypto' 모듈의 해시함수 연산, 기타 'fs' 모듈 파일 관련 작업

아래 코드를 UV_THREADPOOL_SIZE 값을 바꿔가며 실행해보자.

예제 코드

import {pbkdf2} from 'crypto'
import * as process from 'process'

console.log('worker thread number is : ' + process.env.UV_THREADPOOL_SIZE)

console.time('Hashing1')
pbkdf2('a', 'b', 100_000, 512, 'sha512', ()=>{
  console.timeEnd('Hashing1')
})

console.time('Hashing2')
pbkdf2('a', 'b', 100_000, 512, 'sha512', ()=>{
  console.timeEnd('Hashing2')
})

console.time('Hashing3')
pbkdf2('a', 'b', 100_000, 512, 'sha512', ()=>{
  console.timeEnd('Hashing3')
})

console.time('Hashing4')
pbkdf2('a', 'b', 100_000, 512, 'sha512', ()=>{
  console.timeEnd('Hashing4')
})

console.time('Hashing5')
pbkdf2('a', 'b', 100_000, 512, 'sha512', ()=>{
  console.timeEnd('Hashing5')
})

(1) 쓰레드풀 기본값(4)로 5개 해시함수 실행

worker thread number is : undefined
Hashing3: 351.294ms
Hashing4: 361.309ms
Hashing1: 366.053ms
Hashing2: 371.932ms
Hashing5: 658.325ms

기본값이 4개기 때문에 총 1~4번 해싱작업은 동시에 처리되고 5번은 이후에 쓰레드가 할당되어 처리한 것을 알 수 있다.

쓰레드풀 (5)개로 해시함수 5개 실행

# 쓰레드풀 사이즈 5 지정
$env:UV_THREADPOOL_SIZE=5
worker thread number is : 5
Hashing4: 318.785ms
Hashing5: 328.197ms
Hashing2: 329.408ms
Hashing1: 347.599ms
Hashing3: 360.894ms

쓰레드풀 5개를 모두 사용하여 5개 해싱작업이 동시에 이뤄졌다.

profile
I'm still hungry

0개의 댓글