Что такое pm2 linux

Обновлено: 04.07.2024

При запуске приложения Express для рабочей среды использование диспетчера процессов позволяет выполнять следующие задачи:

  • Автоматически перезапускать приложение в случае сбоя.
  • Получать аналитическую информацию о производительности среды выполнения и потреблении ресурсов.
  • Изменять параметры в динамическом режиме в целях повышения производительности.
  • Управлять кластеризацией.

Диспетчер процессов можно сравнить с сервером приложений: это “контейнер” для приложений, обеспечивающий развертывание и высокую готовность и позволяющий управлять приложением в среде выполнения.

Наиболее популярные диспетчеры процессов для Express и других приложений Node.js перечислены ниже:

Использование любого из этих трех инструментов может быть исключительно полезным, тем не менее StrongLoop Process Manager является единственным инструментом, предоставляющим универсальное решение для среды выполнения и развертывания в течение всего жизненного цикла приложения Node.js и включающим в себя, в виде единого интерфейса, все средства для каждого этапа, как до перехода в рабочий режим, так и в рабочей среде.

StrongLoop Process Manager

StrongLoop Process Manager (StrongLoop PM) - это рабочий диспетчер процессов для приложений Node.js. В StrongLoop PM предусмотрено встроенное распределение нагрузки, мониторинг, развертывание на нескольких хостах и графическая консоль. С помощью StrongLoop PM можно выполнять следующие задачи:

  • Компоновать, объединять в пакет и развертывать приложение Node.js в локальной или удаленной системе.
  • Просматривать профайлы CPU и моментальные снимки кучи в целях оптимизации производительности и диагностирования утечек памяти.
  • Поддерживать постоянную активность процессов и кластеров.
  • Просматривать показатели производительности приложения.
  • Без затруднений управлять развертываниями на нескольких хостах с интеграцией Nginx.
  • Объединять несколько диспетчеров StrongLoop PM в распределенную среду выполнения микрослужб, управляемую из Arc.

Работать с StrongLoop PM можно посредством многофункционального интерфейса командной строки, называемого slc , или графического инструмента Arc. Arc имеет открытый исходный код и обеспечен экспертной поддержкой StrongLoop.

Полная версия документации:

Установка

Основы использования

Просмотр состояния диспетчера процессов и всех развернутых приложений:

Вывод списка всех приложений (служб), подлежащих управлению:

Также можно выполнить “мягкий перезапуск”, при котором рабочим процессам выделяется определенное время на закрытие существующих соединений, после чего текущее приложение перезапускается:

Удаление приложения из числа подлежащих управлению:

PM2 - это диспетчер процессов рабочей среды для приложений Node.js, в котором предусмотрен встроенный инструмент распределения нагрузки. PM2 позволяет всегда поддерживать приложения в рабочем состоянии и перезагружать их без простоев, а также обеспечивает выполнение общих задач системного администрирования. PM2 также позволяет управлять ведением протоколов, мониторингом и кластеризацией приложений.

Установка

Основы использования

При запуске приложения с помощью команды pm2 необходимо указать путь к приложению. Тем не менее, при остановке, перезапуске или удалении приложения можно указать только имя или ИД приложения.

При запуске приложения с помощью команды pm2 оно немедленно переводится в фоновый режим. Фоновым приложением можно управлять из командной строки с помощью различных команд pm2 .

После запуска приложения с помощью команды pm2 оно регистрируется в списке процессов PM2 с указанием ИД. Затем можно управлять приложениями с тем же именем из различных каталогов в системе, используя только их ИД.

Обратите внимание на то, что если запущено несколько приложений с одинаковым именем, команды pm2 применяются ко всем таким приложениям. Поэтому для управления отдельными приложениями используйте не имена, а ИД.

Список всех запущенных процессов:

Просмотр подробной информации о приложении:

Удаление приложения из реестра PM2:

Forever

Forever представляет собой простой инструмент интерфейса командной строки, обеспечивающий непрерывное (бесконечное) выполнение определенного сценария. Благодаря простому интерфейсу Forever является идеальным инструментом для выполнения не столь масштабных развертываний приложений и сценариев Node.js.

Установка

Основы использования

Для запуска сценария воспользуйтесь командой forever start и укажите путь к сценарию:

Эта команда запустит сценарий в режиме демона (в фоновом режиме).

Для запуска сценария таким образом, чтобы он был соединен с терминалом, не указывайте start :

Целесообразно регистрировать вывод инструмента Forever и сценария в протоколе, используя для этого опции ведения протоколов -l , -o и -e , как показано в примере ниже:

