[PM2] 서버 메모리 사용량 최적화

p_samename·2025년 9월 25일
post-thumbnail

프론트 서버의 메모리 사용량이 많이 올라가는 것을 확인하였다.

첫째로, 프론트 프로젝트에서 메모리 누수가 발생하는것은 아닌지 확인하였으나, 메모리 누수는 아니었고 예상하기로는 당사의 서비스가 다량의 이미지를 사용하기에 이미지의 캐싱과 관련되어있는것은 아닐까 라는 생각이 들었다.

nextjs에서 Image 태그를 사용할 때, 모든 사이즈에 해당하는 최적화된 이미지를 사용하기에 캐싱되는 수가 그만큼 많아지기에 불필요한 많은 캐싱을 줄이기 위해 next.config.js 파일의 deviceSizes를 지정해 주기로 하였다.

images: {
    deviceSizes: [375, 800],
}

설정 후, 프론트에서 2가지의 사이즈만으로 최적화 하는것을 확인하였다.

또한 프로세스의 메모리가 과부하가 걸리는 것을 방지하기 위해 ecosystem.config.js의 pm2 설정을 추가 해주었다.

max_memory_restart: '500M', // 클러스터의 메모리 사용량이 일정 수준을 초과하면 재시작 (30초 간격으로 체크됨)

또한 서버에서 16GB 의 메모리를 사용하며 16개의 cluster를 사용하고있다.
각 cluster 마다 1GB 정도의 메모리를 사용하게 되는데, 500MB가 초과 될 경우 프로세스를 재시작하도록 설정해주었다.

module.exports = {
  apps: [
    {
      name: 'front',
      cwd: './',
      script: 'node_modules/next/dist/bin/next',
      args: 'start',
      exec_mode: 'cluster', // 실행모드 cluster
      instances: 'max', // CPU 코어 수 만큼 프로세스를 생성
      max_memory_restart: '500M', // 클러스터의 메모리 사용량이 일정 수준을 초과하면 재시작 (30초 간격으로 체크됨)
      watch: false, // 프로젝트가 리스타트되거나 파일이 체인지 될경우를 와칭시켜줌
      source_map_support: true,
      time: true,
      env_production: {
        NODE_ENV: 'production', // 배포환경시 적용될 설정 지정
      },
      env_development: {
        NODE_ENV: 'development', // 개발환경 적용
      },
    },
  ],
};

그후 MobaXterm에서
pm2 monit 명령어를 통해 해당 서버를 확인하고 각 클러스터당 메모리 사용량을 확인했을때, 500MB 이하를 유지하는 것을 확인할 수 있으며 평균 메모리 사용량에 과부하가 걸리지 않는 것을 확인하였다.

profile
@p_samename

0개의 댓글