Упорядочить ресурсы сервера так, чтобы ssh всегда был доступен

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

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

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

5
задан 3 November 2015 в 10:39
4 ответа

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

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

2
ответ дан 3 December 2019 в 01:24

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

Вы также можете изучить установку 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
5
ответ дан 3 December 2019 в 01:24

Одно из простых решений - изменить ваш 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 .

0
ответ дан 3 December 2019 в 01:24

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

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

0
ответ дан 3 December 2019 в 01:24

Теги

Похожие вопросы