Для просмотра списка сценариев, запущенных с помощью Forever:

Для остановки сценария, запущенного с помощью Forever, воспользуйтесь командой forever stop и укажите индекс процесса (согласно списку, выведенному с помощью команды forever list ).

В качестве альтернативы, укажите путь к файлу:

Для остановки всех сценариев, запущенных с помощью Forever:

В Forever предусмотрено множество других опций, и, кроме того, данным инструментом предоставляется программный API.

Для обеспечения непрерывной работоспособности Node.js сервера нужно либо постоянно держать открытой консоль, либо использовать менеджер процессов pm2. Он имеет встроенный балансировщик нагрузки, позволяет следить за потребляемыми ресурсами запущенных процессов, автоматически перезапускать процессы после системного сбоя и т. д.

Менеджер процессов pm2 имеется в репозитории npm и должен быть установлен в системе глобально.

Управление процессами¶

Запуск Node.js сервера с использованием pm2 осуществляется командой start , которой передается путь к главному файлу приложения.

Команда start инициирует запуск приложения в фоновом режиме и добавляет его в список процессов, который можно увидеть выполнив команду ls .

Перечень полей таблицы:

  • app name - имя приложения (по умолчанию имя главного файла без расширения), для задания собственного названия используйте при запуске параметр --name : pm2 start app.js --name=custom_app_name
  • id - уникальный идентификатор приложения;
  • mode - режим, в котором был запущен сервер ( fork или cluster );
  • pid - уникальный идентификатор процесса в системе;
  • status - статус приложения, может быть launching , online , errored или stopped ;
  • restart - количество перезапусков;
  • uptime - время, прошедшее с момента запуска приложения;
  • cpu - нагрузка на процессор в процентах;
  • mem - занимаемая приложением оперативная память.

Для получения более подробной информации о количестве запросов, параметрах запуска процессов и т. д. используйте команду monit .

За перезапуск процесса отвечает команда restart , принимающая имя или идентификатор приложения.

Выполнение restart увеличивает значение одноименного поля в списке процессов применительно к тому из них, для которого была выполнена команда.

Остановка процесса осуществляется командой stop , которой необходимо указать либо название, либо идентификатор приложения.

Выполнение stop останавливает работу приложения, но не удаляет его из списка процессов, статус при этом будет stopped .

Чтобы остановить процесс и удалить его из списка, используйте команду delete .

Посмотреть консольные логи приложения можно командой log . Если для log не указать приложение, то будут выведены логи всех процессов, отсортированные по времени.

Командам restart , stop , delete и log можно передать через пробел сразу несколько процессов для обработки.

Для возможности восстановления и запуска списка процессов в случае перезапуска или непредвиденного сбоя сервера, сохраните текущую конфигурацию на диск выполнив команду save .

После этого сохраненные процессы могут быть запущены следующим образом.

Распределение нагрузки (кластеризация)¶

Запуск приложения в нескольких экземплярах, которые будут распределять между собой поступающие запросы, осуществляется с использованием параметра -i (instances) у команды start , с помощью которого указывается, сколько экземпляров запустить. Создание дополнительных процессов одного и того же приложения называется кластеризацией.

Приведенная команды запускает приложение в двух экземплярах. Помните, что для эффективной работы кластера количество дополнительных процессов не должно превышать количество ядер процессора. Чтобы запустить количество процессов равное количеству ядер, укажите параметру -i значение max .

В данном случае Node.js pm2 самостоятельно определит количество ядер процессора и создаст соответствующее количество дополнительных экземпляров.

Файл ecosystem.config.js¶

Если разработанная вами система состоит из множества приложений, которым к тому же при запуске необходимо указывать массу параметров, то при развертывании на разных серверах этот процесс займет немало времени. Чтобы оптимизировать все это, в pm2 имеется поддержка запуска приложений из конфигурационного файла - ecosystem.config.js .

Чтобы сгенерировать шаблон ecosystem.config.js воспользуйтесь следующей командой.

Теперь в директории, откуда была выполнена команда, должен появиться файл ecosystem.config.js с таким содержимым.

В массиве apps каждый элемент является объектом, описывающим конфигурацию для запуска одного приложения набором параметров. Рассмотрим основные из них:

  • name - имя приложения, которое будет отображаться в списке процессов при выполнении команды pm2 list ;
  • script - путь к главному файлу приложения, который отвечает за запуск;
  • instances - запускает процесс в кластерном режиме, в качестве значения передается количество дополнительных экземпляров;
  • disable_logs - если задать true , то логи вестись не будут;
  • env - значение переменной среды окружения NODE_ENV в режиме разработки;
  • env_production - значение переменной среды окружения NODE_ENV в режиме эксплуатации.

