node.js 애플리케이션 프로세스 관리 도구 매니저

web/node.js|2018. 10. 6. 01:38

PM2 built-in 되어있는 Load Balancer 함께 node.js 애플리케이션의 runtime and process 관리 기능을  제공해 주는 라이브러리이다. PM2를 이용하여 application 죽지 않고 돌아갈 수있게 watch 기능을 제공해주는 기능도 제공한다.

그리고 error.log, info.log, 자원 점유 등등 여러 기능을 제공해준다.

간단하게 설치부터 사용법에 대해 정리해보자.


설치
$ npm install pm2 -g


실행방법
$ pm2 start app.js


사용법은 아주 간단하다. 위와 같이 command로 프로그램을 실행할 때 여러 옵션도 줄 수 있다.

1
2
// wedul_app.js 를 max_space_size를 500으로 지정하고 실행하라.
pm2 start wedul_app.js —node_args=“—max_old_space_size=500”
cs


두 개 이상의 옵션도 부여할 수 있다.

1
2
// max_space_size와 harmony(es 2015 옵션)를 둘다 사용.
pm2 start wedul_app.js --node-args="--max_old_space_size=500 harmony"  
cs


하지만 실제 운영 에서는 옵션이 한두가지가 아니기 때문에 계속 command로 설정을 지정 하기에는 부담이 된다. 

그래서 별도의 json 파일에 옵션값들을 정의할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
  "apps": [
    {
      "name": "wedul_batch",
      "script": "./batch/index.js",
      "watch": true,
      "node_args":"--harmony",
      "env": {
        "NODE_ENV": "development"
      },
      "env_production": {
        "NODE_ENV": "production"
      }
    },
    {
      "name": "wedul",
      "script": "./bin/www",
      "watch": true,
      "node_args":"--harmony",
      "env": {
        "NODE_ENV": "development"
      },
      "env_production": {
        "NODE_ENV": "production"
      }
    }
  ]
}
cs


위의 옵션은 각 실행시키고자 하는 애플리케이션의 이름과 위치 그리고 옵션등을 지정할 수 있다. 

위와 같이 설정하고 아래 명령어로 실행시킨다.

 pm2 start pm2test.json --name wedul_batch --env development

이렇게 실행하면 pm2test.json 옵션에 맞게 실행이 된다.( --env 옵션을 사용하면 이전에 공부했었던 process.env.NODE_EVN 전역변수값을 사용할 수 있다.)

이렇게 모든 설정을 하고 실행하면 다음과 같은 화면으로 실행된다.

그리고 더 여러 기능들을 제공하는데 그 중 몇가지만 살펴보자.


# detail (특정 애플리케이션 현재 상태 확인)

1
pm2 show [appname]
cs



# 실시간 로그 및 자원 현황 모니터링

1
pm2 monit
cs


#로그 확인

1
pm2 log [appname]
cs


댓글()
  1. BlogIcon node 2018.11.02 19:06 댓글주소  수정/삭제  댓글쓰기

    watch로 소스코드 변경 후 재시작 기능도 확인할 수 있어요.
    http://pm2.keymetrics.io/docs/usage/watch-and-restart/

  2. node 2018.12.26 14:40 댓글주소  수정/삭제  댓글쓰기

    cluster기능을 통해 싱글 코어에서 이벤트 루프를 받던 방식을 멀티 코어로 바꿀수도 있어요

규칙 68 - 스레드보다는 실행자와 태스크를 이용하라.

JAVA/Effective Java|2018. 6. 13. 09:35

여러 쓰레드를 실행해야할 때,  큐에 넣고 작업을 진행하거나 할 수 있으면 더욱 효율적으로 관리 할 수있다.


그래서 자바 1.5부터 자바 플랫폼에는 java.util.concurrent가 추가되었다. 이 패키지에는 Executor Framework가 들어 있는데 이는 인터페이스 기반 task 실행 프레임워크이다.


해당 Executor를 실행하기 위해서는 다음과 같이 입력하면 된다.

1
2
3
4
5
6
7
ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.    
    @Override
    public void run() {
        System.out.println("test");
    }
});
cs


그리고 만약 executor안에 요소가 모두 실행이 끝난뒤에는 실행자가 꺼지지는 않는다.

이를 명시적으로 꺼주어야 하는데 그때 shutdown() 메소드를 이용하면 된다.


이른 기능을 제외하고도 임의에 task의 작업을 기다릴 수도 있고 task가 끝날때마다 정보를 가져오도록 할수도 있다. 


여러 작업을 관리해야하는 경우에는 ThreadPool을 만들어서 작업할 수 있다. 이런 작업을 제공하는 ThreadPool은 newCachedThreadPool과 newFixedThreadPool이 있다.


먼저 newCachedThreadPool은 부하가 크지않고 작은 프로그램에서 사용하기에 적합하다. 설정도 필요없고 보통 많은일을 알아서 처리한다. 하지만 작업량이 많은곳에서는 적합하지 않다. 

왜냐하면 해당 쓰레드풀은 작업이 큐에 들어가는 것이 아니라 실행을 담당하는 스레드에 바로 넘겨진다. 그렇기 때문에 task가 많이 지정될 경우에는 상당히 많은 양의 쓰레드가 생성이 되어 CPU의 사용량이 증가된다.


그렇기 때문에 이를 보안하는 ThreadPool이 있는데 newFixedThreadPool이다.


newFixedThreadPool은 스레드 개수가 고정된 풀을 만들어서 제어가 손쉽다.


이런 실행자들을 이용하여 쓰레드를 관리하면 별도의 개별쓰레드를 만들어서 관리하는 것보다 훨씬 편하고 안정적이다.


  출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙68



댓글()