PM2: mendekati masalah manajemen proses dengan bijak

Hanya beberapa jam yang lalu, saya memulai perdebatan tentang fakta bahwa Node.JS terlalu lambat untuk proyek-proyek besar dan seharusnya lebih suka Golang, Rust, PHP, dll. Argumen utama dari sisi yang berlawanan dalam perselisihan ini adalah fakta bahwa JavaScript adalah single-threaded. Diduga, ketika mengembangkan aplikasi, kinerja hanya bertumpu pada single-threadedness ini dan tidak ada yang bisa dilakukan lagi - hanya menulis ulang dalam beberapa bahasa lain. Namun, hal-hal sedikit lebih baik dengan NodeJS daripada yang terlihat pada pandangan pertama. Sebelum kita membahas topik ini, saya ingin menyatakan bahwa saya menghormati hak setiap pengembang untuk menggunakan bahasa pemrograman yang ia sukai dan yang menurutnya lebih disukai dalam tugas tertentu.

Setelah melakukan pencarian dengan kata kunci "PM2" di Habr, saya tidak menemukan artikel yang ditujukan untuk manajer proses ini. Hanya satu referensi dalam artikel pengguna lain. Saya menjadi bersemangat (sangat diceritakan) dengan gagasan untuk mengejar dan menjelaskan sudut gelap pengembangan backend di Node.JS (yang banyak orang tahu, ya, saya sadar). Saya meminta semua orang tertarik pada kucing.



Beberapa kata tentang PM2 itu sendiri



PM2 adalah manajer proses sumber terbuka yang dilisensikan di bawah lisensi AGPL-3.0. Pada saat penulisan, ini memiliki ~ 350k unduhan mingguan, menurut NPM. Ini terutama digunakan dalam lingkungan di mana Anda perlu menjalankan aplikasi pada NodeJS dan melupakannya (Anda juga dapat menggunakannya dengan bahasa lain, tetapi lebih lanjut tentang itu nanti), yang memungkinkan Anda untuk mengelompokkan aplikasi dan secara fleksibel mendistribusikan beban antara inti prosesor. Kliping kecil dari repositori PM2 di GitHub :

PM2 adalah manajer proses produksi untuk aplikasi Node.js dengan penyeimbang beban bawaan. Ini memungkinkan Anda untuk menjaga aplikasi tetap hidup selamanya, memuatnya kembali tanpa downtime dan untuk memudahkan tugas-tugas admin sistem umum.


Ketika berkembang, banyak pendatang baru menghadapi masalah ketika, setelah "meluncurkan" aplikasi ke server produksi, mereka tidak tahu bagaimana meluncurkannya "selamanya". Mereka menulis set NODE_ENV=production && node app.js di konsol SSH, semuanya baik-baik saja, aplikasi berfungsi. Tutup konsol dan aplikasi tidak lagi berfungsi. Pertanyaan StackOverflow - Bagaimana menjalankan aplikasi node.js secara permanen? mencetak lebih dari 237 ribu tampilan sepanjang masa.

PM2 memecahkan masalah ini dengan satu perintah:

 pm2 start app.js 


Perintah ini "mendemonstrasikan" (dari bahasa Inggris "daemonize") proses NodeJS, memantau konsumsi memorinya dan mempertimbangkan beban prosesor.

Kembali ke domba jantan kita



Ketika beban pada backend bertambah, menjadi perlu untuk menskalakannya - baik vertikal maupun horizontal - kepada siapa ia lebih nyaman dalam situasi tersebut. Seperti yang kita ketahui, satu proses dapat menggunakan beberapa inti prosesor, tetapi hanya jika ada beberapa untaian di dalam proses. Dalam aplikasi NodeJS, alirannya adalah satu. PM2 dapat membantu dalam situasi ini dan mendistribusikan beban antara beberapa inti prosesor. Masih hanya dengan satu perintah:

 pm2 start app.js -i max 


Dalam hal ini, parameter maks sesuai dengan jumlah inti prosesor. Yaitu 8 proses terpisah akan dibuat untuk prosesor 8-core. Anda juga dapat mengatur -1 bukannya max, dan kemudian jumlah proses akan sesuai dengan jumlah core minus 1 . Semua pesona adalah bahwa koneksi HTTP (S) / Websocket / TCP / UDP akan didistribusikan secara merata di antara proses-proses ini. Mengapa tidak penskalaan horizontal? Anda dapat membaca lebih lanjut tentang pengelompokan di PM2 di sini - Mode Cluster PM2 .

cluster_mode

Anda dapat menjalankan sebanyak mungkin proses sesuai keinginan, tetapi tetap disarankan untuk mematuhi rekomendasi "satu proses per inti".

Menghormati memori


