1. 程式人生 > >進程守護為什麽選擇pm2

進程守護為什麽選擇pm2

其他 csdn hub eas 守護 null point 註冊 jsb

官網::: https://pm2.io/doc/en/runtime/quick-start/

前言


源碼:https://github.com/Unitech/pm2

這裏的pm2並不是大氣汙染物啊

事實上,pm2 是一個帶有負載均衡功能的Node應用的進程管理器,Node實現進程管理的庫有很多,forever也是其中一個很強大但是也相對較老的進程管理器。

為什麽要使用pm2


對於這個問題,先說說我的看法,最基本的原因是因為node本身是一個單線程應用,它的特點就是所有方法都是串行一次執行,並且node並沒有能力像Java一樣獨自去創建一個新的線程來實現異步操作,如果在執行I/O中遇到了阻塞就會降低整個應用的執行效率,導致CPU使用率高等不利原因。

因此在這種模式下,一個線程只能處理一個任務,要想提高吞吐量必須通過多線程。雖然單線程的好處有很多比如避免了線程同步或者死鎖、狀態同步等等之類的問題,但是在應用和計算能力要求日益倍增的今天,單線程最大的弊端就是無法利用多核CPU帶來的優勢來提升運行效率。

我們知道node可以利用異步I/O來避免線程阻塞,提高利用率等優點:
技術分享圖片

同時為了彌補單線程無法利用多核CPU的問題,提供了“子進程”這個概念,Node.js 實際上是 Javascript 執行線程的單線程,真正的的 I/O 操作,底層 API 調用都是通過多線程執行的。當然在這裏我只是指出了這一背景,那麽為什麽我們要用pm2?

我總結了兩個比較簡潔的答案:1、pm2可以把你的應用部署到服務器所有的CPU上($ pm2 start app.js -i max),有效的解決了之前背景裏提出的問題。 2、同樣是進程管理器,為什麽不用forever?我認為最大的區別是在監控欠缺,進程和集群管理有限。在監控以及log方面可以認為forever完敗於pm2,為什麽,一張圖你就知道答案。

技術分享圖片

這是pm2官網給出的Demo,我們可以清晰地看見整個集群的模式、狀態,CPU利用率甚至是內存大小,而forever給出的是什麽呢?null

如果我要實時監控所有的進程狀態呢?

技術分享圖片

這就是pm2的強大之處,多進程管理、監控、負載均衡……

pm2主要特點


  • 內建負載均衡(使用Node cluster 集群模塊、子進程,可以參考樸靈的《深入淺出node.js》一書第九章)
  • 線程守護,keep alive
  • 0秒停機重載,維護升級的時候不需要停機.
  • 現在 Linux (stable) & MacOSx (stable) & Windows (stable).多平臺支持
  • 停止不穩定的進程(避免無限循環)
  • 控制臺檢測
  • 提供 HTTP API
  • 遠程控制和實時的接口API ( Nodejs 模塊,允許和PM2進程管理器交互 )

用法


$ npm install pm2 -g     # 命令行安裝 pm2 
$ pm2 start app.js -i 4 #後臺運行pm2,啟動4個app.js 
                                # 也可以把‘max‘ 參數傳遞給 start
                                # 正確的進程數目依賴於Cpu的核心數目
$ pm2 start app.js --name my-api # 命名進程
$ pm2 list               # 顯示所有進程狀態
$ pm2 monit              # 監視所有進程
$ pm2 logs               #  顯示所有進程日誌
$ pm2 stop all           # 停止所有進程
$ pm2 restart all        # 重啟所有進程
$ pm2 reload all         # 0秒停機重載進程 (用於 NETWORKED 進程)
$ pm2 stop 0             # 停止指定的進程
$ pm2 restart 0          # 重啟指定的進程
$ pm2 startup            # 產生 init 腳本 保持進程活著
$ pm2 web                # 運行健壯的 computer API endpoint (http://localhost:9615)
$ pm2 delete 0           # 殺死指定的進程
$ pm2 delete all         # 殺死全部進程

運行進程的不同方式:
$ pm2 start app.js -i max  # 根據有效CPU數目啟動最大進程數目
$ pm2 start app.js -i 3      # 啟動3個進程
$ pm2 start app.js -x        #用fork模式啟動 app.js 而不是使用 cluster
$ pm2 start app.js -x -- -a 23   # 用fork模式啟動 app.js 並且傳遞參數 (-a 23)
$ pm2 start app.js --name serverone  # 啟動一個進程並把它命名為 serverone
$ pm2 stop serverone       # 停止 serverone 進程
$ pm2 start app.json        # 啟動進程, 在 app.json裏設置選項
$ pm2 start app.js -i max -- -a 23                   #在--之後給 app.js 傳遞參數
$ pm2 start app.js -i max -e err.log -o out.log  # 啟動 並 生成一個配置文件
你也可以執行用其他語言編寫的app  ( fork 模式):
$ pm2 start my-bash-script.sh    -x --interpreter bash
$ pm2 start my-python-script.py -x --interpreter python
  • 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
  • 29
  • 30
  • 31
  • 32

附上keymetrics實時監控


地址:https://app.keymetrics.io/#/register

pm2官方也結合pm2管理提供了一套可視化在線監控平臺,有多牛?上圖:

技術分享圖片

註冊完畢後創建自己的第一個項目工程成功後會得到如圖所示口令:

技術分享圖片

系統分配的public key 和secret key。然後,在安裝有pm2的服務器端輸入以下命令

pm2 interact your-secret-key your-public-key
  • 1
  • 2

接下來的事情就交給可視化去做吧。

進程守護為什麽選擇pm2