ПС полным списком параметров можно ознакомиться в официальной документации.

Для запуска описанных в ecosystem.config.js приложений, выполните команду start с указанием пути к файлу.

Если вам нужно запустить только одно приложение из описанного массива, укажите параметр --only и значение поля name из конфигурации.

Лимит использования RAM¶

Менеджер процессов Node.js pm2 позволяет настроить перезапуск процесса по достижению использования им указанного объема оперативной памяти. Для этого при запуске приложения необходимо указать параметр --max-memory-restart .

Значение параметра указывается в одном из трех возможных измерений:

  • K (килобайты);
  • M (мегабайты)
  • G (гигабайты).

Проверка использования процессами оперативной памяти осуществляется pm2 раз в 30 секунд.

Детектирование изменений¶

В pm2 также можно настроить автоматический перезапуск приложения при изменении одного из его файлов. Для этого при старте приложения укажите параметр --watch .

Процесс отслеживания изменений не завершается с остановкой процесса приложения. Чтобы отключить его, при выполнении команды stop также необходимо передать параметр --watch .

Параметр --watch имеет ряд параметров, но их указание возможно только через файл ecosystem.config.js .

Здесь в параметре watch явно указывается, изменений каких директорий необходимо отслеживать. Чтобы исключить из отслеживания определенные директории, имеется параметр ignore_watch . А с помощью watch_delay указывается время в миллисекундах, которое необходимо выждать при перезапуске приложения, прежде чем инициировать процесс детектирования изменений.

Буквально пару часов назад у меня завязался спор на тему того, что Node.JS слишком медленная для крупных проектов и ей стоит предпочесть Golang, Rust, PHP, etc. Основным аргументом противоположной стороны в этом споре был факт однопоточности JavaScript. Якобы при разработке приложения производительность просто упрётся в эту однопоточность и ничего сделать уже нельзя — только переписать на каком-то другом языке. Однако дела с этим в NodeJS обстоят немного лучше, чем кажется на первый взгляд. Перед тем, как мы углубимся в эту тему хочу заявить, что уважаю право каждого разработчика использовать тот язык программирования, который пришёлся ему по душе и который он считает предпочтительным в той или иной задаче.

Сделав поиск по ключевому слову «PM2» на Хабре я не нашёл ни одной статьи, посвящённой этому process-менеджеру. Лишь одиночные упоминания в статьях других пользователей. Я загорелся (сильно сказано) идеей наверстать упущенное и пролить свет на этот тёмный уголок разработки backend на Node.JS (о котором многие знают, да, я в курсе). Всех заинтересовавшихся прошу под кат.

Пару слов о самом PM2

PM2 — это менеджер процессов с открытым исходным кодом, распространяющийся под лицензией AGPL-3.0. В момент написания статьи имеет

350k загрузок в неделю, согласно данным NPM. В основном применяется в средах, где необходимо запустить приложение на NodeJS и забыть о нём (с остальными языками тоже можно использовать, но об этом позднее), позволяющий кластеризировать приложение и гибко распределять нагрузку между ядрами процессора. Небольшая вырезка из репозитория PM2 на GitHub:

PM2 is a production process manager for Node.js applications with a built-in load balancer. It allows you to keep applications alive forever, to reload them without downtime and to facilitate common system admin tasks.

PM2 решает эту проблему одной командой:

Эта команда «демонизирует» (от англ. «daemonize») процесс NodeJS, следит за потреблением им памяти и считает нагрузку на процессор.

Вернёмся к нашим баранам

С ростом нагрузки на backend возникает необходимость его масштабирования — как вертикального, так и горизонтального — кому что удобнее в сложившихся обстоятельствах. Как мы знаем, один процесс может использовать несколько ядер процессора, но только в том случае, если внутри процесса имеется несколько потоков. В NodeJS приложениях поток — один. PM2 способен выручить в этой ситуации и распределить нагрузку между несколькими ядрами процессора. По-прежнему всего с одной командой:

cluster_mode

Вы можете запустить сколько угодно процессов, но всё же рекомендуется придерживаться рекомендации «один процесс на одно ядро».

Бережное отношение к памяти

