nginx passenger - периодически перезапускать приложение или когда оно достигает слишком большого объема памяти
У меня утечка памяти в одном из моих приложений, обслуживаемом с nginx + passenger и min/max_instances 2
установка. С течением времени память продолжает расти, и это может быть проблемой на машине с ограниченной памятью (например, Amazon Web Services), которая может привести к серьезному сбою.
Есть ли способ / способ перезапустить некоторые пассажирские процессы одного и того же приложения, периодически или когда память достигает определенного порога?
Предположим, у меня есть группа приложений A, которая может запустить до 2 процессов A1 и A2. Я хотел бы перезапускать А1 и А2 по одному для обеспечения непрерывности обслуживания (это не развертывание с нулевым временем простоя, поскольку оно опирается на одно и то же немодифицированное приложение, а какой-то способ устранить утечку памяти и перезапустить новый процесс, пока я не разобраться в проблеме).
Например, предположим, у меня есть следующее состояние:
Запросов в очереди: 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 часа утра)
Есть ли какой-нибудь сигнал, который я могу отправить этой группе пассажиров, который позволил бы мне перезапустить процессы один за другим?
2 ответа
Если это ваше производственное приложение, я бы посоветовал вам пойти с пассажирским предприятием. Есть хорошая функция, которую вы можете добавить в конфигурацию nginx:
passenger_memory_limit 1024;
Пассажир перезагрузит процесс, когда память достигнет 1024 или любого другого числа, которое вы хотите указать. Вы также можете воспользоваться многопоточностью, так как автономный пассажирский модуль является однопоточным.
Это может быть немного поздно для 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
В зависимости от конфигурации, пассажир немедленно возобновит остановленный процесс.