[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: fork and memory protection



On Sat, 28 Aug 2004 19:05:16 +0400
Alexander Danilov <alex@fssg.st-oskol.ru> wrote:

> Gossen Alexey wrote:
> > Добрый день, господа.
> > 
> > 
> > Как настроить систему наилучшим способом, которую не смогла бы
> > завалить следущая програма:
> > 
> > 
#include <stdio.h> 
#include <sys/types.h>
#include <unistd.h>
int main(){
	while(fork()){
 	}
 
 	while(1){
 		malloc(1024);
 	}
}
> > 
> > 
> > Запускается это, естественно, с _пользовательскими_ правами. С самым
> > низким приоритетом - nice +19.
> > 
> > Если какая-нибудь програма начинает некотролируемо жрать оп. память,
> > как в данном случае делает дочерний процесс, ядро эту програму без 
> > особых проблем пришибает. Если програму форкануть, неважно где, пойд
> > ётдаже скрипт на bash или способом, описанным выше, система за неско
> > лькосекунд наглухо виснет.
> > 
> > 
> > Т.е. само ядро не виснет, оно и дальше прибивает процессы, о чём
> > свидетельствуют идущие на виртуальную tty консоль логи ядра. Но это
> > ужеборьба с ветрянными мельницами. Слышен лишь треск работающег hdd
> > - насилуется своп раздел. На этом этапе понимаешь, что не зря была
> > изобретена кнопка reset ;-)
> > 
> > Итого нужно
> > 1) Ограничить возможное количество дочерей / внучек / правнучек одно
> > гопроцесса. Потому как можно клонировать процесс не только параллель
> > но, как на примере выше, но и последовательно. Какой параметр был бы
> > дляэтого подходящим?
> > 
> > 2) Ограничить максимальную выдачу оперативной памяти одному процессу
> > илиоставить Н.З., который может быть использован только програмами с
> > UID 0. ulimit на последнее, например, не годится.
> > 
> > 3) Что нибудь ещё.
> > 
> > 
> > Если существует несколько альтернативных решений, какое бы вы из них
> > выбрали и почему?
> > 
> 
> в PAM'е возможно ограничивать и память и кол-во процессов.
> 
отредактировал /etc/pam.d/login.conf и соответственно
/etc/security/limits.conf

по-видимому, после логина вызывается ulimit с соответствующими
аргументами и выставляются заданные права

единственное, что вся эта пляска приносит, это ограничение максимального
количества выполняемых процессов

сейчас после запуска программы компьютер не виснет, но выглядит всё
как-то пасмурно

т.е. логинюсь на первую vc,
набираю killall имя_программы, переключаюсь на вторую, запускаю саму
програму, откатываюсь обратно на первую vc и давлю enter. с этого
момента длится эдак минуты две, пока до системы "доходит" выполнить
killall и поприбивать всё нафиг.

не смотря на какие-либо ограничения (пробовал даже смешные 10 мегабайт)
памяти, память расходуется этим пользователем вся, что я абсолютно не
могу понять

$ ulimit -a | grep memory
max locked memory     (kbytes, -l) 10240
max memory size       (kbytes, -m) 10240
virtual memory        (kbytes, -v) 10240


-- 
Guten Tag, Alexey



Reply to: