Đánh dấu không hiệu quả gần phân bổ giới hạn heap không thành công - JavaScript heap ra khỏi bộ nhớ Docker

Cả hai lỗi trên đều xảy ra khi JavaScript có nhiều tiến trình cần xử lý và bộ nhớ được cấp phát mặc định bởi Node không đủ để kết thúc tiến trình đang chạy

Có thể tìm thấy một ví dụ về lỗi này khi bạn phải xây dựng các gói bạn đã cài đặt bằng cách sử dụng npm install với thư viện nút-gyp

Giới hạn bộ nhớ Node mặc định khác nhau giữa các phiên bản, nhưng phiên bản Node 15 mới nhất vẫn có giới hạn bộ nhớ dưới 2GB

Giải quyết lỗi heap JavaScript hết bộ nhớ

Để sửa lỗi JavaScript heap out of memory, bạn cần thêm tùy chọn --max-old-space-size khi chạy lệnh npm

Đây là một ví dụ về việc tăng giới hạn bộ nhớ lên 4GB

node --max-old-space-size=4096 index.js

Nếu bạn muốn thêm tùy chọn khi chạy lệnh npm install thì có thể chuyển tùy chọn từ Node sang npm như sau

node --max-old-space-size=4096 `which npm` install

Nếu bạn vẫn thấy lỗi heap out of memory, thì bạn có thể cần phải tăng kích thước heap hơn nữa. Kích thước bộ nhớ bắt đầu từ 1024 cho 1GB

--max-old-space-size=1024 # increase memory to 1GB
--max-old-space-size=2048 # increase memory to 2GB
--max-old-space-size=3072 # increase memory to 3GB
--max-old-space-size=4096 # increase memory to 4GB
--max-old-space-size=8192 # increase memory to 8GB

Ngoài ra, bạn cũng có thể đặt giới hạn bộ nhớ cho toàn bộ môi trường của mình bằng tệp cấu hình

Đặt giới hạn bộ nhớ Node bằng tệp cấu hình

Bạn có thể đặt giới hạn bộ nhớ mặc định bằng cách sử dụng tệp cấu hình của máy khách đầu cuối của mình

Nếu bạn đang sử dụng Bash, hãy thêm dòng sau vào tệp

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
0 của bạn

export NODE_OPTIONS=--max_old_space_size=4096 #4GB

Khi bạn đang sử dụng ZSH, hãy thêm dòng trên vào tệp

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
1

Đừng quên kiểm tra bộ nhớ còn trống trong máy trước khi tăng giới hạn bộ nhớ

Quá nhiều bộ nhớ được phân bổ cho Node có thể khiến máy của bạn bị treo

Tại sao đống JavaScript hết bộ nhớ xảy ra?

Trước khi tạo Nút, vai trò của JavaScript trong phát triển web bị giới hạn trong việc thao tác các phần tử DOM để tạo trải nghiệm tương tác cho người dùng ứng dụng web của bạn

Nhưng sau khi phát hành Node, JavaScript đột nhiên có kiến ​​trúc back-end, nơi bạn có thể chạy các truy vấn cơ sở dữ liệu phức tạp và xử lý nặng khác trước khi gửi dữ liệu trở lại front-end

JavaScript cũng chứng kiến ​​sự gia tăng của npm cho phép bạn tải xuống các thư viện và mô-đun như React và Lodash

Nhiều mô-đun được tải xuống từ npm có nhiều phụ thuộc vào các mô-đun khác và một số có thể cần được biên dịch trước khi chúng có thể được sử dụng

Việc sử dụng bộ nhớ nút sẽ tăng lên khi bạn có nhiều tác vụ hơn để xử lý. Đây là lý do tại sao hôm nay JavaScript có thể gặp lỗi hết bộ nhớ

Ứng dụng Node-Red hiện đang chạy trong hình ảnh docker, trên phiên bản Docker cũ hơn chạy trên HyperV

Trong luồng này, tôi muốn đọc các thẻ OPCUA khác nhau bằng cách sử dụng các nút "nút-đỏ-contrib-opcua" có chức năng ĐỌC, tôi không sử dụng đăng ký OPC vì muốn đẩy các thẻ này vào một dòng vàoDB mỗi giây để . [Dòng chảy bên dưới]

vui vẻ1409×649 72. 9KB

Khi đọc tất cả các thẻ với tốc độ 5 lần đọc đầy đủ mỗi giây thì không có vấn đề gì, nhưng khi đọc nó với tốc độ 1 lần mỗi giây, Node Red liên tục gặp sự cố. [Với một lần đọc, ý tôi là đọc 90 thẻ OPC khác nhau]

