2015-02-19 14 views
11

tôi nhận thấy một cảnh báo trong nhật ký Heroku gần đây nói rằng có vẻ mới mẻ với tôiLàm thế nào để mở rộng quy mô đúng ứng dụng nodejs trên Heroku sử dụng các cụm

web.1: Đã phát hiện 512 MB bộ nhớ có sẵn, 512 MB giới hạn cho mỗi quá trình (WEB_MEMORY)

web.1: Kiến nghị WEB_CONCURRENCY = 1

tôi đã làm một số nghiên cứu và thấy cluster article này, đó là "mặc định" cách để sử dụng các cụm trong nodejs, nhưng nó hoàn toàn mâu thuẫn với một newly updated article có chứa biến môi trường mới WEB_CONCURRENCY và có đề xuất kích thước khác cho mỗi dyno (nhỏ hơn nhiều, btw)

Trả lời

6

Liên kết đầu tiên là từ tháng 7 năm 2014 và thường là cách được khuyến nghị thực hiện. Tuy nhiên, dynos của Heroku khá tập trung vào bộ nhớ, và nó rất dễ dàng vượt quá mức trợ cấp bộ nhớ được cấp phát khi sử dụng số lõi tối đa cho mỗi CPU (như bài viết đầu tiên gợi ý).

Thay vào đó, đề xuất mới là lập hồ sơ ứng dụng của bạn và tìm ra số lượng bộ nhớ được yêu cầu cho mỗi quá trình. Đặt biến môi trường WEB_MEMORY giá trị này, và sau đó cập nhật mã cluster của bạn như sau:

var cluster = require('cluster'); 
var numWorkers = process.env.WEB_CONCURRENCY; 

if(cluster.isMaster) { 
    // Master process: fork our child processes 
    for (var i = 0; i < numWorkers; i++) { 
    cluster.fork(); 
    } 

    // Respawn any child processes that die 
    cluster.on('exit', function() { 
    cluster.fork(); 
    }); 

} else { 
    // Child process, put app initialisation code here. 
} 

Bằng việc sử dụng biến WEB_MEMORY, Heroku có thể tạo ra một giá trị WEB_CONCURRENCY tùy thuộc vào kích thước của Dyno bạn đang chạy, và do đó chia nhỏ số lượng chính xác các quy trình để đảm bảo rằng ứng dụng của bạn không vượt quá phụ cấp bộ nhớ.

Ngoài ra, nếu bạn vượt quá mức cấp phát bộ nhớ (512MB cho mỗi dyno cho 1x dyno), không gian hoán đổi sẽ được sử dụng cho số dư. Điều này sẽ làm chậm ứng dụng của bạn, khiến thời gian yêu cầu tăng lên và nói chung sẽ đóng góp vào sự chậm chạp. Nếu bạn vượt quá mức sử dụng bộ nhớ quá nhiều (khoảng ba lần phân bổ), Heroku sẽ khởi động lại dyno của bạn.

+0

bạn có nghĩa là nếu tôi có một ứng dụng rất hiệu quả về bộ nhớ, tôi cũng có thể có khả năng có hơn 4 cụm trên mỗi dyno? Hoặc tôi vẫn có số CPU như một hạn chế (vì không có đề cập đến số lượng 'CPU có sẵn' trong tài liệu mới)? –

+0

Tùy thuộc vào loại ứng dụng bạn đang viết. Đó là sự thật rằng nếu bạn đang viết một bộ nhớ hiệu quả nhưng ứng dụng chuyên sâu CPU sau đó bạn có thể cần phải sử dụng một kỹ thuật khác nhau. Nhưng tôi đoán rằng hầu hết các ứng dụng nút (nghiêm trọng) đang tận dụng các cụm sẽ bị hạn chế bởi các ràng buộc RAM trên một dyno Heroku thay vì các ràng buộc CPU. – fiznool

+0

nhưng vấn đề là nếu heroku bây giờ cho phép tôi chia nhỏ hơn 4 cụm trong một dyno thông thường nếu tôi không sử dụng quá nhiều bộ nhớ, bạn có biết tôi có thể di chuyển không? –

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