
โหนดซึ่งเป็นรันไทม์สำหรับ Javascript บนฝั่งเซิร์ฟเวอร์ ช่วยเสริมสถานการณ์แอปพลิเคชันของ Javascript อย่างมาก
อย่างไรก็ตาม Node.js Runtime นั้นเป็นกล่องดำ เรา ไม่สามารถรับรู้ สถานะรันไทม์ได้ และ เป็นการยากที่จะทำให้เกิด ปัญหาออนไลน์อีกครั้ง
ดังนั้น การตรวจสอบประสิทธิภาพ จึงเป็นรากฐานสำคัญของ "การทำงานปกติ" ของแอปพลิเคชัน Node.js ไม่เพียงแต่สามารถตรวจสอบตัวบ่งชี้รันไทม์ต่างๆ ได้ตลอดเวลา แต่ยังสามารถช่วยแก้ไขปัญหาสถานการณ์ที่ผิดปกติได้อีกด้วย
การตรวจสอบประสิทธิภาพสามารถแบ่งออกเป็นสองส่วน:
การรวบรวมและการแสดงตัวบ่งชี้ประสิทธิภาพ
การจับและการวิเคราะห์ข้อมูลประสิทธิภาพ
เช่น QPS, HTTP ที่ช้า, บันทึกลิงก์การประมวลผลทางธุรกิจ ฯลฯ
จากภาพด้านบน คุณจะเห็นข้อดีและข้อเสียของโซลูชันการตรวจสอบประสิทธิภาพ Node.js หลักสามโซลูชันในปัจจุบัน ต่อไปนี้เป็นคำแนะนำโดยย่อเกี่ยวกับองค์ประกอบของโซลูชันทั้งสามนี้:
Prometheus
AliNode
Alinode เป็นรันไทม์แบบขยายที่เข้ากันได้กับ nodejs อย่างเป็นทางการ โดยมีฟังก์ชันเพิ่มเติมบางอย่าง:
agenthub เป็นกระบวนการประจำถิ่นที่ใช้ในการรวบรวมตัวบ่งชี้ประสิทธิภาพ และรายงานพวกเขา
จะสร้างวงปิดจากการตรวจสอบ การแสดงผล สแน็ปช็อต และการวิเคราะห์ การเข้าถึงนั้นสะดวกและง่ายดาย แต่ยังคงมีความเสี่ยงเมื่อขยายรันไทม์
-Monitor
Node.js Addon เพื่อใช้งาน
เวลา CPU ของกระบวนการปัจจุบันสามารถรับได้ผ่าน process.cpuUsage()

ข้อมูลการจัดสรรหน่วยความจำของกระบวนการปัจจุบันสามารถรับได้ผ่าน process.memoryUsage() หน่วยของค่าที่ส่งคืนคือไบต์

ดังที่เห็นได้จากรูปด้านบน rss ประกอบด้วยส่วนของโค้ด ( Code Segment ) หน่วยความจำสแต็ก ( Stack ) และหน่วยความจำฮี Heap
สามารถรับข้อมูลการวิเคราะห์ของหน่วยความจำฮีป v8 และพื้นที่ฮีปผ่าน v8.getHeapStatistics() และ v8.getHeapSpaceStatistics() รูปต่อไปนี้แสดงการกระจายองค์ประกอบหน่วยความจำฮีปของ v8:

พื้นที่หน่วยความจำฮีปจะถูกแบ่งออกเป็นช่องว่างก่อน และพื้นที่จะถูกแบ่งออกเป็นหน้า หน่วยความจำจะถูกเพจตามการจัดตำแหน่ง 1MB
New Space: พื้นที่ยุคใหม่ใช้เพื่อเก็บข้อมูลอ็อบเจ็กต์บางส่วนที่มีวงจรชีวิตค่อนข้างสั้น แบ่งออกเป็น 2 ช่องว่าง (ประเภทพื้นที่คือ semi space ) from space to space
พื้นที่เก่า : พื้นที่รุ่นเก่าที่ใช้ในการจัดเก็บวัตถุที่ส่งเสริมโดย New Space
Code Space: เก็บโค้ดที่ปฏิบัติการได้ซึ่งคอมไพล์โดย v8 JIT
: เก็บวัตถุตัวชี้ของคลาสที่ซ่อนอยู่ซึ่งชี้โดย Object v8 ตามรันไทม์ โครงสร้างเค้าโครงวัตถุใช้เพื่อเข้าถึงสมาชิกของวัตถุอย่างรวดเร็ว
: ใช้เพื่อจัดเก็บวัตถุที่มีขนาดใหญ่กว่า 1MB ที่ไม่สามารถจัดสรรให้กับเพจได้
อัลกอริธึมการรวบรวมขยะของ
Mark-Sweep-Compact algorithm.Scavenge algorithm is used to recycle objects in the new generation
前提: New space分为from和to两个对象空间
触发时机:当New space空间满了
步骤:
在from space中,进行宽度优先遍历
发现存活(可达)对象
Old spaceto space中当复制结束时, to space中只有存活的对象, from space就被清空了
交换from space和to space ,开始下一轮Scavenge
适用于回收频繁,内存不大的对象,典型的空间换时间的策略,缺点是浪费了多一倍的空间

