Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

青灯夜游
Lepaskan: 2022-08-11 20:14:27
ke hadapan
2203 orang telah melayarinya

Mengapa anda memerlukan pemantauan prestasi? Artikel ini akan membawa anda melalui pemantauan prestasi Node.js Saya harap ia akan membantu anda!

Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

Mengapa pemantauan prestasi diperlukan

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.

Komponen

Pemantauan prestasi boleh dibahagikan kepada dua bahagian:

  • Pengumpulan dan paparan penunjuk prestasi

    • Data peringkat proses: CPU, Memori, Heap, GC, dll.
    • Data peringkat sistem: penghunian cakera, beban I/O, status sambungan TCP/UDP, dsb.
    • Data lapisan aplikasi: QPS, HTTP perlahan, log pautan pemprosesan perniagaan, dsb.
  • Tangkap dan analisis data prestasi

    • Heapsnapshot : Timbunan petikan memori
    • Cpuprofile: CPU snapshot
    • Coredump: Aplikasi ranap petikan

Perbandingan skema

Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

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

    • prom-client ialah pelaksanaan nodejs prometheus, digunakan untuk mengumpul penunjuk prestasi
    • grafana ialah Platform visualisasi yang digunakan untuk memaparkan pelbagai carta data dan menyokong akses kepada prometheus
    • Hanya menyokong pengumpulan dan paparan penunjuk prestasi lain diperlukan untuk menyelesaikan masalah untuk membentuk gelung tertutup
  • AliNode

    • alinode ialah masa jalan lanjutan yang serasi dengan nodej rasmi, menyediakan beberapa ciri tambahan:

      • Pemantauan status memori masa jalan v8
      • pemantauan status masa jalan libuv
      • Fungsi diagnosis kesalahan dalam talian: petikan timbunan, Profil CPU, Surih GC, dll.
    • 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

  • Easy-Monitor

    • xprofiler bertanggungjawab untuk pensampelan status masa jalanan masa nyata dan log prestasi output (iaitu, Pengambilan data prestasi)
    • xtransit bertanggungjawab untuk pengumpulan dan penghantaran log prestasi
    • Perbezaan terbesar daripada AliNode ialah penggunaan Node.js Addon untuk melaksanakan pensampel

Metrik Prestasi

CPU

Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

Lulusprocess.cpuUsage() Anda boleh mendapatkan data penggunaan masa CPU bagi proses semasa Unit nilai pulangan ialah mikrosaat

  • pengguna: masa CPU yang digunakan oleh. proses sendiri semasa pelaksanaan
  • sistem: penggunaan sistem apabila proses dijalankan

Memori

Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

Melalui

anda boleh mendapatkan data peruntukan memori proses semasa, dan unit nilai pulangan ialah bait process.memoryUsage()

    rss: memori pemastautin, jumlah saiz memori yang diperuntukkan oleh nod proses
  • Jumlah timbunan: saiz memori timbunan yang digunakan oleh v8
  • Timbunan Digunakan: v8 telah digunakan Saiz memori Timbunan
  • luaran: saiz memori yang diduduki oleh C diuruskan oleh v8
  • arrayBuffers: saiz memori diperuntukkan kepada ArrayBuffer

Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

Seperti yang dapat dilihat daripada gambar di atas, rss termasuk segmen kod (Code Segment), memori tindanan (Stack), ingatan timbunan (Heap)

  • Segmen Kod : storan Coretan kod
  • Timbunan: menyimpan pembolehubah setempat dan mengurus panggilan fungsi
  • Timbunan: menyimpan objek, penutupan atau segala-galanya

Timbunan

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:

Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js.

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

    • Syarat promosi: Bertahan selepas dua GC di ruang Baharu
  • Ruang Lama: Ruang generasi lama, digunakan untuk penyimpananNew SpaceDipromosikan 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

GC

Algoritma kutipan sampah v8 dibahagikan kepada dua kategori:

  • GC Utama: Mark-Sweep-Compact algoritma digunakan untuk kitar semula objek dalam generasi lama
  • Minor GC: Algoritma Scavenge digunakan untuk kitar semula objek dalam generasi baharu

Scavenge

Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

Premise: 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)

    • telah bertahan sekali (mengalami Scavange) dan dinaikkan pangkat kepada Old space
    • yang lain disalin ke 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. 🎜>

Mark-Sweep-Compact

Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

Tiga langkah: tanda, jelas, atur

Masa pencetus : Apabila

ruang sudah penuhOld space

Langkah:

  • Menanda (kaedah penandaan tiga warna)

      Putih: mewakili kitar semula objek
    • Hitam: mewakili objek yang tidak boleh dikitar semula, dan semua rujukan yang dijana olehnya telah diimbas
    • Kelabu: mewakili objek yang tidak boleh dikitar semula, dan rujukan yang dijana olehnya belum diimbas lagi
    • Letakkan objek yang dirujuk terus oleh objek akar V8 ke dalam
    • (tindanan eksplisit), dan tandakan objek ini sebagai kelabu marking queue
    • Mulakan dari objek ini dan lakukan traversal mendalam-pertama. Setiap kali objek diakses, Objek itu keluar daripada
    • marking queue dan ditanda hitam pop
    • dan kemudian semua objek putih di bawah rujukan objek itu ditanda kelabu,
    • ke push, dan seterusnya marking queue
    • Sehingga semua objek pada timbunan muncul, hanya terdapat dua jenis objek dalam generasi lama: hitam (tidak boleh dikitar semula) dan putih (boleh dikitar semula)
    • PS: Apabila objek terlalu besar dan tidak boleh ditolak ke Apabila ruang tindanan terhad, v8 akan mengekalkan objek dalam warna kelabu dan melangkaunya, menandakan keseluruhan tindanan sebagai melimpah Selepas tindanan dikosongkan, ia akan melintasi tanda itu semula akan memerlukan imbasan tambahan bagi timbunan
  • Sapu

      Mengosongkan objek putih
    • akan menyebabkan ruang ingatan tidak berterusan
  • Padat

    • Memandangkan Sweep akan menyebabkan ruang ingatan tidak berterusan, ia tidak sesuai untuk objek baharu memasuki GC
    • Gerakkan objek hitam (survival) ke satu hujung Old space jadi. bahawa ruang kosong adalah berterusan dan lengkap
    • Walaupun ia dapat menyelesaikan masalah pemecahan memori, ia akan meningkatkan masa jeda (kelajuan pelaksanaan perlahan)
    • Gunakan mark-compact hanya apabila tidak mencukupi. ruang untuk memperuntukkan objek yang dipromosikan daripada generasi baharu