Có ai có ý tưởng về cách ngăn chặn sự cố này không?
Tôi cần dữ liệu mỗi giây vì tôi muốn tạo một bộ tổng công suất.

Cảm ơn trước

Xin chào Robbe

Bắt đầu từ đâu

Tôi cho rằng tệp CSV bạn đọc [bình thường] không thay đổi? . Đọc nó một lần, thực hiện CSV và hoạt động một lần và lưu trữ dữ liệu theo ngữ cảnh. Sau đó, riêng khi bạn thăm dò ý kiến ​​​​máy chủ OPCUA, hãy sử dụng dữ liệu được lưu trữ trong ngữ cảnh

Thứ hai, dường như bạn đang chia nhỏ dữ liệu để thực hiện 90 lần đọc riêng lẻ. Nếu chúng ta giả sử giao tiếp OPCUA mất [trung bình] 15 mili giây, thì 90*15 mili giây = 1. 3 giây. Nói cách khác, bạn có rất nhiều tin nhắn vì nó vẫn còn khá nhiều tin nhắn "trong hàng đợi" [có thể nói như vậy]. Ngoài ra, bạn sẽ nhận được dữ liệu không nhất quán [vì TAG đầu tiên sẽ là 1. Trẻ hơn 3 giây so với thẻ cuối cùng được đọc]. Trên hết, OPCUA có chi phí hoạt động riêng

Có một vài cách tiếp cận để cải thiện điều này

  1. Sử dụng hàm readmultiple của nút OPCUA và loại bỏ các nút SPLIT/JOIN
  2. HOẶC Đọc tất cả các thẻ một lần [sử dụng nội dung chèn khi khởi động], lưu trữ các giá trị của chúng trong ngữ cảnh, sau đó sử dụng
    node --max-old-space-size=4096 `which npm` install
    
    0 và cập nhật các giá trị ngữ cảnh khi có giá trị mới
  3. HOẶC Một giải pháp tốt hơn [sẽ cung cấp cho bạn dữ liệu nhất quán]. Bỏ OPCUA [sử dụng các nút s7] sau đó trong PLC của bạn, di chuyển tất cả các giá trị cần thu thập vào 1 khối bộ nhớ liền kề, đọc toàn bộ 90 mục trong MỘT lần - điều này có nghĩa là mọi phần dữ liệu nhất quán với nhau [đọc tiếp

Hiện tại, bạn phải sử dụng nút Mục OPC-UA để thêm từng mục riêng biệt để đọc. Nếu bạn có một số tham số, tôi khuyên bạn nên thêm chúng vào một luồng con để kiểm tra mọi thứ

hình ảnh1106×414 108 KB


thì bạn có thể làm như sau.

hình ảnh1234×184 22. 8KB

  • Trước hết, bạn có một trình tiêm tự động sẽ xóa các mục khi quy trình bắt đầu
  • Một lúc sau, bạn thêm tất cả các mục [tôi gửi một xung vào luồng con chứa tất cả các mục OPC-UA, thực tế tôi đã đọc từ 20 mô-đun khác nhau trên mỗi máy, tôi chỉ hiển thị một trong số chúng]

Sau 5 giây, tôi bắt đầu bỏ phiếu cho máy khách OPC-UA bằng nhiều lệnh đọc và nhận tất cả các tham số cùng một lúc

Đầu ra là một mảng kép, một cho đối tượng giá trị và một cho tên mục [có chỉ mục tương ứng]. Bởi vì nó là một mớ hỗn độn và không bao gồm các tên biến có thể đọc được, tôi phải xây dựng một hàm để quét mảng trả về và kiểm tra các chuỗi địa chỉ biến và tương quan từng địa chỉ với biến tôi đang tìm kiếm [sửa các mục]. Sau đó, một hàm khác lấy từng biến và tạo một đối tượng được phân tách bằng các mô-đun máy bằng cách sử dụng tên biến [đối tượng chuẩn hóa]

hình ảnh1157×115 10. 6KB

Vì tôi gặp một số vấn đề với điều này, nên tôi đã đưa ra một đề xuất trong Github cho người lập trình nút, để có một tùy chọn tương tự như các nút S7, nơi bạn có thể tải lên tệp CSV có tất cả ID nút OPC-UA và tên biến, đồng thời nhận . Anh ấy nói rằng anh ấy sẽ xem xét, nhưng trong thời gian chờ đợi, tôi thấy đây là quy trình làm việc tốt nhất cho mình

Chủ Đề