Вопрос или проблема
У нас есть сервер на CENTOS, и в качестве стека мы используем VUE3 с Nodejs, NUXT и EXPRESS js
Также используется Pm2 для управления процессами
Сервер работает уже несколько лет, но в последнее время у нас возникли проблемы, что процесс PM2 frontend перезапускается часто без видимой причины.
На этом изображении мы можем видеть, что процесс frontend перезапускается сам по себе, так как у него время работы ниже, чем у всех других процессов, которые были перезапущены с помощью кода деплоя.
Мы проверили утечки памяти и исправили множество отдельных проблем в нашей кодовой базе, но использование памяти всегда составляет от 1 до 2,5 ГБ (pm2 list / monit), оно никогда не превышает 2,5 ГБ, и в ecosystem.config мы указали:
max_memory_restart: '8G'
node_args: '--max-old-space-size=8096 --openssl-legacy-provider',
Поэтому мы не понимаем, почему перезапуски все еще происходят. Если бы это была настоящая утечка памяти, мы ожидали бы, что память достигнет порога в 8 ГБ, а затем произойдет сбой/перезагрузка.
На данный момент мы уже потратили много времени и заканчиваем идеи, где искать/отлаживать возможные причины.
Нет ошибочных логов, логи вывода выглядят нормально и не содержат ничего подозрительного. Поэтому мне неясно, что это может вызывать.
У кого-то есть идеи, что может быть возможной причиной или какие другие пути мы должны проверить/изучить и как?
Могут ли быть другие процессы, помимо pm2, которые перегружают сервер и которые мы упускаем?
Ответ или решение
Как отладить частые перезапуски процесса фронтенда PM2
На вашем сервере, работающем под управлением CENTOS и использующем стек VUE3, Node.js, NUXT и EXPRESS, вы столкнулись с проблемой частых перезапусков процесса фронтенда PM2. Это распространенная и потенциально сложная проблема, которую важно диагностировать и устранить. Давайте рассмотрим ключевые аспекты, которые могут помочь в отладке данной ситуации.
1. Проверка конфигурации PM2
Первое, что стоит проверить — это ваша конфигурация PM2 в файле ecosystem.config.js
. Убедитесь, что указаны правильные параметры:
module.exports = {
apps: [
{
name: 'frontend',
script: './path/to/your/frontend',
max_memory_restart: '8G',
node_args: '--max-old-space-size=8096 --openssl-legacy-provider',
// другие параметры...
},
],
};
Параметр max_memory_restart: '8G'
позволяет перезапускать процесс, если его память превышает 8 ГБ. Если вы не видите критических ошибок, необходимо проверить другие факторы, кроме утечек памяти.
2. Логи и мониторинг
Хотя вы упомянули, что логи не показывают ошибок, стоит внимательно проанализировать логи PM2 и приложения. Используйте команду:
pm2 logs <имя_приложения>
Иногда в логах могут быть промежуточные ошибки или предупреждения, которые могут указывать на проблемы с зависимостями или другие внутренние ошибки.
Проверьте логи нод (например, console.log
в приложении) для лучшего понимания происходящего в момент перезапуска.
3. Профилирование производительности
Если в логах нет явных указаний на ошибки, попробуйте провести профилирование вашего приложения. Это можно сделать с помощью инструментов, таких как:
- Node.js Inspector: Позволяет осуществлять детальную диагностику производительности приложений на Node.js.
- Clinic.js: Мощный инструмент для анализа производительности и поиска узких мест в Node.js приложениях.
4. Нагрузочное тестирование
Попробуйте искусственно создать нагрузку на приложение, чтобы увидеть, как оно ведет себя в условиях высокой нагрузки. Использование инструментов, таких как Apache JMeter или Artillery, может помочь вам симулировать события и нагрузку, тем самым выявляя потенциальные проблемы с производительностью.
5. Внешние воздействия
Помимо процессов, управляемых PM2, могут быть другие процессы в системе, влияющие на производительность. Используйте команды для мониторинга системы, такие как top
, htop
или vmstat
, чтобы наблюдать за загруженностью CPU и памятью.
Также стоит убедиться, что нет конфликтов с другими службами на сервере, например, веб-сервером (Nginx, Apache), которые могут потреблять свои собственные ресурсы и накладывать ограничения на ваше приложение.
6. Проверка зависимостей
Убедитесь, что используемые вами зависимости (библиотеки, фреймворки) обновлены до последних стабильных версий. Иногда именно устаревшие зависимости могут вызывать нестабильную работу приложения, тем самым приводя к перезапускам.
7. Отключение автоматического перезапуска
В качестве временной меры можно отключить автоматический перезапуск для вашего фронтенд-приложения. Это даст вам возможность выявить, были ли изменения в поведении приложения при ручном управлении процессом. Используйте команду:
pm2 start <имя_приложения> --no-autorestart
Таким образом, вы сможете увидеть, происходит ли остановка процесса по какой-либо причине.
Заключение
Диагностика проблем с перезапусками приложения в PM2 требует системного подхода и многогранного анализа. Внимательное изучение конфигурации, использование логов и инструментов мониторинга, а также проведение тестов могут значительно облегчить решение проблемы. Если все предложенные методы не помогают, стоит обратиться на форумы сообществ разработчиков, таких как Stack Overflow, где можно получить конкретные советы по вашему случаю.
Проблемы с производительностью могут быть сложными, однако, систематический подход к диагностике и анализу должен помочь вам выявить и устранить причины нестабильной работы вашего приложения.