У меня есть утечка памяти в одном из моих приложений, обслуживаемых пассажиром 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 или любого другого числа, которое вы хотите указать. Вы также можете воспользоваться преимуществами многопоточности, поскольку автономная версия для пассажиров является однопоточной.