โหนดซึ่งเป็นรันไทม์สำหรับ 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 space
to 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-size
node
--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 Size
Retained Size
Retained Size
Shallow Size
คือมุมมอง Summary
Retained Size
Comparison
Shallow Size
ของวัตถุวิเคราะห์สแนปชอต Delta
ปของสองช่วงเวลาที่แตกต่างกัน
ปช็อต ของ CPU ที่ใช้โปรแกรมซึ่งสามารถใช้ในการวิเคราะห์เวลาและสัดส่วน
.cpuprofile
นี่คือการรวบรวมตัวอย่างโปรไฟล์ CPU 5 นาที
ไฟล์ .cpuprofile
ที่สร้างขึ้น Javascript Profiler
มุมมอง Self Time
ต้น Total Time
มุม Heavy
Total Time
Self Time
Self 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 ทั้งหมด