Ketika berkembang di PHP, saya pernah mengalami masalah. Karena tidak berpengalaman, ia secara tidak sadar meletakkan bug di mesin sistem, karena itu, dalam kondisi tertentu, proses mulai memakan terlalu banyak RAM. Selain itu, prosesor dimuat, karena itu mesin virtual baru saja menutup dan saya tidak memiliki akses sama sekali.
Seperti yang diketahui pengembang PHP, di PHP-FPM Anda dapat menentukan jenis distribusi proses (jika Anda tiba-tiba tidak tahu, maka dalam PHP-FPM proses baru dibuat untuk setiap permintaan baru) - statis, ketika ambang minimum dan maksimum ditetapkan, dan dinamis - alokasi berapa banyak sebanyak proses besar yang diperlukan. Apa yang akan terjadi pada PM2 jika Anda memulai 8 proses dan semuanya mulai memakan banyak memori? Dan PM2 dapat menyelesaikan masalah ini - hanya dengan satu parameter pada baris perintah:

 # Set memory threshold for app reload pm2 start app.js -i max --max-memory-restart <200MB> 


Setiap kali batas memori tercapai, PM2 akan secara otomatis memulai kembali proses. Mendistribusikan memori lebih mudah daripada proses, bukan? 8 proses * 200 megabita = 1,6 gigabita. Matematika kelas dua.

Selain memulai kembali proses, Anda juga dapat mengonfigurasi memulai kembali setelah interval waktu N. Saya belum menemukan dalam kasus mana ini bisa berguna, tetapi jangan ragu untuk menunjukkan kepada saya beberapa contoh di komentar :)

Dan jika saya me-reboot mesin virtual?


Kejutan-kejutan! PM2 juga memecahkan masalah ini untuk Anda. Masih dengan tidak lebih dari satu perintah tunggal di konsol:

 pm2 startup 


PM2 akan menghasilkan skrip yang akan meningkatkan semua proses yang diperlukan ketika sistem operasi dimulai. Namun, Anda harus waspada - ketika meningkatkan versi Node.JS semuanya bisa rusak. Untuk menghindari ini, setelah memutakhirkan ke versi baru Node.JS berhasil, jalankan pm2 unstartup dan pm2 startup . Anda dapat membaca lebih lanjut tentang ini di tautan - PM2 Startup Script Generator .

Apakah perlu untuk memulai kembali kluster secara manual saat membuat perubahan?


Tentu tidak! Ya, lebih tepatnya, Anda, tentu saja, dapat memulai ulang aplikasi secara manual, tetapi mengapa? Otomatisasi semua yang Anda bisa dan semoga kekuatan datang bersama Anda!

 pm2 start env.js --watch --ignore-watch="node_modules" 


Anda bisa menggunakan ini saat menggabungkan cabang master dalam repositori lokal dengan cabang master dari repositori jarak jauh. Dalam proyek sampingan saya, ini dilakukan secara sederhana - git pull origin master && npm run build . Saat mengubah file di server / build dan folder klien / build , proses akan dimulai kembali secara otomatis. Saya mengerti ini adalah fitur yang sangat sederhana dan bahkan tidak layak disebutkan dalam teks ini. Saya akan mencairkannya dengan sesuatu yang serius dan menulis bahwa jika Anda menggunakan pengelompokan, maka semua proses akan dimulai kembali secara bergantian. Ya, sehingga setidaknya satu dari mereka akan selalu tersedia. Ini adalah penerapan zero-downtime!

Dan Anda tidak dapat memulai kembali proses. Ada reload untuk ini (mirip dengan nginx reload):

 pm2 reload all 


Terlalu banyak tim! Secara umum, saya lebih suka konfigurasi


Saya sudah bosan membuat frasa lucu, jadi sederhana dan dangkal: ada file ekosistem. Format yang didukung adalah JSON, YAML dan JS. Misalnya, ketika Anda perlu memonitor file di folder server dan klien :

 module.exports = { apps: [{ script: "app.js", watch: ["server", "client"], env_production : { "NODE_ENV": "production" } }] } 


Untuk informasi lebih lanjut, lihat tautan - Deklarasi Aplikasi PM2 .

Dan bahkan pemantauan!


Dan bukan satu. Pilih yang paling Anda sukai. Anda dapat memonitor di konsol dengan perintah:

 pm2 monit 




Atau gunakan versi pemantauan berbasis web lengkap:



Anda, tentu saja, tidak akan mempercayai saya, tetapi itu diinstal dan diluncurkan dengan satu perintah:

 pm2 plus 


Dan masih banyak lagi ...


Menyatakan dukungan untuk Heroku dan Docker, peningkatan port otomatis dengan kemampuan transfer ke process.env (ketika Anda perlu menjalankan setiap proses pada port terpisah), peluncuran beberapa instance PM2 dalam OS yang sama, kehadiran API perangkat lunak dan kemampuan untuk menjalankan skrip Bash dan Python yang di-iblis!

Saya mungkin melewatkan sesuatu yang penting atau menarik, yang selalu dapat Anda ingatkan dalam komentar. Saya harap Anda dapat mempelajari sesuatu yang baru dari artikel ini.

Source: https://habr.com/ru/post/id480670/


All Articles