進程守護為什麽選擇pm2
官網::: 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