2014-04-22 28 views
7

Tôi đang sử dụng NodeJS VM Module để chạy mã không tin cậy một cách an toàn. Tôi đã nhận thấy một rò rỉ bộ nhớ khổng lồ mất khoảng 10 triệu bộ nhớ trên mỗi lần thực thi và không giải phóng nó. Cuối cùng, quá trình nút của tôi kết thúc bằng cách sử dụng 500M + bộ nhớ. Sau một số lần đào, tôi đã tìm ra vấn đề đối với việc tạo liên tục các máy ảo. Để kiểm tra lý thuyết của tôi, tôi đã nhận xét ra mã tạo ra các máy ảo. Chắc chắn, việc sử dụng bộ nhớ giảm đáng kể. Sau đó tôi uncommented mã một lần nữa và đặt global.gc() các cuộc gọi chiến lược xung quanh các khu vực vấn đề và chạy nút với cờ - expose-gc. Điều này làm giảm đáng kể việc sử dụng bộ nhớ của tôi và giữ lại chức năng.Lỗi bộ nhớ NodeJS khi sử dụng VM để thực thi mã không tin cậy

Có cách nào dọn dẹp máy ảo tốt hơn sau khi tôi đã hoàn thành việc sử dụng máy ảo không?

Cách tiếp cận tiếp theo là bộ nhớ cache vm chứa mã không an toàn nhất định và sử dụng lại nếu tôi thấy mã không an toàn một lần nữa (Nền: Tôi cho phép người dùng viết chức năng phân tích cú pháp của riêng mình cho khối văn bản) mã được thực hiện thường xuyên hoặc thực hiện một lần và không bao giờ nhìn thấy một lần nữa).

Một số mã tham chiếu.

async.each(items,function(i,cb){ 
      // Initialize context... 
      var context = vm.createContext(init); 

      // Execute untrusted code 
      var captured = vm.runInContext(parse, context); 

      // This dramatically improves the usage, but isn't 
      // part of the standard API 
      // global.gc(); 

      // Return Result via a callback 
      cb(null,captured); 
    }); 
+1

Chỉ liên kết cho vấn đề g.jub node.js cho https://github.com/joyent/node/issues/6552 –

+1

Mô-đun VM này không đủ để chạy mã không đáng tin cậy. Hãy thử viết 'while (true) {}' trong phần không tin cậy –

+1

Vấn đề này hiện có thể được theo dõi tại đây: https://github.com/nodejs/node/issues/3113 liên kết đến repo/joyent giờ đã lỗi thời . – Jeffrey

Trả lời

1

Khi tôi thấy quyền này đã được sửa trong v5.9.0, hãy xem this PR. Có vẻ như trong những trường hợp đó, cả người bảo trì lõi node cũng không phải lập trình viên đều có thể làm được nhiều - rằng chúng tôi khá nhiều phải đợi bản sửa lỗi ngược dòng trong v8.

Vì vậy, không, bạn không thể làm gì thêm về nó. Bắt lỗi này là tốt mặc dù!

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