Node.js đề xuất "max-old-space-size"


95

Tôi đang gặp một số khó khăn để hiểu cách Node.js hoạt động dựa trên tham số max-old-space-size.

Ví dụ: trong trường hợp của tôi, tôi đang chạy hai phiên bản t2.smallAWS (2GB RAM).

Không chắc tại sao, nhưng tôi đã đặt max-old-space-size=4096(4GB). Nút làm gì trong trường hợp này? Cấu hình này có thể dẫn đến lỗi cấp phát bộ nhớ có thể xảy ra không?

Làm cách nào để xác định giá trị chính xác của max-old-space-sizedựa trên tài nguyên máy chủ?

Ứng dụng của tôi không ngừng tăng mức sử dụng bộ nhớ và tôi đang cố gắng hiểu mọi thứ về nội bộ nút.


8
Bây giờ tôi đang thêm một nhận xét mà tôi thấy rằng điều này đang nhận được lượt xem giảm đi rất nhiều. Tôi mất cả tuần để nhận ra rằng ứng dụng NodeJS của tôi không bị rò rỉ bộ nhớ nhưng trình thu gom rác không bao giờ khởi động. Hãy lưu ý điều này trên các hệ thống có bộ nhớ thấp như t2.micro hoặc t2.small. Máy chủ sẽ gặp sự cố do RAM không có sẵn.
Borjante

Có cách nào để người thu gom rác vào cuộc không?
ZG101

@Borjante tại sao bộ thu gom rác không chạy?
thần thánh

2
Kích thước không gian cũ tối đa được định cấu hình có giới hạn cao hơn tổng dung lượng RAM mà máy có.
Borjante

Câu trả lời:


129

"Không gian cũ" là phần lớn nhất và có thể định cấu hình cao nhất trong heap được quản lý (hay còn gọi là thu thập rác) của V8 (tức là nơi các đối tượng JavaScript tồn tại) và --max-old-space-sizecờ kiểm soát kích thước tối đa của nó. Khi mức tiêu thụ bộ nhớ gần đến giới hạn, V8 sẽ dành nhiều thời gian hơn cho việc thu gom rác nhằm giải phóng bộ nhớ không sử dụng.

Nếu mức tiêu thụ bộ nhớ heap (tức là các đối tượng trực tiếp mà GC không thể giải phóng) vượt quá giới hạn, V8 sẽ làm hỏng quy trình của bạn (vì thiếu giải pháp thay thế), vì vậy bạn không muốn đặt nó quá thấp. Tất nhiên, nếu bạn đặt nó quá cao, thì việc sử dụng heap bổ sung mà V8 sẽ cho phép có thể khiến hệ thống tổng thể của bạn hết bộ nhớ (và hoán đổi hoặc giết các quy trình ngẫu nhiên, vì thiếu giải pháp thay thế).

Tóm lại, trên một máy có bộ nhớ 2GB, tôi có thể sẽ đặt --max-old-space-sizethành khoảng 1,5GB để dành một số bộ nhớ cho các mục đích sử dụng khác và tránh bị tráo đổi.


4
Đó chính xác là những gì tôi hy vọng nhận được câu trả lời, mô tả trường hợp cạnh mà hệ thống hoặc Node hết bộ nhớ.
Borjante

2
@jmrk: Có vẻ bạn hoàn toàn đúng, nhưng khi tôi đang sử dụng RAM 2GB và hoán đổi 4GB và đặt "--max-old-space-size" thành 4GB thì quá trình nút sẽ tiêu tốn tất cả bộ nhớ RAM và bị kẹt trên 1,9GB. Câu hỏi đặt ra ở đây là "Tại sao phải tránh sử dụng hoán đổi ??" (Phiên bản nút 8.11.1)
Manish Trivedi

1
Cờ sẽ ghi đè lên bất kỳ thứ gì khác. Vui lòng kiểm tra kỹ lỗi chính tả.
jmrk

2
Từ d8 --help:--max-old-space-size (max size of the old space (in Mbytes))
jmrk

13

Cập nhật năm 2020

Các tùy chọn này hiện đã được ghi lại chính thức bởi nút . Đối với máy 2GB, có lẽ bạn nên sử dụng:

NODE_OPTIONS=--max-old-space-size=1536