สามขั้นตอน: การทำเครื่องหมาย การล้าง และการจัดระเบียบ
เวลาทริกเกอร์: เมื่อ Old space เต็ม
ขั้นตอน:
การทำเครื่องหมาย (วิธีการทำเครื่องหมายสามสี)
marking queue (สแต็กที่ชัดเจน) และทำเครื่องหมายวัตถุเหล่านี้เป็นสีเทาpop วัตถุออกจาก marking queue และทำเครื่องหมายเป็นสีดำpush ไปยัง marking queueการกวาด
Compact
Old space เพื่อให้พื้นที่ว่างมีความต่อเนื่องและสมบูรณ์เมื่อ v8 ดำเนินการรวบรวมขยะในขั้นต้น จะต้องหยุดโปรแกรม สแกนฮีปทั้งหมด และเรียกคืนหน่วยความจำก่อนที่จะรันโปรแกรมอีกครั้ง พฤติกรรมนี้เรียกว่าการหยุดชั่วคราว ( Stop-The-World )
แม้ว่าวัตถุที่ใช้งานอยู่ในยุคใหม่จะมีขนาดเล็กและรีไซเคิลบ่อยครั้ง แต่การหยุดแบบเต็มมีผลกระทบเพียงเล็กน้อยเท่านั้น และการหยุดชั่วคราวที่เกิดจากการทำเครื่องหมาย การทำความสะอาด และการเรียงลำดับ ฯลฯ จะรุนแรงมากขึ้น
แนวคิดนี้เป็นเหมือนสถาปัตยกรรมไฟเบอร์ในเฟรมเวิร์ก React หลีกเลี่ยงความล่าช้าของแอปพลิเคชัน และปรับปรุงประสิทธิภาพของแอปพลิเคชัน
เนื่องจาก v8 มีขีดจำกัดเริ่มต้นของพื้นที่รุ่นใหม่และรุ่นเก่า
New space : 32M สำหรับระบบ 64 บิต และ 16M สำหรับระบบ 32 บิตOld space--max-semi-space-size New Space--max-old-space-sizenode
--max-old-space-size : Set the maximum value of Old Space spacenode also provides three ways to view GC logs:
--trace_gc : A line of log briefly describes the time, type, heap size changes and causes of each GC--trace_gc_verbose : แสดงแต่ละ V8 heap หลังจากแต่ละสถานะ GC โดยละเอียดของพื้นที่--trace_gc_nvp : ข้อมูลคู่คีย์-ค่ารายละเอียดของแต่ละ GC รวมถึงประเภท GC, เวลาหยุดชั่วคราว, การเปลี่ยนแปลงหน่วยความจำ ฯลฯเนื่องจากบันทึก GC ค่อนข้างดั้งเดิม
การประมวลผลรองคุณ
สามารถใช้.heapsnapshot
พัฒนาโดยทีม
สร้างขึ้นด้วยวิธีต่อไปนี้:
ใช้ heapdump

การใช้ฮีปโปรไฟล์ของ v8

v8.getHeapSnapshot()
จัดทำโดยโมดูล v8 ในตัวของ nodejs

v8.writeHeapSnapshot(fileName)

ใช้ v8-profiler-next

.heapsnapshot อัปโหลดในหน่วยความจำบนแถบเครื่องมือ Chrome Devtools และผลลัพธ์จะปรากฏดังที่แสดงด้านล่าง:

Shallow SizeRetained SizeRetained Size Shallow Size คือมุมมอง Summary
Retained Size
Comparison
Shallow Size ของวัตถุวิเคราะห์สแนปชอต Delta ปของสองช่วงเวลาที่แตกต่างกัน

ปช็อต ของ CPU ที่ใช้โปรแกรมซึ่งสามารถใช้ในการวิเคราะห์เวลาและสัดส่วน
.cpuprofile
นี่คือการรวบรวมตัวอย่างโปรไฟล์ CPU 5 นาที

ไฟล์ .cpuprofile ที่สร้างขึ้น Javascript Profiler

มุมมอง Self Time ต้น Total Time มุม Heavy
Total TimeSelf TimeSelf Time Total Time
น
ระบบจะ
ulimit -c unlimited.core
.core
node --abort-on-uncaught-exception ไฟล์หลักเมื่อมีข้อยกเว้นที่ไม่ถูกต้องเกิดขึ้นในแอปพลิgcore <pid>ทำได้ผ่านเครื่องมือเช่น MDB, GDB, LLDB และ
llnode `which node` -c /path/to/core/dump
สามารถสังเกตได้จากการตรวจสอบว่าหน่วยความจำฮีปยังคงเพิ่มขึ้นอย่างต่อเนื่องดังนั้นจึงจำเป็นต้องใช้สแน็ปช็อตฮีปสำหรับการแก้ไขปัญหา

จากข้อมูลของ heapsnapshot เราสามารถวิเคราะห์และค้นหาว่ามีวัตถุ newThing ที่รักษาหน่วยความจำที่ค่อนข้างใหญ่อยู่

unused theThing newThing
เกิด
replaceThing
ไม่ได้รีไซเคิลโดยอัตโนมัติคุณต้องรีไซเคิลด้วยตนเองเช่นการตั้งค่าวัตถุด้วยตนเองเป็น null ลบตัวจับเวลาผู้ฟังเหตุการณ์ที่ไม่ได้ผูกมัด ฯลฯ
บทความนี้
ประการแรกมันแนะนำปัญหาที่แก้ไขโดยการตรวจสอบประสิทธิภาพส่วนประกอบและการเปรียบเทียบข้อดีและข้อเสียของโซลูชันหลัก
จากนั้นสองส่วนที่สำคัญของตัวบ่งชี้ประสิทธิภาพและเครื่องมือสแน็ปช็อตได้รับการแนะนำในราย
ชน
ฉันหวังว่าบทความนี้จะช่วยให้ทุกคนเข้าใจระบบการตรวจสอบประสิทธิภาพของ Node.js ทั้งหมด