Mengapa anda memerlukan pemantauan prestasi? Artikel ini akan membawa anda melalui pemantauan prestasi Node.js Saya harap ia akan membantu anda!
Nod berfungsi sebagai masa jalan untuk Javascript pada bahagian pelayan. Ia sangat memperkayakan senario aplikasi Javascript.
Tetapi Node.js Runtime itu sendiri ialah kotak hitam Kami tidak dapat melihat status masa jalan dan ia juga sukar untuk menghasilkan semula masalah dalam talian.
Oleh itu Pemantauan prestasi ialah asas "operasi biasa" aplikasi Node.js. Bukan sahaja pelbagai penunjuk masa jalan boleh dipantau pada bila-bila masa, tetapi ia juga boleh membantu menyelesaikan masalah senario yang tidak normal.
Pemantauan prestasi boleh dibahagikan kepada dua bahagian:
Pengumpulan dan paparan penunjuk prestasi
Tangkap dan analisis data prestasi
Daripada rajah di atas, anda boleh melihat kelebihan dan kekurangan tiga penyelesaian pemantauan prestasi arus perdana Node.js Berikut ialah pengenalan ringkas kepada komposisi ketiga-tiga penyelesaian ini:
Prometheus
AliNode
alinode ialah masa jalan lanjutan yang serasi dengan nodej rasmi, menyediakan beberapa ciri tambahan:
agenthub ialah proses pemastautin yang digunakan untuk mengumpul penunjuk prestasi dan melaporkan
Seluruh sistem membentuk gelung tertutup daripada pemantauan, paparan, syot kilat dan analisis Aksesnya mudah dan ringkas, tetapi masih terdapat risiko apabila mengembangkan masa jalan
Node.js Addon
untuk melaksanakan pensampel Lulusprocess.cpuUsage()
Anda boleh mendapatkan data penggunaan masa CPU bagi proses semasa Unit nilai pulangan ialah mikrosaat
anda boleh mendapatkan data peruntukan memori proses semasa, dan unit nilai pulangan ialah bait process.memoryUsage()
Seperti yang dapat dilihat daripada gambar di atas, rss
termasuk segmen kod (Code Segment
), memori tindanan (Stack
), ingatan timbunan (Heap
)
Anda boleh mendapatkan data analisis memori timbunan v8 dan ruang timbunan melalui v8.getHeapStatistics()
dan v8.getHeapSpaceStatistics()
Rajah berikut menunjukkan taburan komposisi ingatan timbunan v8:
.
Ruang memori timbunan mula-mula dibahagikan kepada ruang, dan ruang dibahagikan kepada halaman Memori dihalakan mengikut penjajaran 1MB.
Ruang Baharu: Ruang generasi baharu, digunakan untuk menyimpan beberapa data objek dengan kitaran hayat yang agak singkat, dibahagikan kepada dua ruang (jenis ruang ialah semi space
): from space
, to space
Ruang Lama: Ruang generasi lama, digunakan untuk penyimpananNew Space
Dipromosikan Objek
Ruang Kod: Menyimpan kod boleh laku tersusun JIT v8
Ruang Peta: Menyimpan kelas tersembunyi yang ditunjuk oleh Objek Objek penunjuk, penunjuk kelas tersembunyi ialah struktur susun atur objek yang direkodkan oleh v8 semasa runtime, digunakan untuk akses pantas kepada ahli objek
Ruang Objek Besar: digunakan untuk menyimpan objek yang lebih besar daripada 1MB yang tidak boleh diperuntukkan Halaman objek
Algoritma kutipan sampah v8 dibahagikan kepada dua kategori:
Mark-Sweep-Compact
algoritma digunakan untuk kitar semula objek dalam generasi lamaScavenge
digunakan untuk kitar semula objek dalam generasi baharuPremise: New space
dibahagikan kepada dua ruang objek: from
dan to
Masa pencetus: apabila ruang New space
Langkah
Penuh:
Dalam from space
, lakukan lintasan lebar-pertama
untuk mencari Objek bertahan (boleh dicapai)
Old space
to space
Apabila penyalinan tamat, terdapat hanya objek yang masih hidup dalam to space
, dan from space
dikosongkan
bertukar from space
dan to space
untuk memulakan Roda seterusnyaScavenge
sesuai untuk objek dengan kitar semula yang kerap dan memori kecil. 🎜>
ruang sudah penuhOld space
marking queue
marking queue
dan ditanda hitam pop
push
, dan seterusnya marking queue
Old space
jadi. bahawa ruang kosong adalah berterusan dan lengkap Apabila v8 memulakan kutipan sampah, ia perlu hentikan program dan imbas keseluruhan timbunan Program tidak akan dijalankan semula sehingga memori dituntut semula. Tingkah laku ini dipanggil jeda penuh (Stop-The-World
)
Walaupun objek aktif generasi baharu adalah kecil dan kerap dikitar semula, jeda penuh mempunyai sedikit kesan, tetapi objek yang masih hidup generasi lama adalah banyak dan besar, menandakan, pembersihan, dan pengisihan Jeda yang terhasil akan menjadi lebih serius.
Konsep ini sebenarnya sedikit seperti seni bina Fiber dalam rangka kerja React Hanya semasa masa lapang penyemak imbas ia akan melintasi Pokok Fiber untuk melaksanakan tugas yang sepadan menjejaskan utas utama sesedikit mungkin, mengelakkan ketinggalan aplikasi dan meningkatkan prestasi aplikasi.
Disebabkan oleh had ruang lalai v8 untuk generasi lama dan baharu Saiz
New space
Had lalai: 32M untuk sistem 64-bit, 16M untuk sistem 32-bit Old space
Had lalai: 1400M untuk sistem 64-bit, 1400M untuk 32-bit sistem 700M Oleh itu, node
menyediakan dua parameter untuk melaraskan had ruang atas generasi baharu dan lama
--max-semi-space-size
: Tetapkan nilai maksimum New Space
ruang. --max-old-space-size
: Tetapkan nilai maksimum Old Space
ruang node
juga menyediakan tiga jenis Cara melihat log GC:
--trace_gc
: Satu baris log menerangkan secara ringkas masa, jenis, perubahan saiz timbunan dan punca setiap GC --trace_gc_verbose
: Memaparkan setiap status terperinci GC bagi setiap ruang timbunan V8 selepas GC --trace_gc_nvp
: Maklumat pasangan nilai kunci terperinci bagi setiap GC, termasuk jenis GC, masa jeda, perubahan memori, dsb. Memandangkan log GC agak primitif dan memerlukan pemprosesan sekunder, anda boleh menggunakan v8-gc-log-parser
heap memory program yang sedang berjalan, yang boleh digunakan untuk menganalisis penggunaan memori dan perubahan.
: .heapsnapshot
v8.getHeapSnapshot()
v8.writeHeapSnapshot(fileName)
boleh ditemui dalam Memori bar alat Chrome devtools Selepas memilih untuk memuat naik, hasil paparan adalah seperti yang ditunjukkan di bawah: .heapsnapshot
.
Paparan lalai ialah paparan Summary
Di sini kita perlu memberi perhatian kepada dua lajur paling kanan: Shallow Size
dan Retained Size
Shallow Size
: menunjukkan bahawa objek itu sendiri. berada dalam memori timbunan v8 Saiz yang diperuntukkan Retained Size
: mewakili jumlah Shallow Size
semua objek rujukan objek Apabila didapati bahawa Retained Size
adalah sangat besar, mungkin terdapat kebocoran memori di dalam objek , boleh dikembangkan lagi untuk mengesan masalah
dan paparan Comparison
digunakan untuk membandingkan dan menganalisis petikan timbunan dua tempoh yang berbeza 🎜> lajur boleh digunakan untuk menapis objek dengan perubahan memori terbesar Delta
CPU program yang sedang berjalan boleh digunakan untuk menganalisis penggunaan masa dan bahagian CPU
fail: .cpuprofile
yang dijana boleh dipaparkan dalam .cpuprofile
pada bar alat Chrome devtools (ia bukan dalam tab lalai, anda perlu untuk membukanya dalam Lagi di sebelah kanan bar alat). Selepas memilih untuk memuat naik fail, hasil paparan adalah seperti berikut: Javascript Profiler
lihat, di sini kita lihat terdapat dua lajur: Heavy
dan Self Time
Total Time
Self Time
Total Time
Apabila sisihan antara > dan Total Time
besar, fungsi mungkin memerlukan lebih banyak CPU -pengiraan intensif, dan penentududukan dan penyelesaian masalah selanjutnya juga boleh dijalankan Self Time
: .core
ulimit -c unlimited
node --abort-on-uncaught-exception
gcore <pid></pid>
Akhirnya, anda boleh menggunakan mdb, gdb , lldb dan alatan lain untuk menganalisis dan mendiagnosis punca ranap proses sebenar.core
llnode `which node` -c /path/to/core/dump
, kita boleh menganalisis dan menyemak sama ada terdapat objek heapsnapshot
yang sentiasa mengekalkan memori yang agak besar newThing
tidak dipanggil, objek unused
dirujuk daripada newThing
, menyebabkan ia kekal Wujud dalam konteks pelaksanaan theThing
fungsi ini dan belum dikeluarkan Ini adalah kes kebocoran memori biasa yang disebabkan oleh penutupan replaceThing
Jadi dalam Dalam situasi di atas, anda mesti mempertimbangkan dengan teliti sama ada objek akan dikitar semula secara automatik dalam ingatan Jika ia tidak akan dikitar semula secara automatik, anda perlu mengitar semulanya secara manual, seperti menetapkan objek secara manual kepada null
, mengeluarkan pemasa dan menyahikat. ia. Pemantauan acara, dsb.
Setakat ini, artikel ini telah memberikan pengenalan terperinci kepada keseluruhan sistem pemantauan prestasi Node.js.
Pertama sekali, ia memperkenalkan masalah yang diselesaikan dengan pemantauan prestasi, komponennya dan perbandingan kebaikan dan keburukan penyelesaian arus perdana.
Kemudian, dua penunjuk prestasi utama dan alat syot kilat diperkenalkan secara terperinci
Akhir sekali, hasilkan semula proses mudah daripada pemerhatian , analisis dan penyelesaian masalah kes kebocoran memori, dan meringkaskan situasi dan penyelesaian kebocoran memori biasa.
Saya harap artikel ini dapat membantu semua orang memahami keseluruhan sistem pemantauan prestasi Node.js.
Untuk lebih banyak pengetahuan berkaitan nod, sila lawati: tutorial nodejs!
Atas ialah kandungan terperinci Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!