devo.ps團隊對JavaScript的迷戀已經不是什么秘密了;node.js作為服務器端,AngularJS作為客戶端,某種程度上說,我們的堆棧是用它建成的.我們構建靜態客戶端和RESTful JSON API的方法意味着我們跑了很多的node.js,我必須承認盡管node.js的一切都令人敬畏,但當我們在生產環境中運行它時它仍然會讓我們感到頭疼.相比一些更加成熟的語言,它的工具和最佳實踐仍然缺乏(試想一下:監控,日志,錯誤處理).
到目前為止,我們仍然依賴漂亮俏皮的node-forever模塊.它是非常偉大的模塊,不過依然缺失一些功能:
- 有限的監控和日志功能,
- 進程管理配置的支持差,
- 不支持集群,
- 代碼庫老化(意味着在升級node.js時頻繁的失敗).
這就是為什么我們要在過去的幾個月里去寫PM2模塊.在我們即將發布針對生產環境的正式版之前我們想先讓您看一眼.
PM2到底是什么個東西呢?
首先第一件事,你需要先通過 npm 來安裝它:
npm install -g pm2
讓我們通過表格來對比下:
Feature | Forever | PM2 |
---|---|---|
Keep Alive | ✔ | ✔ |
Coffeescript | ✔ | |
Log aggregation | ✔ | |
API | ✔ | |
Terminal monitoring | ✔ | |
Clustering | ✔ | |
JSON configuration | ✔ |
現在讓我來介紹一點點主要特性...
原生的集群化支持
Node v0.6引入了集群特性,允許你在多個Node應用中共享socket.問題在於,它不能在容器外運行而且需要一些額外的配置來處理主進程和子進程.
PM2原生支持處理這個問題,而且不需要額外的代碼:PM2本身作為主進程,然后它將你的代碼封裝到一個特殊的集群進程里,就像node.js一樣,為你的代碼文件添加一些全局變量.
想要啟動一個使用所有CPU核心的集群,你只需要鍵入如下的指令:
$ pm2 start app.js -i max
然后;
$ pm2 list
然后就會顯示類似下面的東西(ASCII UI FTW);
就像你看到的,現在你的應用有多少個進程就取決於你的CPU核心數了.
按照termcaps-HTOP(Linux下的系統監控與進程管理軟件)的方式管理
通過pm2 list命令來觀察所有運行的進程以及它們的狀態已經足夠好了.但是怎么來追蹤它們的資源消耗呢?別擔心,用這個命令:
$ pm2 monit
你可以得到進程(以及集群)的CPU的使用率和內存占用.
聲明: node-usage 到目前為止還不支持MacOS(隨便什么性能要求),不過它在Linux下運行良好.
現在,讓我們來核實一下我們的集群,還有對內存堆棧的垃圾回收,我們假設你已經有一個HTTP基准測試工具(如果沒有,你一定要使用 WRK):
$ express bufallo // Create an express app $ cd bufallo $ npm install $ pm2 start app.js -i max $ wrk -c 100 -d 100 http://localhost:3000/
在另一個終端,運行監控選項:
$ pm2 monit
耶~
實時集中log處理
現在你不得不管理多個集群進程:一個爬取數據,一個處理數據,等等...這就意味着大量log,你可以按照老式的方法處理:
$ tail -f /path/to/log1 /path/to/log2 ...
但我們想的很周到,我們增加了logs功能:
$ pm2 logs
快速恢復
現在事情一切順利,你的進程嗡嗡的運行着,你需要做一次硬重啟(hard restart).現在嗎?是的,首先,dump掉:
$ pm2 dump
然后,你可以從文件中恢復它:
$ pm2 kill // 讓我們假設一個PM2停掉了
$ pm2 resurect // 我所有的進程又滿血滿狀態復活了
強健的API
比方說,你想要監控所有被PM2管理的進程,而且同時還想監控運行這些進程的機器的狀態(甚至希望創建一個Angular應用來調用這些API...):
$ pm2 web
打開瀏覽器輸入 http://localhost:9615 ,我嘞個去!!
對了,還有很多特性...
- 全部測試通過,
- 新一代的update-rc.d(pm2 startup),當然它還是alpha版,
- 開發模式下更改文件自動重啟(pm2 dev),也同樣還是草稿,
- 自動刷新log,
- 快捷的通過JSON文件管理你的應用,
- 在error log里記錄未捕獲的異常,
- 記錄重啟的次數和時間,
- 退出時自動殺死進程.
下一步計划?
首先,你可以去Github上粉我們(我們喜歡stars): https://github.com/Unitech/pm2.
我們開發的PM2提供了先進完整的Node進程管理解決方案.我們希望能有更多的人來幫助我們:更多的pull requests.一些還停留在開發路線圖上面的功能我們會盡快完成,下面這些就是:
- 遠程管理/狀態校驗,
- 嵌入式跨進程通信通道(消息總線),
- V8垃圾回收的內存泄漏檢查,
- Web界面,
- 監控數據持久化,
- 郵件通知.
特別感謝 Makara Wang 的觀點和工具,還有 Alex Kocharin 提的建議和提交的代碼.