При разработке на PHP я однажды столкнулся с проблемой. По неопытности неосознанно заложил в движок системы баг, из-за которого при определённых условиях процессы начинали поедать слишком много оперативной памяти. Вдобавок к этому нагружался процессор, из-за чего виртуальная машина просто зависла и у меня не было к ней доступа совсем.
Как знают PHP-разработчики, в PHP-FPM можно задать тип распределения процессов (если вы вдруг не знали, то в PHP-FPM для каждого нового запроса создаётся новый процесс) — статический, когда задаётся минимальный и максимальный порог, и динамический — выделение сколь угодно большого количества процессов, по необходимости. Что будет в PM2, если запустить 8 процессов и все они начнут потреблять много памяти? И эту проблему PM2 в состоянии решить — лишь одним параметром в командной строке:

Каждый раз при достижении лимита по памяти PM2 автоматически перезапустит процесс. Распределять память проще чем процессы, не так ли? 8 процессов * 200 мегабайт = 1,6 гигабайт. Математика уровня второго класса.

Помимо перезапуска процесса можно также настроить и перезапуск через N интервал времени. Я пока не придумал в каких случаях это может пригодиться, но не стесняйтесь указать мне на пару примеров в комментариях :)

А если я перезагружу виртуальную машину?

Сюрприз-сюрприз! Эту проблему PM2 тоже решает за вас. Всё ещё не более чем одной единственной командой в консоли:

PM2 сгенерирует скрипт, который будет поднимать все необходимые процессы при запуске операционной системы. Однако здесь стоит быть бдительным — при обновлении версии Node.JS всё может сломаться. Во избежание этого, после успешного обновления до новой версии Node.JS выполните pm2 unstartup и pm2 startup . Подробнее об этом можно ознакомиться по ссылке — PM2 Startup Script Generator.

А надо ли перезапускать кластеры вручную при внесении изменений?

Конечно же нет! Ну, точнее, вы, конечно, можете перезапускать приложение вручную, но зачем? Автоматизируйте всё что можете и да прибудет с вами сила!

Вы можете пользоваться этим при слиянии master-ветки в локальном репозитории с master-веткой из удалённого репозитория. В моём сайд-проекте это делается просто — git pull origin master && npm run build . При изменении файлов в папках server/build и client/build процессы будут автоматически перезапущены. Я понимаю, это очень простенькая фича и она не заслуживает даже быть упомянутой в этом тексте. Разбавлю его кое-чем серьёзным и напишу о том, что если вы пользуетесь кластеризацией, то все процессы будут перезагружены поочерёдно. Да так, что как минимум один из них будет всегда доступен. Это же zero-downtime deployment!

А можно и не перезапускать процессы. Для этого есть reload (нечто похожее на nginx reload):

Слишком много команд! И вообще я предпочитаю конфиги

Мне уже наскучило придумывать весёлые фразы, поэтому просто и банально: файл экосистемы — есть. Поддерживаются форматы JSON, YAML и JS. Например, когда необходимо следить за файлами в папках server и client:

Подробнее ознакомиться можно по ссылке — PM2 Application Declaration.

И даже мониторинг есть!

И не один. Выбирайте тот который нравится больше. Можно мониторить в консоли командой:


Или же воспользоваться полноценной веб-версией мониторинга:


Вы мне, конечно же, не поверите, но она устанавливается и запускается одной командой:

И многое-многое другое.

Заявлена поддержка Heroku и Docker, автоматическое инкрементирование портов с возможностью передачи в process.env (когда нужно каждый процесс запускать на отдельном порту), запуск нескольких инстансов PM2 в пределах одной ОС, наличие программного API и возможность запускать демонизированные Bash и Python скрипты!

Вероятно, я упустил ещё что-то важное или интересное, о чём всегда можно напомнить мне в комментариях. Надеюсь, что вы смогли почерпнуть для себя что-то новое из этой статьи.

PM2 - это инструмент управления процессами узла, который можно использовать для упрощения многих утомительных задач управления приложениями узла, таких как мониторинг производительности, автоматический перезапуск, балансировка нагрузки и т. Д., И его очень просто использовать.

Ниже приведено вводное введение в PM2, которое в основном охватывает часто используемые функции и конфигурации PM2.

устанавливать

Глобальная установка вряд ли может быть проще.

Введение в каталог

После установки pm2 следующий каталог будет создан автоматически. Видя имя файла, в основном знает, что делать, поэтому оно не будет переведено.

  • $HOME/.pm2 will contain all PM2 related files
  • $HOME/.pm2/logs will contain all applications logs
  • $HOME/.pm2/pids will contain all applications pids
  • $HOME/.pm2/pm2.log PM2 logs
  • $HOME/.pm2/pm2.pid PM2 pid
  • $HOME/.pm2/rpc.sock Socket file for remote commands
  • $HOME/.pm2/pub.sock Socket file for publishable events
  • $HOME/.pm2/conf.js PM2 Configuration

