개요
NestJS로 프로젝트를 진행하며, CPU bound 작업이 있는 상황이 있었습니다.
JS는 기본적으로 싱글스레드 비동기로 동작했기 때문에 CPU 코어수가 여러개 있더라도 한개의 코어밖에 사용하지 못했습니다.
이 때문에 CPU bound 작업을 병렬처리하지 못했고, 이는 사용자가 빠르게 응답을 받지 못하는 결과로 이어졌습니다.
이를 해결하고자 Node.js의 내장 모듈인 worker thread를 이용해서 JS 코드를 병렬처리 해보겠습니다.
worker thread
worker thread는 Node.js에서 다중 스레드를 사용할 수 있도록 도와주는 모듈입니다.
1부터 10억까지 더하는 작업을 예시로 들어 설명드리겠습니다.
사용법은 간단합니다.
worker_thread 모듈을 가져온 뒤, 사용자가 파라미터로 보내준 값을 읽어와 병렬처리 코드를 작성하면 됩니다.
위 코드에서는 worker로부터 startRange와 endRange를 받아와 모두 더하는 작업을 수행했습니다.
worker thread를 사용하기 위해 워커를 생성하고, 해당 워커스레드에서 사용할 data를 넘겨주는 코드입니다.
worker.js에서 startRange와 endRange를 읽어온 뒤 사용하기 위해 workerData의 인자값으로 startRange와 endRange를 넣어줍니다.
성능 테스트
worker thread를 사용했을때와 하지 않았을 때, 1부터 10억까지 더하는 작업을 수행해보겠습니다.
아래는 단일 스레드를 사용했을 때 성능 결과입니다.
측정 결과 평균적으로 760ms의 성능을 나타냈습니다.
다음은 worker thread를 사용했을 때의 성능 결과입니다.
정확히 1/2는 아니지만 그와 근사한 값으로 줄어든 것을 확인할 수 있습니다.
결론
JS 환경에서 CPU bound 작업의 성능 개선을 위해 worker thread를 사용해 보았습니다.
JS는 싱글스레드로 동시성 문제 없이 안전하게 작업을 처리할 수 있다는 작업이 있지만 cpu bound 작업이 있는 경우 이 점이 단점으로 작용한다는 것을 알게되었습니다.
하지만 일반적인 웹 어플리케이션은 CPU 집약적인 작업보단 IO 관련된 작업이 더 많기 때문에 상황에 맞게 worker thread 모듈을 사용하면 좋을 것 같습니다.
'개발 > NestJS' 카테고리의 다른 글
Github Action + NestJS e2e 테스트 환경 구성 (0) | 2024.08.20 |
---|