Как ограничить использование ресурсов, чтобы сэкономить CPU + RAM для определенного процесса?

25

У меня есть сервер разработки, на котором sshdиногда перестает работать, потому что машине не хватает оперативной памяти. Да, у нас не хватает памяти, и обновление сейчас неосуществимо. Я хочу сказать машине: «Делай, что хочешь, но оставь 20 МБ и немного процессора sshd!».

Как это можно сделать?

phunehehe
источник
Sshd не должен так взрываться, это обычно очень хорошо ведущий себя демон. Убедитесь, что он обновлен до последней / самой лучшей. Что ты с этим делаешь? Вы пропускаете через него огромные данные?
Марчин
2
@ Марчин Я не думаю, что я делаю что-то большое, редактирование текста. Даже если бы sshdон вел себя хорошо, я думаю, что он застрял бы, если бы не хватало CPU / RAM для использования, не так ли?
phunehehe
Когда у Linux не хватает памяти, он начинает убивать процессы, чтобы восстановить память. Возможно, вы видите OOM в действии (нехватка памяти). Я не знаю, почему он решил последовательно убивать ваш sshd. Вы когда-нибудь видели, чтобы sshd действительно ужасно протекал (увеличивался в размерах) до того, как он взорвался, или он прекрасно работает в одно мгновение, а в следующий раз мертв?
Марчин
@ Скорее всего, Марцин, если он ООМ, система так сильно зависает, что sshd просто не может ответить, это не проблема sshd, а проблема с его загрузкой. К сожалению, я не знаю ответа на это.
ксенотеррацид
@phunehehe вы уверены, что проблема не в памяти для SSH, а не ваша нагрузка через крышу? sshd выдает ошибки? какая нагрузка на коробку? и что заставляет систему исчерпать память.
ксенотеррацид

Ответы:

9

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

Я полагаю, что вы поставили бы все свои ресурсоемкие задачи в ограниченном режиме (ЦП и ОЗУ) cgroupи оставили бы sshd«снаружи», чтобы это не ограничивалось.

(Добавление дополнительного свопа, даже в виде файла подкачки, может быть хорошим вариантом.)

Мат
источник
Я все еще колеблюсь, это выглядит нелегко (испорчено Ubuntu).
phunehehe
о, это конечно не просто :-) Добавить своп намного проще.
Мат
@phunehehe добро пожаловать в Sys Admin, это не легко. Но теперь вам нужно научиться делать нелегкие вещи.
ксенотеррацид
6

О, но cgroups легки :) Установите пакет libcgroup. Создайте /etc/cgconfig.conf:

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

Запустите cgconfigпроцесс, который создаст иерархию, cgroups и установит ограничения. Если это удастся, у вас есть две cgroups, каждая из которых имеет 50% назначенного ЦП и 1 ГБ доступной памяти (не знаю, каков ваш фактический объем доступной памяти; в этом примере предполагается, что это 2 ГБ). Теперь вам просто нужно переместить все задачи (т.е. все процессы, работающие в системе) из корневой группы в группу nosshd:

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

Тогда вам просто нужно получить PID sshdпроцесса и переместить его в файл задач sshd:

cgroup]# echo $PID >> sshd/tasks

Та-да, все готово. Теперь вы можете быть уверены, что у sshd всегда будет 50% ЦП и 1 ГБ памяти.

mart1n
источник
1

Используйте reniceдля получения более высокого приоритета sshdили проверьте учет. (acct) -> с этим вы можете установить ресурсы для пользователей, поэтому запустите sshd с s

MSpike
источник
Я бы добавил ioniceк этому тоже, и, вероятно, запустил sshd с nice, не используя его позже.
ксенотеррацид
1

Более общее решение проблемы использования ресурсов приложения - запуск приложений в контейнере с помощью Docker . Затем вы можете запускать контейнеры с ограничениями использования ЦП и памяти, аналогично cgroups.

docker run -c=10 -m=1g my-container
Шон Фудзивара
источник