PM2 для автоматического перезапуска после сбоя

У меня есть дроплет DigitalOcean с небольшим объемом оперативной памяти, но там я должен разместить много процессов pm2 (точнее, 9-8 в режиме кластера (с предоставленным -i 0) и 1 в режиме форка). Эти процессы представляют собой серверы NodeJS Express, которые выполняют рендеринг на стороне сервера для проектов React.js.

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

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

Есть ли обходные пути для автоматизации этого процесса? Или, может быть, существует демон pm2, который работает при запуске pm2?

Благодарим за любую помощь!
Заранее спасибо!


Обновлять

Вот последний крашлог (часть, связанная с крашем вручную):

<--- Last few GCs --->

[11194:0x3184710] 38854201 ms: Scavenge 24.7 (28.2) -> 23.8 (28.2) MB, 0.5 / 0.0 ms  allocation failure
[11194:0x3184710] 38888980 ms: Scavenge 24.8 (28.2) -> 23.9 (28.7) MB, 0.7 / 0.0 ms  allocation failure
[11194:0x3184710] 39006864 ms: Scavenge 24.8 (28.7) -> 23.9 (28.7) MB, 0.7 / 0.0 ms  allocation failure
[11194:0x3184710] 39131478 ms: Scavenge 24.8 (28.7) -> 23.9 (28.7) MB, 0.4 / 0.0 ms  allocation failure


<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 0xa90e93a5879 <JSObject>
    0: builtin exit frame: parse(this=0xa90e93890a9 <Object map = 0x188eb7f82ba1>,0x33a45597fe41 <String[338]: {"type":"axm:monitor","data":{"Loop delay":{"value":"0.81ms","ag$

FATAL ERROR: Committing semi space failed. Allocation failed - process out of memory
1: node::Abort() [node /home/<private path>/frontend/dist-server/server.bundle.js]
2: 0x8c20ec [node /home/<private path>/frontend/dist-server/server.bundle.js]
3: v8::Utils::ReportOOMFailure(char const*, bool) [node /home/<private path>/frontend/dist-server/server.bundle.js]
4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [node /home/<private path>/frontend/dist-server/server.bundle.js]
5: v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [node /home/<private path>/frontend/dist-server/server.bundle$
6: v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [node /home/<private path>/fronte$
7: v8::internal::Factory::NewJSObject(v8::internal::Handle<v8::internal::JSFunction>, v8::internal::PretenureFlag) [node /home/<private path>/frontend/dist-server$
8: v8::internal::JsonParser<true>::ParseJsonObject() [node /home/<private path>/frontend/dist-server/server.bundle.js]
9: v8::internal::JsonParser<true>::ParseJsonValue() [node /home/<private path>/frontend/dist-server/server.bundle.js]
10: v8::internal::JsonParser<true>::ParseJson() [node /home/<private path>/frontend/dist-server/server.bundle.js]
11: v8::internal::Builtin_JsonParse(int, v8::internal::Object**, v8::internal::Isolate*) [node /home/<private path>/frontend/dist-server/server.bundle.js]
12: 0x1d7ee3e8697d

person Limbo    schedule 17.12.2018    source источник
comment
Не могли бы вы просто использовать меньше процессов в кластере, например, вместо 9, только 4? Можете ли вы показать нам журналы pm2 (~/.pm2/pm2.log) с исключением, которое приводит к сбою pm2?   -  person Unitech    schedule 17.12.2018
comment
@Unitech Я обновил вопрос с помощью журналов, спасибо. Некоторое время назад (около 3-х месяцев) все процессы запускались в режиме fork, но были и вылеты (может, и реже, если честно).   -  person Limbo    schedule 17.12.2018
comment
Вы пробовали супервайзер? supervisord.org   -  person danielarend    schedule 17.12.2018
comment
На какой системе работают? Что касается супервизора, он не обрабатывает автоматическую кластеризацию Node.js.   -  person Unitech    schedule 17.12.2018
comment
@Unitech Сервер Ubuntu 16.04   -  person Limbo    schedule 17.12.2018
comment
@danielarend Нет. У Ubuntu есть свои супервизоры, но я слишком далек от знакомства с этими технологиями)   -  person Limbo    schedule 17.12.2018


Ответы (1)


Подключите PM2 к PM2+, чтобы агент, связывающий PM2 с PM2+, действовал как второй сторожевой таймер. Если произойдет сбой основного PM2, агент PM2+ перезапустит PM2 с предыдущим списком процессов.

person Unitech    schedule 17.12.2018
comment
Спасибо, я постараюсь проверить это и отметить ваш ответ после того, как это поможет! :) - person Limbo; 17.12.2018
comment
Конечно, дайте мне знать, если это решит проблему, я попытаюсь воспроизвести эту ошибку на сервере. - person Unitech; 17.12.2018
comment
Что ж, я привязал pm2 к этому дэшборду, но не нашел, где вручную установить сторожевой таймер для основного процесса pm2. Он уже установлен автоматически? - person Limbo; 18.12.2018
comment
Эта приборная панель очень мощная. Однако, как я понял, без платной подписки нет возможности показать более 4-х процессов? :) - person Limbo; 18.12.2018
comment
Сторожевой таймер активируется по умолчанию после привязки PM2 к PM2+. Да, верно, мы должны платить нашей команде, чтобы все это работало! - person Unitech; 18.12.2018
comment
Хорошо, спасибо! Я прекрасно понимаю, что ваш большой труд должен быть оплачен. Спасибо за эту услугу! Буду ждать краша на pm2, чтобы проверить :) - person Limbo; 18.12.2018
comment
Ну, это не сработало. После краха pm2 не перезагружался с проектами, список проектов пустой, а в PM2+ проектов нет :( - person Limbo; 21.12.2018