PM2: تناول مسألة إدارة العمليات بحكمة

منذ ساعتين فقط ، بدأت نقاشًا حول حقيقة أن Node.JS بطيء جدًا بالنسبة للمشروعات الكبيرة وينبغي أن يفضل Golang و Rust و PHP وما إلى ذلك. كانت الحجة الرئيسية للجانب الآخر في هذا النزاع هي أن جافا سكريبت مترابطة. يُزعم ، عند تطوير تطبيق ما ، أن الأداء ببساطة يتعارض مع هذا الترابط الفردي ولا يمكن فعل أي شيء بعد ذلك - فقط أعد كتابته بلغة أخرى. ومع ذلك ، فإن الأمور أفضل قليلاً مع NodeJS مما يبدو للوهلة الأولى. قبل الخوض في هذا الموضوع ، أريد أن أعلن أنني أحترم حق كل مطور في استخدام لغة البرمجة التي يحبها والتي يعتبرها مفضلة في مهمة معينة.

بعد البحث عن الكلمة الرئيسية "PM2" على هبر ، لم أجد أي مقالة مخصصة لمدير العمليات هذا. مراجع واحدة فقط في مقالات المستخدمين الآخرين. أصبحت متحمسًا (أخبرني بقوة) بفكرة اللحاق بالركب وإلقاء الضوء على هذه الزاوية المظلمة من التطور الخلفي على Node.JS (الذي يعرفه الكثير من الناس ، نعم ، أنا على علم بذلك). أطلب من جميع المهتمين تحت القط.



بضع كلمات عن PM2 نفسها



PM2 هو مدير عملية مفتوحة المصدر مرخص بموجب ترخيص AGPL-3.0. في وقت كتابة هذا التقرير ، يحتوي البرنامج على حوالي 350 ألف تنزيل أسبوعيًا ، وفقًا لـ NPM. يستخدم بشكل أساسي في البيئات التي تحتاج فيها إلى تشغيل تطبيق على NodeJS ونسيانه (يمكنك أيضًا استخدامه مع لغات أخرى ، ولكن المزيد حول ذلك لاحقًا) ، مما يتيح لك تجميع التطبيق وتوزيع الحمل بشكل مرن بين مراكز المعالج. لقطة صغيرة من مستودع PM2 على جيثب :

PM2 هو مدير عملية الإنتاج لتطبيقات Node.js مع موازن تحميل مضمن. يسمح لك بإبقاء التطبيقات حية إلى الأبد ، وإعادة تحميلها دون توقف وتسهيل مهام مسؤول النظام الشائعة.


عند التطوير ، يواجه العديد من القادمين الجدد مشكلة عندما ، بعد "بدء التطبيق" على خادم الإنتاج ، لا يعرفون كيفية تشغيله "إلى الأبد". يكتبون set NODE_ENV=production && node app.js في وحدة التحكم SSH ، كل شيء على ما يرام ، ويعمل التطبيق. أغلق وحدة التحكم والتطبيق لم يعد يعمل. سؤال StackOverflow - كيفية تشغيل تطبيق node.js نهائيًا؟ سجل أكثر من 237 ألف مرة طوال الوقت.

PM2 يحل هذه المشكلة بأمر واحد:

 pm2 start app.js 


هذا الأمر "شيطاني" (من الإنجليزية "daemonize") عملية NodeJS ، يراقب استهلاك الذاكرة وينظر في تحميل المعالج.

العودة إلى الكباش لدينا



مع تزايد الحمل على الواجهة الخلفية ، يصبح من الضروري توسيع نطاقه - الرأسي والأفقي - لمن يكون أكثر ملاءمة في هذه الظروف. كما نعلم ، يمكن أن تستخدم إحدى العمليات عدة نوى للمعالجات ، ولكن فقط في حالة وجود العديد من مؤشرات الترابط داخل العملية. في تطبيقات NodeJS ، يكون التدفق واحدًا. PM2 قادر على المساعدة في هذا الموقف وتوزيع الحمل بين عدة نوى المعالج. لا يزال مع أمر واحد فقط:

 pm2 start app.js -i max 


في هذه الحالة ، تتوافق المعلمة max مع عدد مراكز المعالج. أي سيتم إنشاء 8 عمليات منفصلة للمعالج 8 النواة. يمكنك أيضًا تعيين -1 بدلاً من الحد الأقصى ، ثم سيتوافق عدد العمليات مع عدد النوى ناقص 1 . كل ما في الأمر هو أن اتصالات HTTP (S) / Websocket / TCP / UDP سيتم توزيعها بالتساوي بين هذه العمليات. لماذا لا التوسع الأفقي؟ يمكنك قراءة المزيد حول التجميع في PM2 هنا - وضع الكتلة PM2 .

cluster_mode

يمكنك تشغيل أكبر عدد تريده من العمليات ، ولكن لا يزال من المستحسن الالتزام بالتوصية "عملية واحدة لكل جوهر".

احترام الذاكرة