Учебник по началу работы

Выберите наше любимое экспресс-приложение в качестве примера. Вообщем мы все проходим npm start Запуск приложения на самом деле вызывает node ./bin/www , Итак, замена его на pm2

Обратите внимание, используется здесь --watch Этот параметр означает, что при изменении кода вашего экспресс-приложения pm2 поможет вам перезапустить службу.

Общие команды

начало

  • --watch : Прослушивание изменений в каталоге приложения. Как только изменения произойдут, перезапустите их автоматически. Если вы хотите точно прослушать каталог, лучше всего передать файл конфигурации.
  • -i --instances : Сколько экземпляров включено для балансировки нагрузки. если -i 0 или -i max , Количество экземпляров определяется на основе текущего количества ядер машин.
  • --ignore-watch : Исключить каталоги / файлы для мониторинга, которые могут быть конкретными именами файлов или обычными. Например --ignore-watch="test node_modules "some scripts""
  • -n --name : Название приложения. Может использоваться при просмотре информации о приложении.
  • -o --output <path> Путь к стандартному выходному файлу журнала.
  • -e --error <path> Путь к файлу журнала ошибок.
  • --interpreter <interpreter> : Интерпретатор pm2 должен использовать для выполнения приложения (bash, python . ). Например, вы используете сценарий кофе для написания приложений.

Полный список параметров командной строки:адрес

перезапуск

Остановите конкретные приложения. Может пройти первым pm2 list Получить имя приложения (указывается --name) или идентификатор процесса.

Если вы хотите остановить все приложения, вы можете

Удалить

сходный pm2 stop Следующим образом

pm2 stop app_name|app_id

Просмотр статуса процесса

Просмотр информации о процессе

Describing process with id 0 - name oc-server

│ exec cwd │ /data/file/qiquan/over_the_counter/server │

│ error log path │ /data/file/qiquan/over_the_counter/server/logs/app-err-0.log │

│ out log path │ /data/file/qiquan/over_the_counter/server/logs/app-out-0.log │

│ pid path │ /root/.pm2/pids/oc-server-0.pid │

│ node v8 arguments │ │

│ unstable restarts │ 0 │

Файл конфигурации

Простое объяснение

  • Элементы настройки в файле конфигурации в основном соответствуют параметрам командной строки.
  • Можете выбрать yaml или json Файлы, просто посмотрите на личную стирку.
  • json Формат файла конфигурации, pm2 рассматривается как обычный файл js, так что вы можете добавлять в него комментарии или писать код, что хорошо для динамической настройки конфигурации.
  • Если при запуске указан файл конфигурации, параметры командной строки игнорируются. (За исключением отдельных параметров, таких как --env)

пример

Для простого примера, пожалуйста, обратитесь к полной инструкции по настройкеОфициальный документ。

"name": "fis-receiver", // имя приложения

"script": "./bin/www", // фактический скрипт запуска

"watch": [// Отслеживать измененный каталог и автоматически перезапускать его после изменения

"ignore_watch": [// исключить из каталога наблюдения

"error_file": "./logs/app-err.log", // путь к журналу ошибок

"out_file": "./logs/app-out.log", // общий путь журнала

"NODE_ENV": "production" // параметр среды, в данный момент указанный как производственная среда

Авто перезапуск

Как упоминалось ранее, разместите здесь командную строку, нажмите ещездесь。

Вот файл для мониторинга всего проекта.Если вы хотите контролировать только указанные файлы и каталоги, рекомендуется использовать файл конфигурации. watch 、 ignore_watch Поле для установки.

Переключатель среды

При разработке реальных проектов наши приложения часто необходимо развертывать в нескольких средах, таких как среды разработки, среды тестирования и производственные среды. В разных средах иногда существуют различия в элементах конфигурации, таких как разные адреса связанных баз данных.

Для этого сценария pm2 также может хорошо поддерживаться. Сначала передав в файл конфигурации env_xx Чтобы объявить конфигурацию различных сред, а затем при запуске приложения, --env Параметр указывает операционную среду.

Заявление о конфигурации окружающей среды

Сначала в конфигурационном файле передайте env Параметры объявляют несколько конфигураций среды. Краткое объяснение:

Читайте также: