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

Организуйте ресурсы сервера так, чтобы ssh всегда был доступен

У меня есть Linux-сервер для одного из моих веб-приложений. Время от времени процесс (возможно, длительный сценарий) может выходить из-под контроля, потреблять слишком много циклов памяти / процессора и блокировать все другие процессы.

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

Можно ли организовать ресурсы на Linux-машине так, чтобы, несмотря на то, что процесс потребляет ресурсы, всегда было достаточно ресурсов для ssh-соединения?

Вы можете использовать «красиво» для определения приоритета определенного программного обеспечения.

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

Конфигурация monit в этих строках автоматически перезапустит Apache:

check process apache
   with pidfile "/usr/local/apache/logs/httpd.pid"
   start program = "/etc/init.d/httpd start" with timeout 60 seconds
   stop program = "/etc/init.d/httpd stop"
   if 2 restarts within 3 cycles then timeout
   if totalmem > 100 Mb then alert
   if children > 255 for 5 cycles then stop
   if cpu usage > 95% for 3 cycles then restart
   if failed port 80 protocol http then restart
   group server
   depends on httpd.conf, httpd.bin

По-простому - нет. Ты можешь использовать nice чтобы установить SSH на высший приоритет, но если памяти недостаточно для обработки нового соединения, ssh не будет работать (не забывайте, что после успешного входа в систему сервер должен запустить оболочку). Вы можете использовать OOM killer для автоматического уничтожения процесса со слишком большим количеством потребляемой оперативной памяти, но это не сработает, если у вас будут тысячи процессов (например, сумасшедшее разветвление apache), и каждый потребляет немного ОЗУ (1000 x 4 МБ ОЗУ = 4 ГБ ОЗУ потребляется без ограничения OOM).

Жесткий перезапуск - самое простое и быстрое решение. Если вам нужно, чтобы некоторые службы работали круглосуточно, без выходных, вам нужно использовать две машины в настройке высокой доступности. Вы можете использовать zabbix или другой инструмент мониторинга для предупреждения и успеть решить проблему до того, как весь сервер выйдет из строя.

Одно простое решение - изменить ваш sshd-процесс на -20. Это может привести к тому, что он не отвечает, если он не может выполнить форк (то есть слишком много процессов или так мало памяти), и он будет медленным, если его необходимо перезагрузить из подкачки, но это значительно снижает вероятность. Это также имеет побочный эффект, заключающийся в том, что каждый вход в систему ssh будет иметь приоритет -20, и - если вы не будете осторожны - каждый процесс, запущенный из оболочки ssh, будет иметь такой высокий приоритет. Вы можете этого захотеть, а можете и не захотеть.

Существует также способ полностью отключить подкачку для процесса, но вам нужно будет исправить свой sshd, чтобы это вызвало mlockall или madvise, но вы, вероятно, не захотите этого делать. Видеть https://stackoverflow.com/questions/578137/can-i-tell-linux-not-to-swap-out-a-particular-processes-memory для подробностей.

Ты можешь использовать группы памяти чтобы гарантировать, что Apache и создаваемые им процессы не могут истощить остальную систему памяти. Система, вероятно, перестает отвечать, потому что Apache потребляет достаточно памяти, чтобы система начала подкачку.

Вы можете настроить обрезки с помощью cgcreate, cgset, cgclassify и cgexec инструменты.