Pm2 nodejs hướng dẫn kỹ sư cao cấp

Nội dung bài viết

Sử dụng pm2 triển khai với node.js không quá mới, nhưng có những kỹ năng có thể bạn chưa biết, nếu bạn biết thì tôi xin lỗi vì bạn là nhân viên cao cấp. Nhìn vào nội dung của bài đọc, nếu thực sự bạn chưa hiểu pm2 sử dụng để làm gì? Thì không quá khó để giải thích cho bạn thông qua bài viết trước "Sử dụng pm2 triển khai ứng dụng Nodejs". Ở đây dành cho các kỹ sử đã thành thạo pm2.


Node.js Cluster Module


Với việc bạn đọc bài viết này đồng nghĩa với việc bạn đã biết khai thác hết Cores của mình, biết mở rộng hoặc giảm xuống tuỳ theo tình hình của ứng dụng khi sử dụng pm2. hết. Ref: Nếu chưa có sự hỗ trợ của pm2 thì sao? Đầu tiên nói về Cluster thì ai cũng biết rằng Node.js là đơn luồng (single threaded) nhưng tôi cũng có quan điểm riêng khi phân tích Node.js có thể được hiểu là đa luồng. Còn bạn suy nghĩ sao thì đó là quan điểm của bạn, tôi tôn trọng điều đó. Và hãy làm điều đó với quan điểm của tôi. Nói sơ qua về triển khai cluster trong node.js thế nào:


var cluster = require('cluster');  
var http = require('http');  
var cpuCount = require('os').cpus().length;

if (cluster.isMaster) {  
  // Fork workers.
  for (var i = 0; i < cpuCount; i++) {
    cluster.fork();
  }

  cluster.on('exit', function(worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died');
  });
} else {
  // Workers can share any TCP connection
  // In this case it is an HTTP server
  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello world\n");
  }).listen(8000);
}

Ở code trên thì đại khái là Node.js sử dụng nhiều port nhưng cùng một IP và những yêu cầu đến thì có nhiều workers sẽ phản hồi. Việc các workers làm việc dựa trên chế độ round robin.


PM2 Cluster Module


Với việc bạn đọc bài viết này đồng nghĩa với việc bạn đã biết khai thác hết Cores của mình, biết mở rộng hoặc giảm xuống tuỳ theo tình hình của ứng dụng khi sử dụng pm2. hết. Ref: Nếu như sử dụng Node.js có thể dài dòng thì với sự hỗ trợ của pm2 thì đơn giản hơn nhiều. Cú pháp không xa lạ.


$ pm2 start app.js -i 2


Khi enter thì app.js sẽ có 2 processes khai thác. Tuỳ thuộc theo tình hình mà thay rồi -i . Ví dụ:


$ pm2 start server --name homepage -i 4
[PM2] Starting server in cluster_mode (4 instances)
[PM2] Done.
-----------------------------------------------------------------------------------------------------------
│ App name    │ id │ mode    │ pid   │ status │ restart │ uptime │ cpu │ memory      │ watching │
-----------------------------------------------------------------------------------------------------------
│ maintenance │ 0  │ fork    │ 4114  │ online │ 0       │ 2h     │ 12% │ 53.945 MB   │ disabled │
│ homepage    │ 3  │ cluster │ 23568 │ online │ 0       │ 2s     │  9% │ 76.566 MB   │ disabled │
│ homepage    │ 4  │ cluster │ 23569 │ online │ 0       │ 2s     │ 16% │ 66.047 MB   │ disabled │
│ homepage    │ 5  │ cluster │ 23586 │ online │ 0       │ 2s     │  2% │ 55.406 MB   │ disabled │
│ homepage    │ 6  │ cluster │ 23603 │ online │ 0       │ 2s     │ 10% │ 53.160 MB   │ disabled │
-----------------------------------------------------------------------------------------------------------


Đến đây thì có gọi là kỹ sư cao cấp không? Câu trả lời vẫn là KHÔNG. Bình thường, nhưng bạn có đặt câu hỏi nào không? Nếu vẫn là KHÔNG thì bạn bình thường. Nhưng có thì tôi đoán sẽ có hai câu hỏi sau đây. 


