จะตรวจสอบการใช้หน่วยความจำของ Node.js ได้อย่างไร?


114

ฉันจะตรวจสอบการใช้หน่วยความจำของ Node.js ได้อย่างไร?


4
รายละเอียดเพิ่มเติมเล็กน้อยอาจเป็นประโยชน์
Wottensprels

คำตอบ:


66

node-memwatch : ตรวจจับและค้นหาการรั่วไหลของหน่วยความจำในรหัส Node.JS ตรวจสอบบทช่วยสอนนี้การติดตามการรั่วไหลของหน่วยความจำใน Node.js


1
node-memwatch ดูเหมือนจะไม่มีชีวิตอีกต่อไป (อัปเดตล่าสุดในเดือนมีนาคม 2013) มีทางเลือกอื่นหรือไม่?
Golo Roden

6
@GoloRoden npm ติดตั้ง memwatch-next ใช้งานได้ดี นี่คือ repo: github.com/marcominetti/node-memwatch
fre2ak

แหล่งข้อมูลที่ทันสมัยมากขึ้นสำหรับการค้นหาการรั่วไหลของหน่วยความจำapmblog.dynatrace.com/2015/11/04/…
saintedlama

22
memwatch ไม่ได้รับการดูแลอีกต่อไปและจะไม่ทำงานบนโหนดเวอร์ชันล่าสุดดังนั้นอย่ากังวล
Mike


153

โมดูลกระบวนการในตัวมีวิธีการmemoryUsageที่ให้ข้อมูลเชิงลึกในการใช้หน่วยความจำของกระบวนการ Node.js ปัจจุบัน นี่คือตัวอย่างจากใน Node v0.12.2 บนระบบ 64 บิต:

$ node --expose-gc
> process.memoryUsage();  // Initial usage
{ rss: 19853312, heapTotal: 9751808, heapUsed: 4535648 }
> gc();                   // Force a GC for the baseline.
undefined
> process.memoryUsage();  // Baseline memory usage.
{ rss: 22269952, heapTotal: 11803648, heapUsed: 4530208 }
> var a = new Array(1e7); // Allocate memory for 10m items in an array
undefined
> process.memoryUsage();  // Memory after allocating so many items
{ rss: 102535168, heapTotal: 91823104, heapUsed: 85246576 }
> a = null;               // Allow the array to be garbage-collected
null
> gc();                   // Force GC (requires node --expose-gc)
undefined
> process.memoryUsage();  // Memory usage after GC
{ rss: 23293952, heapTotal: 11803648, heapUsed: 4528072 }
> process.memoryUsage();  // Memory usage after idling
{ rss: 23293952, heapTotal: 11803648, heapUsed: 4753376 }

ในตัวอย่างง่ายๆนี้คุณจะเห็นว่าการจัดสรรอาร์เรย์ขององค์ประกอบ 10M ผู้บริโภคประมาณ 80MB (ลองดูที่heapUsed)
ถ้าคุณดูที่รหัสที่มาของ V8 ( Array::New, Heap::AllocateRawFixedArray, FixedArray::SizeFor) แล้วคุณจะเห็นว่าหน่วยความจำที่ใช้โดยอาร์เรย์เป็นค่าคงที่บวกความยาวคูณด้วยขนาดของตัวชี้ที่ หลังมีขนาด 8 ไบต์ในระบบ 64 บิตซึ่งยืนยันว่าความแตกต่างของหน่วยความจำที่สังเกตได้คือ 8 x 10 = 80MB นั้นสมเหตุสมผล


1
รุ่น @MestreSan ซึ่งโหนดไม่จำเป็นต้อง--expose-gcสำหรับgcฟังก์ชั่น?
Rob W

1
@MestreSan ฉันไม่เคยบอกว่าคุณต้องการสำหรับ--expose-gc (ต้องใช้) ถูกนำมาใช้ในคำตอบเพื่อกระตุ้นให้เกิดการรวบรวมขยะอย่างกำหนดเพื่อให้ง่ายต่อการดูรายงาน process.memoryUsage()gc()--expose-gcprocess.memoryUsage
Rob W

นั่นเป็นคำตอบที่ยอดเยี่ยมในการวัด JS-Stuff อย่างถูกวิธี ขอบคุณสำหรับคำตอบนั้น
suther

คุณลอร์ดทำงานกับคนนี้ ฉันเพิ่งรู้วิธีการทั้งหมดที่เปิดเผยโดยกระบวนการโทรซึ่งจะช่วยให้ฉันสร้างแอปพลิเคชันที่มีประสิทธิภาพมากขึ้น ขอบคุณ
Andrew

40

นอกจากนี้หากคุณต้องการทราบหน่วยความจำส่วนกลางมากกว่ากระบวนการโหนด ':

var os = require('os');

os.freemem();
os.totalmem();

ดูเอกสารประกอบ


1
อย่างไรก็ตาม freemem () ไม่เหมือนกับหน่วยความจำที่มีอยู่บนเซิร์ฟเวอร์ มีวิธีใดในการค้นหาหน่วยความจำที่มีอยู่แทนที่จะว่างหรือไม่?
Alex


5

บน Linux / Unix (หมายเหตุ: Mac OS เป็น Unix) ให้ใช้topและกด M ( Shift+ M) เพื่อจัดเรียงกระบวนการตามการใช้หน่วยความจำ

บน Windows ให้ใช้ตัวจัดการงาน


@majidarif ไปที่Applications > Utilitiesแล้วคุณจะพบActivity Monitorแอพ อันนั้นเทียบเท่ากับ Task Manager OS X ก็มีtopคำสั่งเช่นกัน
Ingwie Phoenix

3
ใช้htopแทนด้านบนบน Linux มันดีขึ้นมาก.
Ryan Shillington
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.