Назад | Перейти на главную страницу

пассажир nginx - периодически перезапускайте приложение или когда он достигает слишком большого объема памяти

У меня есть утечка памяти в одном из моих приложений, обслуживаемых пассажиром nginx + и min/max_instances 2 настройка. С течением времени объем памяти увеличивается, и это может быть проблемой на машине с ограниченной памятью (например, Amazon Web Services), которая может привести к серьезным сбоям.

Есть ли способ / уловка для перезапуска некоторых пассажирских процессов одного и того же приложения периодически или по достижении определенного порога памяти?

Предположим, у меня есть группа приложений A, которая может запускать до 2 процессов A1 и A2. Я хотел бы перезапустить A1 и A2 по одному, чтобы обеспечить непрерывность обслуживания (это не развертывание с нулевым временем простоя, поскольку оно опирается на то же немодифицированное приложение, но есть способ очистить утечку памяти и перезапустить новый процесс, пока я не выясню проблему).

Например, предположим, что у меня есть следующее состояние:

Запросы в очереди: 0

  * PID: 11124   Sessions: 0       Processed: 14638   Uptime: 1d 12h 31m 29s
    CPU: 0%      Memory  : 341M    Last used: 24s
  * PID: 11131   Sessions: 0       Processed: 9323    Uptime: 1d 12h 31m 29s
    CPU: 0%      Memory  : 389M    Last used: 24s

Процесс № 2 начинает занимать много памяти (~ 400), поэтому я хотел бы перезапустить его (и только этот процесс), который должен вернуть его до 100 МБ, и я бы сделал то же самое с процессом № 1 потом

Утечка памяти требует некоторого времени для создания, и было бы лучше, если бы я мог перезапустить только при обнаружении слишком высокого использования памяти, но если я могу запланировать перезапуск процесса каждую ночь или так, это также может работать полностью (например, перезапустить процесс № 1 в 3 часа ночи, затем процесс № 2 в 4 часа ночи)

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

Это может быть немного поздно для OP, но у нас каждую минуту на наших хостах AWS запускается следующий cron-скрипт:

#!/bin/bash
let "TARGET = 400 * 1024" # = 400 MB
ps aux --sort -rss | grep "Passenger RackApp" | while read -r LINE; do
        read PID MEMORY <<< $(echo $LINE | awk '{ print $2; print $6 }')
        if [ $MEMORY -gt $TARGET ]
        then
                `kill -15 $PID`
        fi
done
exit 0

В зависимости от конфигурации пассажир немедленно повторно запустит остановленный процесс.

Если это ваше производственное приложение, я бы посоветовал вам выбрать пассажирское предприятие. Есть приятная функция, которую вы можете добавить в конфигурацию nginx:

пассажир_memory_limit 1024;

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