Pm2 scale cluster 


Đó chính là làm thế nào để khai thác hết những cores trong CPU có sẵn mà chưa dùng? Pm2 đã tính sẵn hết rồi khỏi lo, bởi bạn chưa biết đó thôi. Muốn khai thác triệt để thì chỉ việc thay đổi -i 0 là ok.


$ pm2 start app.js -i 0


Câu hỏi hay hơn nữa vậy khai khác hết nhưng để lại cho thằng bạn 2 hay 3 cores gì đó thì sao? Theo tôi


$ pm2 start app.js -i -2


Câu lệnh trên cho ta biết rằng nếu có 8 cores đang có sẵn thì trừ cho 3 còn 5 cores. OK Tiếp theo "Nếu như đang chạy 4 cores mà muốn tăng thêm thành 8 cores thì làm sao? Chả nhẽ xoá lại à?" Không cần, chỉ cần:


$pm2 scale    


Ví dụ:


$ pm2 scale homepage 8
[PM2] Scaling up application
[PM2] Scaling up application
[PM2] Scaling up application
[PM2] Scaling up application
------------------------------------------------------------------------------------------
│ App name    │ id │ mode    │ pid   │ status │ restart │ uptime │ memory      │ watching │
------------------------------------------------------------------------------------------
│ maintenance │ 0  │ fork    │ 26400 │ online │ 2       │ 16h    │ 40.844 MB   │ disabled │
│ homepage    │ 3  │ cluster │ 23568 │ online │ 0       │ 2s     │ 76.566 MB   │ disabled │
│ homepage    │ 4  │ cluster │ 23569 │ online │ 0       │ 2s     │ 66.047 MB   │ disabled │
│ homepage    │ 5  │ cluster │ 23586 │ online │ 0       │ 2s     │ 55.406 MB   │ disabled │
│ homepage    │ 6  │ cluster │ 23603 │ online │ 0       │ 2s     │ 53.160 MB   │ disabled │
│ homepage    │ 7  │ cluster │ 36299 │ online │ 0       │ 0s     │ 49.340 MB   │ disabled │
│ homepage    │ 8  │ cluster │ 36316 │ online │ 0       │ 0s     │ 37.949 MB   │ disabled │
│ homepage    │ 9  │ cluster │ 36332 │ online │ 0       │ 0s     │ 28.406 MB   │ disabled │
│ homepage    │ 10 │ cluster │ 36350 │ online │ 0       │ 0s     │ 17.609 MB   │ disabled │
------------------------------------------------------------------------------------------


Hoặc muốn giảm từ 8 xuống 2 thì như sau:


$ pm2 scale homepage 2
[PM2] deleteProcessId process id 3
[PM2] deleteProcessId process id 4
[PM2] deleteProcessId process id 5
[PM2] deleteProcessId process id 6
[PM2] deleteProcessId process id 7
[PM2] deleteProcessId process id 8
------------------------------------------------------------------------------------------
│ App name    │ id │ mode    │ pid   │ status │ restart │ uptime │ memory      │ watching │
------------------------------------------------------------------------------------------
│ maintenance │ 0  │ fork    │ 26400 │ online │ 2       │ 16h    │ 41.688 MB   │ disabled │
│ homepage    │ 9  │ cluster │ 36332 │ online │ 0       │ 115s   │ 71.020 MB   │ disabled │
│ homepage    │ 10 │ cluster │ 36350 │ online │ 0       │ 115s   │ 71.242 MB   │ disabled │
------------------------------------------------------------------------------------------

Tóm lại


Với việc bạn đọc bài viết này đồng nghĩa với việc bạn đã biết khai thác hết Cores của mình, biết mở rộng hoặc giảm xuống tuỳ theo tình hình của ứng dụng khi sử dụng pm2. hết. 


Ref: 

Node.js clustering with PM2 

Node.js Cluster Docs 

PM2 — Cluster Mode and Zero-Downtime Restarts

Có thể bạn đã bị missing