Để xác định dung lượng sử dụng : Bạn có thể xem bộ nhớ khả dụng trên máy Linux đang sử dụng free -m. Lưu ý rằng bạn có thể sử dụng bộ nhớ freebuffers/cachebộ nhớ kết hợp, cũng như buffers/cachecó thể bị vứt bỏ (các bộ đệm và bộ đệm này là một cách hay để sử dụng bộ nhớ không dùng đến).

Lưu ý tài liệu chính thức cho cácmax-old-space-size đề cập:

Trên máy có bộ nhớ 2GB, hãy cân nhắc đặt giá trị này thành 1536 (1,5GB)

Do đó giá trị trên. Cân nhắc rằng dung lượng bộ nhớ cần thiết cho hệ điều hành cơ sở không thay đổi nhiều, vì vậy bạn có thể vui vẻ thực hiện 3.5 trên máy 4GB, v.v.


1
Từ liên kết bạn đã chia sẻ từ tài liệu Node.js có nội dung: "Trên máy có bộ nhớ 2GB, hãy cân nhắc đặt giá trị này thành 1536 (1,5GB)"
Idan Dagan

1
Cảm ơn @IdanDagan Tôi sẽ thêm điều đó vào câu trả lời.
mikemaccana

11

Lỗi này xảy ra khi bộ nhớ được cấp phát cho ứng dụng đang thực thi ít hơn bộ nhớ cần thiết. Theo mặc định, giới hạn bộ nhớ trong Node.js là 512 MB. Để tăng số lượng này, bạn cần đặt đối số giới hạn bộ nhớ —-max-old-space-size. Nó sẽ giúp tránh vấn đề giới hạn bộ nhớ.

node --max-old-space-size=1024 index.js #increase to 1gb
node --max-old-space-size=2048 index.js #increase to 2gb
node --max-old-space-size=3072 index.js #increase to 3gb
node --max-old-space-size=4096 index.js #increase to 4gb
node --max-old-space-size=5120 index.js #increase to 5gb
node --max-old-space-size=6144 index.js #increase to 6gb
node --max-old-space-size=7168 index.js #increase to 7gb
node --max-old-space-size=8192 index.js #increase to 8gb

https://medium.com/@vuongtran/how-to-solve-process-out-of-memory-in-node-js-5f0de8f8464c


và nó phải nhiều hơn bộ nhớ Ram được phân bổ
HD ..

Tôi không chắc điều này còn đúng nữa. Chắc chắn trên một hệ thống mà tôi có quyền truy cập vào nút đang chạy 10.20.1, tôi có thể thấy (với node --v8-options) rằng mặc định được báo cáo là 4096 và không cần thiết lập max-old-space-sizebộ thử nghiệm mà tôi đang chạy sẽ được cấp phát tối đa 1,5Gb mà không gặp khó khăn gì. Bài báo vừa được liên kết là từ năm 2016 nên có thể mọi thứ đã tiếp diễn kể từ khi nó được viết.
JaySeeAre

1
Thật khó để chứng thực điều đó; Tôi không thể tìm thấy bất kỳ điều gì rõ ràng trong tài liệu cho V8 hoặc Node. Một hệ thống khác mà tôi đã báo cáo mặc định cho v10, 12 & 14. là 0. FWIW Tôi đã tìm thấy một vài blogger gần đây nói rằng bộ nhớ tối đa là 1.5Gb ( tejom.github.io/general/nodejs/v8/debugging/2017/ 01/16 /… ) và v12 đó có giá trị tối đa động dựa trên hệ thống ( idginsiderpro.com/article/3257673/… ).
JaySeeAre

3
node -e "console.log(`node heap limit = ${require('v8').getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)"-> v12.18.0 và v14.3.0 -> 2096Mb, v10.20.1 -> 1432Mb
JaySeeAre

@JaySeeAre, cảm ơn vì lệnh đó hiển thị heap_size_limit. Đối với một trình bao UNIX bình thường, nó cần được trích dẫn khác:node -e 'console.log(`node heap limit = ${require("v8").getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)'
Sam Watkins

-7

Nếu bạn chỉ muốn làm cho nó hoạt động từ dự án bạn đang làm, hãy làm theo hai bước:

  1. Trong dự án của bạn, cd thành node_module / @ angle cd node_module / @ angle

  2. Bây giờ chạy lệnh dưới đây xuất NODE_OPTIONS = - max-old-space-size = 8192


15
Tại sao cần phải vào thư mục @angular để đặt var môi trường?
mgamsjager
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.