2015-06-23 18 views
6

Tôi có một máy chủ NodeJS (Express) và tôi đang lan truyền các yêu cầu tới nhiều bộ xử lý bằng cách sử dụng ví dụ mô-đun cụm trên trang nodeJs.Làm thế nào để tăng thông lượng trên một máy chủ NodeJS bằng cụm sao?

if (cluster.isMaster) { 
    for (var i = 0; i < numCPUs; i++) { 
    cluster.fork(); 
    }; 
    cluster.on('exit', function(worker, code, signal) { 
    console.log('worker ' + worker.process.pid + ' died'); 
    cluster.fork(); 
    }); 
} else { 
    server.listen(app.get('port'), function(){ 
    console.log('HTTP server on port ' + app.get('port') + ' - running as ' + app.settings.env); 
    }); 

    // setup socket.io communication 
    io.sockets.on('connection', require('./app/sockets')); 
    io.sockets.on('connection', require('./app/downloadSockets')); 
} 

Vấn đề là điểm chuẩn bị vây hãm cho tôi thấy rằng không có sự gia tăng về số lần truy cập. Đây là sản phẩm của cuộc vây hãm:

$ siege -c100 192.168.111.1:42424 -t10S 
** SIEGE 3.0.5 
** Preparing 100 concurrent users for battle. 
The server is now under siege... 
Lifting the server siege...  done. 

Transactions:    1892 hits 
Availability:    100.00 % 
Elapsed time:    10.01 secs 
Data transferred:   9.36 MB 
Response time:    0.01 secs 
Transaction rate:   189.01 trans/sec 
Throughput:    0.93 MB/sec 
Concurrency:    1.58 
Successful transactions:  1892 
Failed transactions:    0 
Longest transaction:   0.05 
Shortest transaction:   0.00 

Sau Clustering:

$ siege -c100 192.168.111.1:42424 -t10S 
** SIEGE 3.0.5 
** Preparing 100 concurrent users for battle. 
The server is now under siege... 
Lifting the server siege...  done. 

Transactions:    1884 hits 
Availability:    100.00 % 
Elapsed time:    9.52 secs 
Data transferred:   9.32 MB 
Response time:    0.01 secs 
Transaction rate:   197.90 trans/sec 
Throughput:    0.98 MB/sec 
Concurrency:    1.72 
Successful transactions:  1884 
Failed transactions:    0 
Longest transaction:   0.07 
Shortest transaction:   0.00 

Điều đó có nghĩa máy chủ của tôi đã nhận được thông tối đa với máy chủ duy nhất có lẽ vì nó là một máy tính cục bộ hoặc có thể nó không thể có được 4 bộ vi xử lý vì có quá nhiều quy trình đang chạy, tôi không chắc chắn.

Tôi làm cách nào để sử dụng mô-đun cụm để tăng hiệu suất và tại sao mã hiện tại của tôi không được tăng cường? Ngoài ra tôi đã kiểm tra rằng nó thực sự tạo ra 4 trường hợp của máy chủ, tức là cluster.fork hoạt động. Mọi mẹo sẽ rất hữu ích.

+1

bạn bị giới hạn bởi phần cứng của mình. – Mox

+1

@Mox Thats những gì tôi nghĩ quá, nhưng kể từ khi tôi chỉ sử dụng một bộ xử lý trong một trường hợp và tất cả những người khác trong trường hợp thứ 2 tôi sẽ giả định rằng tôi đang sử dụng phần cứng của tôi trong trường hợp đầu tiên, do đó tôi sẽ nhận được thông lượng tốt hơn trừ khi nút cổ chai là ở nơi khác. Không chắc chắn cách tìm nút cổ chai đó –

+1

Bạn có nhiều hơn một CPU trong hệ thống của mình không? Clustering hoạt động khi bắt đầu một quá trình mới cho mỗi CPU được tìm thấy, nếu bạn chỉ có một clustering là vô ích. –

Trả lời

6

Hiệu quả đạt được bằng cách phân cụm hoặc phát triển các truy vấn đồng thời (cố gắng tăng số lượng người dùng đồng thời lên 300-400). Hoặc nhiệm vụ mang lại gánh nặng nghiêm trọng. Hãy dành thử nghiệm thú vị hơn: sẽ tải xuống kích thước tệp khoảng 1 MB, cộng với chúng tôi trì hoãn 5 mili giây và 50 mili giây để mô phỏng hoạt động phức tạp. Đối với bộ vi xử lý bốn lõi tại một thử nghiệm địa phương sẽ thực hiện như sau (tương ứng với bình thường và cụm):

$ siege -c100 http://localhost/images/image.jpg -t10S 

chế độ bình thường (5 chậm trễ mili giây):

Lifting the server siege...  done. 
Transactions:     1170 hits 
Availability:     100.00 % 
Elapsed time:     9.10 secs 
Data transferred:    800.79 MB 
Response time:     0.27 secs 
Transaction rate:    128.57 trans/sec 
Throughput:     88.00 MB/sec 
Concurrency:     34.84 
Successful transactions:  1170 
Failed transactions:    0 
Longest transaction:   0.95 
Shortest transaction:   0.01 

chế độ cụm (5 chậm trễ msec) :

Lifting the server siege...  done. 
Transactions:     1596 hits 
Availability:     100.00 % 
Elapsed time:     9.04 secs 
Data transferred:   1092.36 MB 
Response time:     0.06 secs 
Transaction rate:    176.55 trans/sec 
Throughput:     120.84 MB/sec 
Concurrency:     9.81 
Successful transactions:  1596 
Failed transactions:    0 
Longest transaction:   0.33 
Shortest transaction:   0.00 

chế độ bình thường (50 độ trễ mili giây):

Lifting the server siege...  done. 
Transactions:      100 hits 
Availability:     100.00 % 
Elapsed time:     9.63 secs 
Data transferred:    68.44 MB 
Response time:     5.51 secs 
Transaction rate:    10.38 trans/sec 
Throughput:      7.11 MB/sec 
Concurrency:     57.18 
Successful transactions:   100 
Failed transactions:    0 
Longest transaction:   7.77 
Shortest transaction:   5.14 

Chế độ cụm (trễ 50msec):

Lifting the server siege...  done. 
Transactions:      614 hits 
Availability:     100.00 % 
Elapsed time:     9.24 secs 
Data transferred:    420.25 MB 
Response time:     0.90 secs 
Transaction rate:    66.45 trans/sec 
Throughput:     45.48 MB/sec 
Concurrency:     59.59 
Successful transactions:   614 
Failed transactions:    0 
Longest transaction:   1.50 
Shortest transaction:   0.50 
2

bạn không thực sự làm bất cứ điều gì trong ví dụ của mình. Kết nối với mysql và chạy truy vấn nặng hoặc thực hiện yêu cầu http mất vài giây. Bạn nhận thấy rằng cuối cùng, bạn sẽ mã một cái gì đó (hoặc sử dụng một thư viện bên thứ 3) sẽ chặn vòng lặp sự kiện. Đây là khi phân cụm sẽ là quan trọng, vì bạn về cơ bản sẽ có một vòng lặp sự kiện cho mỗi bộ xử lý. Nếu một truy vấn chậm và vòng lặp sự kiện cần phải chờ, truy vấn sẽ không dừng các yêu cầu mới đang truy cập API/ứng dụng của bạn.

Ngoài ra, bạn có thể muốn đọc về kết nối tổng hợp và đặc biệt là nhóm chung trên npm nếu bạn định sử dụng hoặc kết nối với cơ sở dữ liệu hoặc tìm nạp tài nguyên bên ngoài.

Các vấn đề liên quan