Автоматический перезапуск сервера, если виртуальная память слишком мала
На моем сервере работает довольно много программ: httpd, varnish, mysql, memcache, java..
Каждый из них использует часть виртуальной памяти, а лак был настроен на выделение 3 ГБ памяти для запуска.
Из-за высокой нагрузки на трафик, которая составляет 100 КБ, на нашем сервере не хватает памяти и вызывается oom-killer. Мы должны перезагрузить сервер.
У нас есть 8 ГБ виртуальной памяти, и по какой-то причине мы не можем расширить объем памяти.
У меня вопрос - есть ли какой-нибудь автоматический скрипт, который будет отслеживать, сколько виртуальной памяти осталось и на основе определенных критериев, скажем, если осталось 500 МБ, чем автоматически перезапустить сервер?
Я знаю, что это не правильное решение, но мы должны сделать это, иначе мы не знаем, когда сервер получит OOM, и к тому времени, как мы узнаем и перезапустим сервер, мы потеряли наших посещающих пользователей.
2 ответа
Если я вас правильно понимаю, вы хотите что-то вроде следующего:
- Проверьте, сколько памяти осталось на VPS.
- Если осталось 500М памяти, перезагрузите VPS.
Это можно сделать следующим образом
- Напишите скрипт, который проверяет, сколько памяти осталось, и перезагрузите VPS.
- Добавьте этот скрипт в crontab, чтобы автоматизировать задачу.
например
#!/bin/bash
mem=$(free -m | awk '/Mem:/{print $4}')
(( mem <= 500 )) && reboot
Сделайте скрипт исполняемым
chmod +x scriptname
// примечание не добавляет расширение
Добавьте скрипт в cron
crontab -e
* * * * * user_to_run_the_script /path/to/the/script
Надеюсь, вы поняли идею.
У меня была похожая проблема, и, хотя я и не хотел подвергать сомнению ваш вопрос, который был бы приятным и конкретным, я должен сказать, что вам нужно решение в долгосрочной перспективе.
OOM Killer вступает в силу, потому что ваш сервер не хватает памяти. Отключение OOM Killer не поможет с этим - у вас все равно будет нехватка памяти, и ваш сервер в конечном итоге рухнет. Конечно, убийца ООМ не всегда помогает, но отключить его тоже не поможет.
Перезагрузка вашего сервера временно решит проблему, но это произойдет снова.
У меня была похожая проблема с сервером. Установка monit и его настройка для предупреждения об истощении памяти позволили мне получить доступ к серверу, когда что-то начинало происходить, поэтому я мог правильно его диагностировать и решать. Я также добавил swap через файл подкачки, чтобы увеличить время доступа к серверу во время возникновения проблемы.
В моем случае мой веб-сервер был настроен на запуск слишком большого количества запасных серверов для нагрузки, которую сервер может обработать. Как только я выяснил причину проблемы, я решил ее, и с тех пор сервер не вышел из строя.