관리 메뉴

필사(筆寫)

express.js "uv_resident_set_memory" 오류 본문

Service Developments/Node.js,Express

express.js "uv_resident_set_memory" 오류

코딩필사 2024. 7. 19. 10:40

Error: ENOENT: no such file or directory, uv_resident_set_memory

 

리눅스/우분투 계열에서 위와 같은 메시지와 함께 nodejs express 데몬이 종료된다면, 

여러가지 nginx 설정도 중요하지만 우분투에서 파일 접근 디렉티브 조정이 필요하다.

 

$ulimit -n 했을때 1024라면, 파일 접근 가능 횟수가 부족할 수 있음으로

서버 성능에 따라서 조정을 해주는 것이 맞다.

 

root 계정을 사용할 때와 sudo root 처리하는 경우 둘다 작업해줘야 한다.

ulimit 설정 이후 터미널을 종료하고 다시 들어와서 ulimit -n 숫자가 올바르게 변화했음을 체크해야 한다.

 

아스테리크를 써서 전역적인 설정은 아래와 같이 하며

 

sudo nano /etc/security/limits.conf

 

* soft nofile 65535

* hard nofile 65535

 

이외 nginx 1.18 이후 버전대역은 user 가 nginx임으로 아래와 같이 설정해도  되고

 

nginx soft nofile 65535

nginx hard nofile 65535

 

이하버전인 경우 www-data 라면

 

www-data soft nofile 65535

www-data hard nofile 65535

 

 

데몬을 root로 바로 쓰는경우가 아닌 경우,

su 후에,

nano nano /etc/security/limits.conf

 

nginx user 를 nginx 또는 www-data 와 같이 단독으로 사용하는 경우 해당 계정으로 스위치해서 ulimit 수치를 확인해주거나 위처럼 아스테리크(*, 모든계정)로 처리해서 해주는 것이 맞다.

 

메모리에 따라서 65535와 같이 사이즈를 결정해주는게 맞다.

해당 설정은 mongodb, nginx 등 모두 공역화해서 쓰는 사이즈라 보면 된다.

 

이후 /etc/pam.d/common-session

 

session required pam_limits.so

 

을 주석해제 또는 추가해주어 로그인 후 limit가 반영될 수 있도록 배치하고

nginx의 경우 worker_rlimit_nofile 65535; 와 같이 한계를 지정해주는 것이 좋다.

 

다중 코어 CPU 중 32개 넘어가는 CPU의 경우 전체 nofile을 점거될 수 있는 상태가될 수 있어

서비스 온할 때 설정을 추가해서 제한하고 싶다면 아래와 같이 막아줄 수 있다.

 

sudo nano /lib/systemd/system/nginx.service

[Service]

LimitNOFILE=10240

 

sudo systemctl daemon-reload && sudo systemctl restart nginx

이외, 실제 파일 디스크립터 제한 확인 명령어는 grep 포함해서 확인 가능하다.

 

cat /proc/$(pgrep nginx | head -n 1)/limits | grep "Max open files"