عندما تتطور في PHP ، واجهت مشكلة. بسبب قلة الخبرة ، قام بوضع خطأ في محرك النظام دون وعي ، نظرًا لأنه في ظل ظروف معينة ، بدأت العمليات في تناول الكثير من ذاكرة الوصول العشوائي. بالإضافة إلى ذلك ، تم تحميل المعالج ، بسبب الجهاز الظاهري الذي تم تعليقه للتو ولم أتمكن من الوصول إليه على الإطلاق.
كما يعلم مطورو PHP ، في PHP-FPM ، يمكنك تحديد نوع توزيع العمليات (إذا لم تكن تعرف فجأة ، ثم في PHP-FPM يتم إنشاء عملية جديدة لكل طلب جديد) - ثابت ، عند تعيين الحد الأدنى والحد الأقصى للعتبات ، وديناميكية - تخصيص مقدار العديد من العمليات الكبيرة حسب الضرورة. ماذا سيحدث في PM2 إذا بدأت 8 عمليات وبدأت جميعها تستهلك الكثير من الذاكرة؟ و PM2 قادر على حل هذه المشكلة - مع معلمة واحدة فقط في سطر الأوامر:

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


في كل مرة يتم الوصول إلى الحد الأقصى للذاكرة ، سيقوم PM2 تلقائيًا بإعادة تشغيل العملية. توزيع الذاكرة أسهل من العمليات ، أليس كذلك؟ 8 عمليات * 200 ميجابايت = 1.6 جيجا بايت. الرياضيات من الدرجة الثانية.

بالإضافة إلى إعادة تشغيل العملية ، يمكنك أيضًا تكوين إعادة التشغيل بعد فاصل زمني N. لم أحسب بعد الحالات التي يمكن أن يكون فيها هذا مفيدًا ، لكن لا تتردد في توجيهي إلى بعض الأمثلة في التعليقات :)

وإذا قمت بإعادة تشغيل الجهاز الظاهري؟


مفاجأة، مفاجأة! PM2 يحل أيضا هذه المشكلة بالنسبة لك. لا يزال مع عدم وجود أكثر من أمر واحد في وحدة التحكم:

 pm2 startup 


سيقوم PM2 بإنشاء برنامج نصي من شأنه رفع جميع العمليات الضرورية عند بدء تشغيل نظام التشغيل. ومع ذلك ، يجب أن تكون متيقظًا - عند ترقية إصدار Node.JS ، كل شيء يمكن أن يكسر. لتجنب ذلك ، بعد الترقية إلى الإصدار الجديد من Node.JS بنجاح ، قم بتشغيل pm2 startup . يمكنك قراءة المزيد حول هذا الموضوع على الرابط - PM2 Startup Script Generator .

هل من الضروري إعادة تشغيل المجموعات يدويًا عند إجراء التغييرات؟


بالطبع لا! حسنًا ، بشكل أكثر دقة ، يمكنك بالطبع إعادة تشغيل التطبيق يدويًا ، ولكن لماذا؟ أتمتة كل ما تستطيع ، وقد تأتيك القوة!

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


يمكنك استخدام هذا عند دمج فرع رئيسي في مستودع محلي مع فرع رئيسي من مستودع بعيد. في مشروعي الجانبي ، يتم ذلك ببساطة - إنشاء git pull origin master && npm run build . عند تغيير الملفات في الخادم / الإنشاء ومجلدات العميل / الإنشاء ، سيتم إعادة تشغيل العمليات تلقائيًا. أفهم أن هذه ميزة بسيطة للغاية ولا تستحق حتى أن يتم ذكرها في هذا النص. سأخفّفه بشيء خطير وأكتب أنه إذا كنت تستخدم التجميع ، فسيتم إعادة تشغيل جميع العمليات بدورها. نعم ، بحيث يكون واحد منهم على الأقل متاحًا دائمًا. هذا هو نشر صفر التوقف!

ولا يمكنك إعادة تشغيل العمليات. هناك إعادة تحميل لهذا (شيء مشابه لإعادة تحميل nginx):

 pm2 reload all 


الكثير من الفرق! بشكل عام ، أنا أفضل التكوينات


لقد سئمت بالفعل من الخروج بعبارات مضحكة ، لذلك فهي بسيطة ومبهجة: يوجد ملف للنظام البيئي. التنسيقات المدعومة هي JSON و YAML و JS. على سبيل المثال ، عندما تحتاج إلى مراقبة الملفات في مجلدات الخادم والعميل :

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


لمزيد من المعلومات ، انظر الرابط - إعلان تطبيق PM2 .

وحتى الرصد هو!


وليس واحد. اختر الشخص الذي يعجبك أكثر. يمكنك مراقبة في وحدة التحكم باستخدام الأمر:

 pm2 monit 




أو استخدم إصدار المراقبة الكامل المستند إلى الويب:



أنت ، بالطبع ، لن تصدقني ، لكن يتم تثبيته وإطلاقه بأمر واحد :

 pm2 plus 


وأكثر من ذلك بكثير ...


دعم معلن لـ Heroku و Docker ، زيادة تلقائية للمنفذ مع القدرة على النقل إلى process.env (عندما تحتاج إلى تشغيل كل عملية على منفذ منفصل) ، إطلاق عدة مثيلات PM2 ضمن نفس نظام التشغيل ، وجود واجهة برمجة تطبيقات للبرنامج وإمكانية تشغيل البرامج النصية Bash و Python المظللة!

ربما فاتني شيء آخر مهم أو مثير للاهتمام ، يمكنك تذكره دائمًا في التعليقات. أتمنى أن تكون قادرًا على تعلم شيء جديد من هذه المقالة.

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


All Articles