Stop-The-World

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.

Strategi pengoptimuman

  • Pemarkahan Bertambah: Dalam fasa Penandaan, apabila timbunan mencapai saiz tertentu, GC tambahan bermula, setiap peruntukan Selepas jumlah tertentu ingatan diperoleh, program dijeda, penandaan dilakukan selama beberapa milisaat hingga berpuluh-puluh milisaat, dan kemudian program disambung semula.

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.

  • Penyapuan Serentak: Biarkan utas lain melakukan penyapuan pada masa yang sama tanpa perlu risau tentang konflik dengan utas utama yang melaksanakan program
  • Penyapuan Selari: Biarkan berbilang utas Penyapuan berfungsi pada masa yang sama , meningkatkan daya pemprosesan menyapu dan memendekkan keseluruhan kitaran GC

Pelarasan ruang

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

Lihat log GC

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

alat syot kilat

Heapsnapshot

Persampelan syot kilat

heap memory program yang sedang berjalan, yang boleh digunakan untuk menganalisis penggunaan memori dan perubahan.

kaedah penjanaan

Terdapat beberapa cara untuk menjana fail

: .heapsnapshot

  • Gunakan

    heapdump

Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

  • Gunakan

    profil timbunan v8

Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

  • Gunakan api yang disediakan oleh modul v8 terbina dalam nodej

    • v8.getHeapSnapshot()

    1Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

    • v8.writeHeapSnapshot(fileName)

    1Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

  • Gunakan

    v8-profiler-next

1Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

Kaedah analisis

Yang dijana Fail

boleh ditemui dalam Memori bar alat Chrome devtools Selepas memilih untuk memuat naik, hasil paparan adalah seperti yang ditunjukkan di bawah: .heapsnapshot

1Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js.

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

1Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

Cpuprofile

Persampelan syot kilat

CPU program yang sedang berjalan boleh digunakan untuk menganalisis penggunaan masa dan bahagian CPU

Kaedah penjanaan

Terdapat beberapa cara untuk menjana

fail: .cpuprofile

Ini ialah sampel Profil CPU selama 5 minit

Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

Kaedah analisis

Fail

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

Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

Paparan lalai ialah

lihat, di sini kita lihat terdapat dua lajur: Heavy dan Self TimeTotal Time

  • : mewakili Masa pelaksanaan fungsi ini sendiri (tidak termasuk panggilan lain) Self Time
  • : mewakili jumlah masa pelaksanaan fungsi ini (termasuk fungsi panggilan lain) Total Time
apabila ditemui

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

Codedump

Apabila aplikasi ranap dan tamat tanpa diduga, sistem akan merekodkan maklumat peruntukan memori secara automatik pada masa ini proses ranap, Pembilang Program dan penuding tindanan dan maklumat penting lain untuk menjana fail teras

Kaedah penjanaan

Tiga cara untuk menjana fail

: .core

  • Hidupkan sekatan kernelulimit -c unlimited
  • Tambah parameter ini pada permulaan nod untuk mengelakkan ralat tidak ditangkap dalam aplikasi Fail teras juga boleh dijana sekiranya berlaku pengecualian node --abort-on-uncaught-exception
  • Menjana fail teras secara manualgcore <pid></pid>

Kaedah analisis

Dapatkan fail

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

Analisis kes

Pemerhatian

Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

Ia boleh diperhatikan daripada pemantauan bahawa ingatan timbunan terus meningkat, jadi syot kilat timbunan diperlukan untuk menyelesaikan masalah

Analisis

1Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

Menurut

, kita boleh menganalisis dan menyemak sama ada terdapat objek heapsnapshot yang sentiasa mengekalkan memori yang agak besar newThing

Menyelesaikan masalah

Mengapa anda memerlukan pemantauan prestasi? Mari bercakap tentang pemantauan prestasi Node.js

Anda boleh melihat daripada kod bahawa walaupun kaedah

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

RingkasanMemori biasa Kebocoran berlaku dalam situasi berikut:

  • Pembolehubah global
  • Penutupan
  • Pemasa
  • Pendengar acara
  • Cache

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.

Ringkasan

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

  • Penunjuk prestasi tertumpu terutamanya pada penunjuk CPU, memori, ruang timbunan dan GC, dan diperkenalkan. pada masa yang sama. Dengan strategi GC v8 dan rancangan pengoptimuman GC,
  • alat syot kilat terutamanya termasuk syot kilat timbunan, syot kilat CPU dan Coredump apabila ranap

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!

Label berkaitan:
sumber:juejin.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!