개발자

node 서버가 점점 느려지는 것 같은데 어떻게 개선해보면 좋을까요?

2023년 03월 28일조회 411

안녕하세요. node.js 서버를 운영하고 있는데, 이게 처음에는 단순한 CRUD 서버였는데 요즘 데이터 프로세싱 같은 것도 얹어지고 있어서 느려지고 있다는 느낌을 많이 받아서요. 예상하기로는 node 자체가 기본적으로 event loop 기반에 단일 스레드로 동작하는 구조여서 좀 오래 걸리는 데이터 프로세싱 작업을 하게되면 나머지 요청들을 블락하는게 아닐까 싶습니다… 혹시 이런 컴퓨팅 파워가 어느정도 필요한 node 서버는 어떻게 관리하는게 좋을까요?

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

손정현님의 프로필 사진

안녕하세요! 정확한 서버 구조와 코드를 알지 못해서 좋은 답변이 바로 떠오르지는 않지만 답변드리겠습니다. 우선 cpu 점유율이 높은 작업의 경우 다른 언어들과 비교했을때 node 환경에서 돌리기에 적합하지 않은건 맞는 것 같습니다. Go나 Java 처럼 coroutine이나 멀티 스레드로 구동하는 서버가 좀 더 그런 과도한 cpu 연산을 하는데 적합하지 않을까 생각되네요. node 환경에도 worker thread 라는 개념이 있긴한데, 얼마나 효율적일지는 직접 사용해본적은 많이 없어서 잘 모르겠습니다. worker thread를 사용하면 메인 스레드와 통신하는 방식으로 돌아가게 됩니다. 질문자님이 말씀하신 데이터 프로세싱 작업을 worker thread로 위임하고 결과만 가져다가 사용하는게 메인 스레드의 부하를 줄이는데 도움이 되지 않을까 예상해봅니다. - https://nodejs.org/api/worker_threads.html child process 라는 것도 있긴합니다. - https://nodejs.org/api/child_process.html node 자체가 과도한 cpu 연산이 필요한 작업을하기 시작하면 느려지는게 금방 체감되는 것 같습니다. 대량의 i/o 작업 (네트워크 등)을 비동기적으로 처리하는것에 강점을 가진 환경이라고 생각되네요 :) (뭔가 커리어리 AI 봇이 답변을 더 잘 해줄 것 같기도 하네요 ㅋㅋㅋㅋ)

커리어리 AI 봇님의 프로필 사진

Node.js 서버 성능을 개선하기 위해서는 여러 방법을 사용할 수 있습니다. 다음과 같은 방법들을 고려해보세요. 1. 클러스터링: Node.js의 클러스터 모듈을 사용하여 서버를 여러 프로세스로 분산시킬 수 있습니다. 이렇게 하면 여러 코어를 활용하여 작업을 병렬로 처리할 수 있습니다. 각 워커 프로세스가 독립적인 이벤트 루프를 가지게 되어 블로킹 작업이 다른 요청에 영향을 미치는 것을 줄일 수 있습니다. 2. 비동기 처리와 프로미스: 느린 I/O 작업이나 데이터 프로세싱 작업을 비동기 처리를 사용하여 처리하면 이벤트 루프가 다른 작업을 계속 수행할 수 있습니다. 가능한 한 콜백 대신 프로미스를 사용하고, async/await를 적절히 활용하여 코드를 간결하게 유지하세요. 3. 워커 스레드: Node.js에서는 워커 스레드를 사용하여 CPU 집중적인 작업을 백그라운드 스레드에서 처리할 수 있습니다. 이렇게 하면 메인 이벤트 루프가 블로킹되지 않고 다른 요청을 계속 처리할 수 있습니다. 4. 캐싱: 자주 사용되는 데이터나 계산 결과를 캐싱하여 불필요한 작업을 줄이고 응답 시간을 개선할 수 있습니다. 메모리, Redis, Memcached 등 다양한 캐싱 솔루션을 활용할 수 있습니다. 5. 코드 최적화: 애플리케이션 코드를 분석하여 성능에 영향을 미치는 부분을 찾아 개선할 수 있습니다. CPU 프로파일링 도구를 사용하여 애플리케이션의 병목 현상을 찾아 수정하세요. 6. 로드 밸런싱: 여러 서버 또는 인스턴스를 사용하여 요청을 분산시키는 로드 밸런서를 구축할 수 있습니다. 이렇게하면 서버 부하를 분산시키고 전체 시스템의 성능과 안정성을 개선할 수 있습니다. 7. 데이터베이스 최적화: 데이터베이스 쿼리 및 인덱싱을 최적화하고, 필요에 따라 데이터베이스를 샤딩 또는 파티셔닝하여 성능을 개선할 수 있습니다. 8. 서버 사이드 렌더링(SSR) 최적화: 만약 웹 애플리케이션에서 서버 사이드 렌더링을 사용한다면, 렌더링 성능을 개선하는 방법을 찾아보세요. 이를 위해 렌더링 캐싱, 코드 스플리팅 등의 기법을 사용할 수 있습니다. 9. Throttling과 Debouncing: API 호출 빈도를 제한하거나 사용자 입력에 대한 처리를 지연시켜 불필요한 요청을 줄일 수 있습니다. 이를 통해 서버 부하를 줄이고 성능을 개선할 수 있습니다. 10. 모니터링과 로깅: 서버와 애플리케이션의 성능을 모니터링하고 로그를 기록하여 문제를 식별하고 개선할 수 있습니다. New Relic, Datadog, ELK 스택 등 다양한 모니터링 도구를 활용할 수 있습니다. 11. 자원 사용량 최적화: 애플리케이션의 메모리 사용량, CPU 사용률, 네트워크 대역폭 등 자원 사용량을 최적화하여 서버 성능을 개선할 수 있습니다. Garbage Collection 최적화, 스트림 사용, 압축 전송 등의 기법을 활용할 수 있습니다. 12. 코드 리팩토링: 코드를 정리하고 개선하여 가독성을 높이고 유지 관리를 용이하게 할 수 있습니다. 이를 통해 성능 이슈를 더 쉽게 찾아 해결할 수 있습니다. 이러한 기법들을 적용하여 Node.js 서버의 성능을 개선할 수 있습니다. 최적의 성능을 얻기 위해서는 애플리케이션의 특성과 요구 사항에 따라 적절한 전략을 선택하고 조합해야 합니다. 이러한 과정에서 지속적인 모니터링과 테스트를 수행하여 개선사항을 적용하고 확인하세요.

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!